nginx が Web サーバーおよびプロキシ サーバーであることはわかっています。通常、プロキシ サーバーまたは負荷分散ソフトウェアで動作します ( Amazon Elastic Load Balancer (ELB) の背後にある Haproxy 。
最初に、クライアントはプロキシ サーバーまたは負荷分散ソフトウェアへのリクエストを開始し、その後リクエストは実際の Web アクセスのために nginx に転送されます。
複数のソフトウェア層を通過しているため、IP アドレス、ポート番号などのクライアントに関する一部の情報が隠されている可能性があり、問題分析やデータ統計に悪影響を及ぼします。私たちは実際の IP を取得したいと考えています。正確なリクエスト環境を取得するには、クライアントのアドレスを取得します。
この場合、PROXY プロトコルを使用する必要があります。
上記のプロキシまたは LSB が PROXY プロトコルを実装している場合、それがHTTP または SSL 、HTTP/2、SPDY、WebSocket または TCP プロトコルの場合、nginx はクライアントの元の IP アドレスを取得し、元の IP アドレスに基づいて、悪意のある IP からのアクセスのブロックや異なる言語の表示などの特別な操作を実行できます。または、異なる IP に基づくページ、またはより単純なロギングと統計などが非常に効果的です。
もちろん、PROXY プロトコルをサポートしたい場合は、nginx バージョンの要件もあります。バージョン要件は次のとおりです:
PROXY プロトコル v2 をサポートするには、NGINX Plus R16 または NGINX Open Source 1.13.11 が必要です。 HTTP の ROXY プロトコルをサポートするには、NGINX Plus R3 または NGINX オープン ソース 1.5.12 が必要です。
TCP クライアント側の PROXY プロトコルをサポートするには、NGINX Plus R7 または NGINX オープン ソース 1.9.3
TCP の PROXY プロトコルをサポートするには、NGINX Plus R11 または NGINX オープンソース 1.11.4 が必要です。
nginx では、対応するクライアント情報は、次の変数を通じて取得できます。具体的には次のようになります。
$remote_addr と $remote_port は、ロード バランサーの IP アドレスとポートを表します。
RealIP 拡張モジュールを使用する場合、このモジュールは $remote_addr と $remote_port の 2 つの値を書き換えて、元のクライアントの IP アドレスとポート番号に置き換えます。
次に、$realip_remote_addr と $realip_remote_port を使用して、ロード バランサーの IP アドレスとポートを表します。
RealIP 拡張モジュールでは、$proxy_protocol_addr と $proxy_protocol_port の意味は変更されず、元のクライアントの IP アドレスとポート番号のままです。
nginx でのプロキシ プロトコルの構成と使用
nginx でのプロキシ プロトコルの基本的なアプリケーションについては上で説明しましたが、nginx で具体的な構成を実行する方法について説明します。
nginx がすでにプロキシ プロトコルをサポートするバージョンである場合、プロキシ プロトコルを有効にするのは非常に簡単で、サーバーのリッスンに proxy_protocol を追加するだけです。以下に示すように:
http { #... server { listen 80 proxy_protocol; listen 443 ssl proxy_protocol; #... } } stream { #... server { listen 112233 proxy_protocol; #... } }
上記の構成により、nginx は tcp/udp プロトコルと http/https プロトコルの両方でプロキシ プロトコルをサポートできます。
Real-IP モジュールの使用
Real-IP モジュールは nginx に付属するモジュールです。次のコマンドを使用して、nginx に real-ip モジュールがインストールされているかどうかを確認できます。
nginx -V 2>&1 | grep -- 'http_realip_module' nginx -V 2>&1 | grep -- 'stream_realip_module'
$ ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-pcre=../pcre-8.44 --with-zlib=../zlib-1.2.11 --with-http_ssl_module --with-stream --with-mail
--with-http_realip_module
次に、プロキシまたは SLB の IP アドレスを実際のクライアントのアドレスに置き換える必要があります。その後、次のように使用できます。
server { #... set_real_ip_from 192.168.1.0/24; #... }
リクエスト転送
http ブロックかストリーム ブロックかにかかわらず、後続のアップストリーム転送では、アップストリームの場合、プロキシまたは slb アドレスの代わりに実際のクライアント IP アドレスを受信することを希望するリクエストの方向が発生する可能性があります。これは、次の設定で解決できます:
http { server { #... real_ip_header proxy_protocol; } }
http { proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-For $proxy_protocol_addr; }
http ストリームの設定方法が異なります。
ログ
以下に示すように、変数 $proxy_protocol_addr を使用して、http ブロックとストリーム ブロックに対応するログを記録できます。
以上がnginx でプロキシ プロトコルを構成して使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。