NGINX リバースプロキシ


NGINX リバースプロキシ

このセクションではプロキシサーバの基本的な設定を説明します。以下のようなやり方を学ぶでしょう:

  • NGINXからプロキシされたサーバへ異なるプロトコルを使ってリクエストを渡します
  • プロキシされたサーバへのクライアントのリクエストヘッダを変更する
  • プロキシされたサーバからのリスポンスのバッファリングを設定する

プロキシとは一般的にいくつかのサーバの間で負荷を分散したり、異なるwebサーバからのコンテンツを継ぎ目無く表示したり、あるいは処理のためにアプリケーションへHTTP以外のプロトコルでリクエストを渡すために使われたりします。

プロキシされたサーバへリクエストを渡す

NGINXがリクエストをプロキシする場合、リクエストを特定のプロキシされているサーバへリクエストを送信し、リスポンスを取得し、そしてクライアントへその応答を送り返します。指定されたプロトコルで、HTTPサーバ(他のNGINXサーバまたは他のどのようなサーバ)またはHTTPでは無いサーバ(PHPやPythonのような特定のフレームで作られたアプリケーションを実行)にリクエストをプロキシすることができます。サポートされているプロトコルには、FastCGI, uwsgi, SCGIそして memcachedが含まれます。

リクエストをHTTP プロキシされたサーバに送るには、loctionの中にproxy_pass ディレクティブを指定します。例えば:

location /some/path/ {
    proxy_pass http://www.example.com/link/;
}

この例の設定では、このlocationで処理される全てのリクエストは指定されたアドレスのプロキシされたサーバへ渡されます。このアドレスはドメイン名またはIPアドレスとして指定することができます。アドレスにはポート番号を含むことができます:

location ~ \.php {
    proxy_pass http://127.0.0.1:8000;
}

上の最初の例では、プロキシされているサーバのアドレスの後ろにURI/link/があることに注意してください。アドレスに加えてURIが指定された場合は、locationパラメータに合致するリクエストURIの一部が置き換えられます。例えば、/some/path/page.html URIというリクエストは、http://www.example.com/link/page.htmlにプロキシされるでしょう。アドレスがURIなしで指定された場合や、置き換えるURIの一部が決定できない場合は、リクエストの完全なURIが渡されます(おそらく、修正されているでしょう。)

HTTPでは無いプロキシされるサーバへリクエストを渡す場合は、適切な **_pass ディレクティブが使われるべきです:

  • fastcgi_pass リクエストをFastCGIサーバに渡す
  • uwsgi_pass リクエストをuwsgiサーバに渡す
  • scgi_pass リクエストをSCGIサーバに渡す
  • memcached_pass リクエストをmemcachedサーバに渡す

これらの場合は、アドレスを指定するための規則が異なるかも知れないことに注意してください。またサーバに追加のパラメータを渡す必要があるかも知れません(詳しくはリファレンスドキュメントを見てください)。

proxy_pass ディレクティブはサーバのnamed group を指定することもできます。この場合には、リクエストは指定されたメソッドに従って、グループの中のサーバの間で分散されます。

リクエストヘッダを渡す

デフォルトでは、NGINXはプロキシされたリクエストの二つのフィールド "Host" と "Connection" を再定義し、値が空文字のヘッダフィールドを削除します。"Host" は、$proxy_host_variable に設定され、"Connecton"は close に設定されます。

これらの設定を変更するには、他のヘッダフィールドを変更するのと同様に、proxy_set_header ディレクティブを使います。このディレクティブは locationまたはそれより上位で指定することができます。特定のserverコンテキストまたはhttpブロックで指定することもできます。例えば:

location /some/path/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://localhost:8000;
}

この設定は、"Host"フィールドは $host変数が設定されます。

ヘッダフィールドが プロキシされるサーバに渡される事を防ぐには、以下のように空の文字列を設定します:

location /some/path/ {
    proxy_set_header Accept-Encoding "";
    proxy_pass http://localhost:8000;
}

バッファの設定

デフォルトでは、NGINXはプロキシされたサーバからの応答をバッファします。応答は内部バッファに格納され、全ての応答を受け取るまでクライアントに送信されません。バッファリングは、もしNGINXからクライアントまで同期して渡されるならばプロキシされているサーバの時間を浪費することになる遅いクライアントのパフォーマンスを改善することに役立ちます。しかし、バッファリングを有効すると、NGINXはクライアントがダウンロードに必要とする時間だけ応答を格納する一方で、NGINXによってプロキシされたサーバがすばやく応答を処理することができます。

バッファリングの有効、無効に責任があるディレクティブはproxy_bufferingです。デフォルトでは、onに設定されていて、バッファリングが有効です。

proxy_buffers ディレクティブは、リクエストあたりに割り当てられるバッファのサイズと数を制御します。プロキシされたサーバからの応答の最初の部分は分離されたバッファに格納されます。そのサイズは proxy_buffer_size ディレクティブで設定されます。この部分は通常比較的小さな応答ヘッダを含んでおり、応答の残りの部分のためのバッファに比べて小さくすることができます。

次の例では、バッファのデフォルトの数を多くし、応答の最初の部分のためのバッファのサイズはデフォルトより小さくされています。

location /some/path/ {
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_pass http://localhost:8000;
}

バッファリングが無効の場合は、プロキシされているサーバからの応答を受け続けている間、レスポンスがクライアントに同期して送信されます。この挙動はできる限りすぐに応答を受け取る必要がある高速な双方向のクライアントにとって望ましいものでしょう。

特定のlocationでバッファリングを無効にするには、locationの中で off パラメータを付けてproxy_buffering ディレクティブを配置します。

location /some/path/ {
    proxy_buffering off;
    proxy_pass http://localhost:8000;
}

この場合、NGINXは応答の現在の部分を格納するためにproxy_buffer_size で設定されたバッファのみを利用します。

TOP
inserted by FC2 system