Nginx 仮想ホストで再利用ポートを使用する正しい方法

Nginx 仮想ホストで再利用ポートを使用する正しい方法

gunicorn アプリケーション サーバー (Django アプリ) で nginx をリバース プロキシとして使用します。

私の nginx 仮想ホスト ファイルには、2 つのブロックがありますserver。前者はwwwトラフィックを後者 (トラフィックを処理する) にnon-wwwリダイレクトしますhttps

具体的には、以前の場所ブロックは次のとおりです。

server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

後者のロケーション ブロックは次のとおりです。

server {

    server_name example.com;
    listen 443 ssl http2 reuseport;
    listen [::]:443 ssl http2 reuseport;

    # other directives here
}

reuseport後者のブロックでのの使用に注意してください。

両方のブロックを入力するとreuseport、エラーが発生します: nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/vhost:62

前者のブロックにのみ挿入すると機能します。前者のブロックと後者のブロックのどちらに正しく配置するかで迷っています。誰か明確に説明してもらえますか?


このreuseportパラメータは、nginx に各ワーカー プロセスごとに個別のリスニング ソケットを作成するように指示し、カーネルがワーカー プロセス間で着信接続を分散できるようにする (クライアントとサーバー間で送信される複数のパケットを処理する) ことを理解しています。

reuseportしかし、それだけでは、前述の両方のブロックで使用できない理由や、どちらで使用すればよいのか(1 つのブロックでしか使用できないことを考慮すると)はわかりません。

答え1

NGINX では、ネットワーク ソケットの listen オプションを設定で 1 回だけ指定すると、server同じソケット (ポート) で listen する他のすべての設定済み に「適用」されます。引用ドキュメント:

listen ディレクティブには、ソケット関連のシステム コールに固有の追加パラメータがいくつか指定できます。これらのパラメータは、任意の listen ディレクティブで指定できますが、特定のアドレス:ポートのペアに対して 1 回だけ指定できます。

したがって、エラー メッセージから解読する必要があるのは、一意のアドレス + ポートreuseportごとに 1 回だけ指定する必要があるということです。listen

どちらでserver行うかは好みによります。ただし、原則として、また明確にするために、次のいずれかのserverディレクティブdefault_serverを指定することをお勧めします。

存在する場合、サーバーは指定されたアドレス:ポートのペアのデフォルト サーバーになります。どのディレクティブにも default_server パラメーターがない場合は、アドレス:ポートのペアを持つ最初のサーバーがこのペアのデフォルト サーバーになります。

次に、そのサーバー ブロック ( を指定した場所) に listen オプションを配置しますdefault_server

例えば

server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

server {

    server_name example.com;
    listen 443 ssl http2 default_server reuseport;
    listen [::]:443 ssl http2 default_server reuseport;

    # other directives here
}

関連情報