オンザフライでnginxによってプロキシされているデータを変更する


9

私は外部ホストからリクエストを受け取り、内部サーバーにそれらをプロキシするnginxセットアップを持っています。

構成は次のようになります。

server {

        listen 10.0.0.66:443;

        server_name my.example.com;

        root /websites/my.example.com

        ssl on;
        ssl_certificate /websites/ssl/my.example.com.crt;
        ssl_certificate /websites/ssl/my.example.com.key;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;

        location / {
                proxy_pass https://10.0.0.100:3000/;
        }
}

実験/テストの目的で、内部ホストが任意のバイナリを通じて応答したものを実行し、バイナリが応答したもので応答できるようにしたいと思います。

以下の場合の例、私が代理で縮小化HTMLに望んでいた場合、私はhtmlcompressorを介してサーバの応答を実行しますし、クライアントへのプロキシの応答として出力を送ります。最終結果は、エンドクライアントが縮小されたhtmlを取り戻すことになります。

ローカルで提供されるデータに対してこれを実現するnginxにはあらゆる種類のアドオンと例があることを知っていますが、プロキシ用にそれを設定する方法は?


明確にするために。nginxがリクエストをプロキシサーバーに転送し、レスポンスを受信して​​圧縮し、ユーザーに転送するようにしますか?nginxでサーバーとユーザーの中間で処理したいですか?
sjdaws 2013

@sjdaws。必ずしも圧縮する必要はありませんが、任意のプログラムで実行し、クライアントに送信されるものとして出力を使用します。つまり、本質的には、サーバーからクライアントへの出力を変更したいのです。
0x6A75616E 2013

回答:


10

そのためnginx、クライアントからバックエンドサーバーにリクエストをプロキシし、バックエンドの応答をクライアントに返す前に、そのような応答を別の外部プロセッサにパイプしますか?

nginxIgor SysoevとNginx、Incが現在提供している公式モジュールでは、上記のことはできないと思います。応答の本文を変更するために利用できる最も近いものは、nginxに付属するいくつかのフィルターモジュールですがadd_before_bodyadd_after_bodyおよびsub_filterディレクティブを含め、デフォルトではオフになっています。

http://nginx.org/en/docs/http/ngx_http_addition_module.html
http://nginx.org/en/docs/http/ngx_http_sub_module.html

また、おそらくgzip on;あなたが実際に代わりに望んでいるものですか?

http://nginx.org/en/docs/http/ngx_http_gzip_module.html

または、潜在的に、perl完全に実験的なモジュールを知っていて実行したい場合は、デフォルトの設定でオフになっている(やや明らかに)完全に実験的な公式のnginxモジュールを使用して、への埋め込みperlを確認してくださいnginx

http://nginx.org/en/docs/http/ngx_http_perl_module.html

別のオプションは、リクエストをリダイレクトするある種のFast-CGIセットアップを使用することです。この場合、Fast-CGIスクリプトがバックエンドにリクエストを送信し、最後に最終的な処理を実行してから戻ります。 nginxに返信してキャッシュし、ユーザーに返します。

リクエストの本文を変更するproxy_set_body(ただしfastcgi_set_bodyまだではない)こともありますが(クライアントが提供したものからなど)、渡すために応答の本文を取得するための同等のディレクティブまたは変数はないようですポストプロセッサーへの何らかの何らかの後続の要求に。いずれにせよ、フィルターモジュールはおそらくポストプロセッサーに必要なものです。

(また、fork通常の幹部を介して応答をingおよびパイプ処理する素朴なアプローチは、非常に遅くなることを理解していますか?)

要約すると、私gzip on;はまさにあなたが探しているものだと思います。それ以外の場合、元のWebアプリケーションを変更できる場合は、Webアプリケーション自体に何らかのポストプロセッサをインストールすることをお勧めします。これは、次の最も簡単なソリューションのようです。潜在的には、前述のngx_http_addition_filter_module.cなどのフィルターモジュールの実装方法に加えて、ngx_http_gzip_filter_module.cのような明らかに関連するいくつかのフィルターを調べて、独自の埋め込みフィルターモジュールを実装できます。または、Nginx、Inc.を雇ってこれを書いてください!しかし、真剣に、gzip on;うまくいき、手間、パフォーマンス、安定性の問題がなく、より良い結果が得られる可能性が高く、デフォルトですでにコンパイルされているので、有効にする必要があります。nginx.conf


お返事をありがとうございます!私はgzipがオンであることを認識しており、達成しようとしていることは、出力を圧縮するよりも高いレベルです。特定の内部Webサービスへのアクセスを制御するプロキシがあり、google analyticsのようなものを出力に追加したいと思っていました。あなたが言うように、fastcgiはオプションのように聞こえるので、それについて調べます。再度、感謝します!
0x6A75616E 2013

単に何かを追加したり、Googleアナリティクスを追加したりするadd_after_body場合sub_filterは、またはそれがまさに必要です。nginx.org/en/docs/http/ngx_http_sub_module.htmlの例は、まさにそのシナリオを示しています。「</ head>」を「</ head> <script…」に置き換えます。これらのモジュールを有効にするためにnginxを再コンパイルする必要がある場合があります(nginx -Vnginxのコンパイル方法を確認してください)が、それ以外の場合はすでに標準モジュールです。
cnst 2013


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.