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
}