ホームページ  >  記事  >  運用・保守  >  nginx でプロキシ プロトコルを構成して使用する方法

nginx でプロキシ プロトコルを構成して使用する方法

王林
王林転載
2023-05-18 08:47:262800ブラウズ

    プロキシ プロトコルは nginx に適用されます

    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 では、対応するクライアント情報は、次の変数を通じて取得できます。具体的には次のようになります。

    • $proxy_protocol_addr と $proxy_protocol_port は、それぞれ元のクライアントの IP アドレスとポート番号を表します。

    $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 でプロキシ プロトコルを有効にする

    nginx がすでにプロキシ プロトコルをサポートするバージョンである場合、プロキシ プロトコルを有効にするのは非常に簡単で、サーバーのリッスンに proxy_protocol を追加するだけです。以下に示すように:

    http {
        #...
        server {
            listen 80   proxy_protocol;
            listen 443  ssl proxy_protocol;
            #...
        }
    }
       
    stream {
        #...
        server {
            listen 112233 proxy_protocol;
            #...
        }
    }

    http ブロックの方がよく知られており、nginx では http/https のサポートを表します。 Nginx は TCP/UDP プロトコルのサポートを提供しますが、この機能はストリーム モジュールを通じて実装されますが、これは多くの人にとって比較的馴染みのないものです。

    上記の構成により、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'

    現在使用しているバージョンに実際の IP がない場合でも、心配する必要はありません。この時点でソース コードからコンパイルする必要がある場合があります。

    コンパイル プロセス中に、configure コマンドを実行する必要があります。このconfigure コマンドでは、stream や http_ssl_module など、有効にする機能を指定できます。 real-ip 機能を有効にする場合は、次を追加できます:

    $ ./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

    nginx が SLB またはプロキシの背後で実行されている場合は、次のように set_real_ip_from コマンドを使用してプロキシまたはロード バランシング サーバーの IP 範囲を指定できます。 ##
    --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 ストリームの設定方法が異なります。

    ログ

    ログは非常に重要な機能です。問題の特定やデータの統計分析の実行に非常に役立ちます。もちろん、必要なのは実際のクライアント IP アドレスです。

    以下に示すように、変数 $proxy_protocol_addr を使用して、http ブロックとストリーム ブロックに対応するログを記録できます。

    以上がnginx でプロキシ プロトコルを構成して使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。