Nginxを使用して、他のWebサイト言語をその場で変換および翻訳します








最初の投稿で、 Apache Traffic Serverをキャッシングリバースプロキシとして使用することを説明しました。 レビューでは、なぜnginxではないのですか? ATSはまだサイトのコンテンツを変換する便利な方法を見つけられなかったので、私はNginxの機能を調べることにしました。 問題を解決するために、私はドキュメンテーションのジャングルに深く入り込まなければなりませんでした。



前回同様、 example.comexample.ruに変換します 。 Nginxの構成とインストールについては説明しません(これについては多くの記事があります)が、特定の有用な設定については説明します。



グローバル構成-nginx.conf

worker_processes 4; #    ,      # cat /proc/cpuinfo | grep processor | wc -   http { resolver 127.0.0.1; #    .        reverse proxy.  127.0.0.1   DNS   .   ,     ,            .     resolver  .  DNS        ! include options.conf; include mime.types; #      ,  , -,  iso-8859-1.   - ,    ,  UTF-8. charset utf-8; override_charset on; source_charset iso-8859-1; charset_map iso-8859-1 utf-8 { } #  charset_map - ,     !     charset_map iso-8859-1 _ { }    . #    . ?     ! proxy_cache_path /usr/local/nginx/proxy_temp/ levels=1:2 keys_zone=cache-zone:10m inactive=10m max_size=1000M; #    proxy_store_access user:rw group:rw all:r; #   proxy_cahe  proxy_store        ,        .           . #      … include example.conf; }
      
      





仮想サーバーのセットアップ-example.conf

 server { listen 80; server_name example.ru; access_log logs/example.ru.access.log main; error_log logs/example.ru.error.log; index index.html; root /usr/local/nginx/html/example.ru; #    : rewrite ^/(/broken_page.*) http://www.example.com/$1 permanent; #     “” ,     Nginx    reverse-proxy.      ,       ,      404.  .    Nginx  Pop-up     . #    ! #   /img/      URI    .  . location ^~ /img/ { #    ?   ,     ! root /usr/local/nginx/html/example.ru; #  ! try_files $uri $uri/ @static; } #      ,                   ,   ,   ,     @static,     .        ()   , ,  ,          .     ,         -. #   : location @static { proxy_pass http://super-cdn.com$uri; #       ,  1-2     .         : http://super-cdn.com/img proxy_store /usr/local/nginx/html/${uri}; expires max; # expires max -    ,        .                  .    ,      .   (  ,  )         nginx -s reload.          firebug     .     Nginx. #      ! access_log logs/2.access.log; error_log logs/2.error.log debug; } #      . location / { include example-transform.conf; #    proxy_pass http://www.example.com; #   proxy_redirect off; proxy_cache cache-zone; #        ? proxy_cache_min_uses 2; proxy_cache_valid 200 1h; #           : proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
      
      







元のサイトの写真は次の場所にあることを覚えています。
  http://super-cdn.com/img 




ただし、上記の構成を実行すると、Nginxがフォームのすべてのリンクを残したことがわかります。
  = http://super-cdn.com/img/* 
プロキシ化されていません。 これはドメインの違いによるものであることは明らかです。 また、この状況では、ユーザーが私たちを迂回してCDNから直接それらを取得するため、翻訳された写真をスリップする機会がないことも明らかです。 したがって、変換の魔法が必要です!



example-transform.confを開きます

 sub_filter 'http://super-cdn.com/img/' 'http://example.ru/img/' ; sub_filter_once off;
      
      







デフォルトでは、変換モジュールはコンパイルされていません! パラメータが必要:

  ./configure --with-http_sub_module
      
      







コンパイル、再起動...ビンゴ!!! ファンファーレ!!!

すべてが機能し、すべてが飛ぶ、外出先で写真を交換できます。



ページのコンテンツを置き換えるための最初のルールを喜んで追加し、... http_sub_moduleモジュールを使用すると、たった1つの置き換えを実行できるという衝撃的な情報を見つけました!



ああ、イゴール・シソエフ、なぜあなたはドキュメンテーションのページにこの恐ろしい事実を隠したのですか!

sysoev.ru/nginx/docs/http/ngx_http_sub_module.html



ああ、最初にそのようなフィナーレを知っていたなら! しかし...やめて! 感情はさておき、ロシア人と中国人は永遠に兄弟だからです! 単純な中国人のWeibin Yaoはすでに問題を解決し、substitutions4nginxモジュールを作成しました。

code.google.com/p/substitutions4nginx



指示に従ってモジュールをインストールし、変換構成を開いて大胆に書きます:



 subs_filter 'http://super-cdn.com/img/' 'http://example.ru/img/' g; subs_filter '<title[^>]*>(.*?)</title>' '<title>        . !</title>' oir;
      
      





あとがきの代わりに

1.構成はワーカーから作成されましたが、明らかな理由でライブでチェックされませんでした。 何か問題がある場合は私がお手伝いします。



2. Nginxは、非標準のほとんど探索されていないモードで動作します。 ここにそのようなバグがあります。



3. substitutions4nginxモジュールは実行されていません。1つのバグがすぐに見つかり、すぐに修正されました。 どうやらテスターの群衆が必要です。



4. Apache Traffic ServerとNginxで、同じバグが見つかりました。 改行を含むhrefのようなリンクを持つタグはソースされません。 問題はPCREライブラリに起因していると思われます。



Z.Y. 2番目のブロックで、ソースlang =「bash」の強調表示が機能しない理由を教えてください。それは良いことです。



Z.Z.Y. 強調表示の問題を特定したため、パーサーはコードを中断します。

  :// 
構成に不要なエラーを導入しないように、強調表示せずにユニットを残します。



All Articles