Docker and Nginx Reverse Proxy
目次:
リバースプロキシは、クライアントリクエストを受け取り、1つ以上のプロキシされたサーバーにリクエストを送信し、レスポンスをフェッチして、サーバーのレスポンスをクライアントに配信するサービスです。
NGINXは、そのパフォーマンスとスケーラビリティのために、HTTPサーバーと非HTTPサーバーのリバースプロキシとしてよく使用されます。 典型的なリバースプロキシ構成は、NginxをNode.js、Python、またはJavaアプリケーションの前に配置することです。
Nginxをリバースプロキシとして使用すると、いくつかの追加の利点が得られます。
- 負荷分散 -Nginxは負荷分散を実行して、プロキシされたサーバーにクライアントの要求を分散し、パフォーマンス、スケーラビリティ、および信頼性を向上させることができます。 キャッシュ -Nginxをリバースプロキシとして使用すると、ページの事前レンダリングバージョンをキャッシュして、ページの読み込み時間を短縮できます。 プロキシされたサーバーの応答から受信したコンテンツをキャッシュし、それを使用して毎回同じコンテンツについてプロキシされたサーバーに接続することなくクライアントに応答することにより機能します。 SSL終了 -Nginxは、クライアントとの接続のSSLエンドポイントとして機能できます。 着信SSL接続を処理および解読し、プロキシサーバーの応答を暗号化します。 圧縮 -プロキシされたサーバーが圧縮された応答を送信しない場合、クライアントに送信する前に応答を圧縮するようにNginxを構成できます。 DDoS攻撃の緩和 -単一のIPアドレスあたりの着信要求と接続数を通常のユーザーに典型的な値に制限できます。 Nginxでは、クライアントの場所、および「User-Agent」や「Referer」などのリクエストヘッダーの値に基づいてアクセスをブロックまたは制限することもできます。
この記事では、Nginxをリバースプロキシとして構成するために必要な手順の概要を説明します。
前提条件
Ubuntu、CentOS、またはDebianサーバーにNginxがインストールされていることを前提としています。
Nginxをリバースプロキシとして使用する
NginxをHTTPサーバーに対するリバースプロキシとして構成するには、ドメインのサーバーブロック構成ファイルを開き、場所とその中のプロキシサーバーを指定します。
server { listen 80; server_name www.example.com example.com; location /app { proxy_pass http://127.0.0.1:8080; } }
プロキシサーバーのURLは、
proxy_pass
ディレクティブを使用して設定され、プロトコルとして
HTTP
または
HTTPS
を使用し、ドメイン名またはIPアドレス、およびオプションのポートとURIをアドレスとして使用できます。
上記の構成では、すべてのリクエストを
http://127.0.0.1:8080
プロキシサーバーに
/app
場所に渡すようにNginxに指示し
http://127.0.0.1:8080
。
/etc/nginx/sites-available
ディレクトリに保存され、CentOSでは
/etc/nginx/conf.d
ディレクトリに保存されます。
proxy_pass
ディレクティブと
proxy_pass
ディレクティブの
proxy_pass
やすく説明するために、次の例を見てみましょう。
server { listen 80; server_name www.example.com example.com; location /blog { proxy_pass http://node1.com:8000/wordpress/; } }
訪問者が
http://example.com/blog/my-post
にアクセスすると、Nginxはこのリクエストを
http://node1.com:8000/wordpress/my-post
プロキシします。
プロキシされるサーバーのアドレスにURI(
/wordpress/
)が含まれる場合、プロキシされるサーバーに渡されるリクエストURIは、ディレクティブで指定されたURIに置き換えられます。 プロキシされるサーバーのアドレスがURIなしで指定されている場合、完全なリクエストURIがプロキシされるサーバーに渡されます。
要求ヘッダーを渡す
Nginxがリクエストをプロキシするとき、クライアントからのプロキシされたリクエストの2つのヘッダーフィールド
Host
と
Connection
自動的に定義し、空のヘッダーを削除します。
Host
は
$proxy_host
変数に設定され、
Connection
は閉じるように設定されます。
プロキシ接続のヘッダーを調整または設定するには、
proxy_set_header
ディレクティブとヘッダー値を使用します。 使用可能なすべてのリクエストヘッダーとそれらの許可された値のリストは、ここにあります。 ヘッダーがプロキシサーバーに渡されないようにする場合は、空の文字列
""
設定します。
次の例では、
Host
ヘッダーフィールドの値を
$host
変更し、その値を空の文字列に設定して
Accept-Encoding
ヘッダーフィールドを削除しています。
location / { proxy_set_header Host $host; proxy_set_header Accept-Encoding ""; proxy_pass http://localhost:3000; }
構成ファイルを変更するたびに、変更を有効にするためにNginxサービスを再起動する必要があります。
非HTTPプロキシサーバーへのリバースプロキシとしてNginxを構成する
Nginxを非HTTPプロキシサーバーへのリバースプロキシとして構成するには、次のディレクティブを使用できます。
-
fastcgi_pass
-FastCGIサーバーへのリバースプロキシ。uwsgi_pass
-uwsgiサーバーへのリバースプロキシ。scgi_pass
-SCGIサーバーへのリバースプロキシ。memcached_pass
-Memcachedサーバーへのリバースプロキシ。
最も一般的な例の1つは、PHP-FPMのリバースプロキシとしてNginxを使用することです。
server { #… other directives location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.2-fpm.sock; } }
一般的なNginxリバースプロキシオプション
HTTPSを介したコンテンツの提供は、今日では標準となっています。 このセクションでは、推奨されるNginxプロキシパラメーターとヘッダーを含むHTTPS Nginxリバースプロキシ構成の例を示します。
location/ { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_cache_bypass $http_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; }
-
proxy_http_version 1.1
プロキシ用のHTTPプロトコルバージョンを定義します。デフォルトでは1.0に設定されています。 Websocketおよびkeepalive
接続の場合、バージョン1.1を使用する必要があります。proxy_cache_bypass $http_upgrade
応答がキャッシュから取得されない条件を設定します。Upgrade $http_upgrade
およびConnection "upgrade"
-アプリケーションがWebsocketを使用している場合、これらのヘッダーフィールドは必須です。Host $host
次の優先順位の$host
変数には、要求行からのHost
名、Host
要求ヘッダーフィールドからのHost
名、または要求に一致するサーバー名が含まれます。X-Real-IP $remote_addr
実際の訪問者のリモートIPアドレスをプロキシされたサーバーに転送します。X-Forwarded-For $proxy_add_x_forwarded_for
クライアントがプロキシされたすべてのサーバーのIPアドレスを含むリスト。X-Forwarded-Proto $scheme
-HTTPSサーバーブロック内で使用すると、プロキシサーバーからの各HTTP応答はHTTPSに書き換えられます。X-Forwarded-Host $host
クライアントが要求した元のホストを定義します。X-Forwarded-Port $server_port
クライアントによって要求された元のポートを定義します。
結論
Nginxをリバースプロキシとして使用する方法を学習しました。 また、追加のパラメーターをサーバーに渡し、プロキシされた要求のさまざまなヘッダーフィールドを変更および設定する方法も示しました。
nginx