web-dev-qa-db-ja.com

nginxでIPv4とIPv6の個別のlistenディレクティブが必要ですか?

NginxでデュアルスタックIPv4およびIPv6仮想ホストを処理するためのさまざまな構成例を見てきました。多くの人がこのパターンを提案しています:

listen 80;
listen [::]:80 ipv6only=on;

私が見る限り、これは次のものとまったく同じことを達成します:

listen [::]:80 ipv6only=off;

なぜ前者を使うのですか?私が考えることができる唯一の理由は、たとえばIPv4でdeferredのみを設定したい場合など、各プロトコルに固有の追加のパラメーターが必要な場合です。

73
Synchro

それはおそらくisが最近の前者の構成を使用する唯一の理由についてです。

これが表示される理由はおそらくであり、nginx 1.3.4ではipv6onlyのデフォルトが変更されています。それ以前は、デフォルトはoffでした。新しいバージョンでは、デフォルトでonになります。

これは、LinuxのIPV6_V6ONLYソケットオプション、および他のオペレーティングシステムの同様のオプションとたまたま相互作用するため、デフォルトは必ずしも予測可能ではありません。したがって、IPv4とIPv6の両方で接続を実際にリッスンしていることを確認するには、前者の構成が1.3.4より前に必要でした。

ipv6onlyのnginxのデフォルトへの変更により、デュアルスタックソケットのオペレーティングシステムのデフォルトは無関係になります。現在、nginxは、IPv4、IPv6、またはその両方に明示的にバインドします。デフォルトでは、OSに依存してデュアルスタックソケットを作成することはありません。

実際、1.3.4より前の標準のnginx構成には最初の構成があり、1.3.4以降にはすべて2番目の構成があります。

ただし、デュアルスタックソケットのバインドはLinux専用であるため、現在の構成は最初の例のようになっていますが、ipv6onlyが設定されていないため、次のようになります。

listen [::]:80;
listen 80;
49
Michael Hampton

単一のNginxインスタンスで複数のvhostドメインをホストする場合、単一の結合されたlistenディレクティブを使用できません

listen [::]:80 ipv6only=off;

それらのそれぞれのため。 Nginxには奇妙な癖があり、ipv6onlyパラメータを各ポートに1回ずつ追加しないと、起動に失敗します。つまり、vhostドメインサーバーブロックごとに指定することはできません。

Michaelが述べたように、Nginx 1.3.4以降、ipv6onlyパラメータのデフォルトはonです。

したがって、単一のNginxサーバーでIPv4とIPv6の両方で複数のドメインをホストする場合は、ドメインサーバーブロックごとに2つのlistenディレクティブを使用する必要があります。

listen 80;
listen [::]:80; 

さらに、サンダーが述べたように、ipv6only=offには、IPv4アドレスがIPv6に変換されるという欠点があります。アプリがAkismetやStopForumSpamなどのブラックリストに対してIPチェックを行う場合、これは問題を引き起こす可能性があります。逆変換レイヤーを構築しない限り、アプリはスパマーのIPv4アドレスのIPv6変換をチェックします。ブラックリスト。

67
Jeff Widman

とともに ipv6only=off構成スタイルIPv4アドレスは、たとえば、ログファイル、環境変数(REMOTE_ADDR)などで(ソフトウェアのみ) IPv4にマップされたIPv6アドレス を使用してIPv6アドレスとして表示される場合があります。

16
Sander Steffann

私の理解(そして http://nginx.org/en/docs/http/ngx_http_core_module.html#listen のドキュメントによれば)を使用して

listen 80;

...同じポートでIPv4とIPv6の両方のトラフィックをチャネリングする場合は、これで十分です。

2
fevangelou

listen [::]:80 ipv6only=off;スニペットを使用してサイトにIPv6サポートを追加しているときに遭遇した厄介な問題の1つは、vhostにIPv6サポートを追加し、default_serverが80[::]:80の両方をリッスンするようにすでに構成されていることです。

nginxは、アドレスがすでに使用されていると非難し、開始を拒否しました!

魔法のlisten [::]:80 ipv6only=off;を2つの従来のlisten行で置き換えると、nginxを正常に開始できます。

手動設定ではlisten [::]:80 ipv6only=off;が便利かもしれませんが、自動設定システムで使用すると厄介な問題が発生する可能性があります。