NginxでデュアルスタックIPv4およびIPv6仮想ホストを処理するためのさまざまな構成例を見てきました。多くの人がこのパターンを提案しています:
listen 80;
listen [::]:80 ipv6only=on;
私が見る限り、これは次のものとまったく同じことを達成します:
listen [::]:80 ipv6only=off;
なぜ前者を使うのですか?私が考えることができる唯一の理由は、たとえばIPv4でdeferred
のみを設定したい場合など、各プロトコルに固有の追加のパラメーターが必要な場合です。
それはおそらく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;
単一の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変換をチェックします。ブラックリスト。
とともに ipv6only=off
構成スタイルIPv4アドレスは、たとえば、ログファイル、環境変数(REMOTE_ADDR)などで(ソフトウェアのみ) IPv4にマップされたIPv6アドレス を使用してIPv6アドレスとして表示される場合があります。
私の理解(そして http://nginx.org/en/docs/http/ngx_http_core_module.html#listen のドキュメントによれば)を使用して
listen 80;
...同じポートでIPv4とIPv6の両方のトラフィックをチャネリングする場合は、これで十分です。
listen [::]:80 ipv6only=off;
スニペットを使用してサイトにIPv6サポートを追加しているときに遭遇した厄介な問題の1つは、vhostにIPv6サポートを追加し、default_serverが80
と[::]:80
の両方をリッスンするようにすでに構成されていることです。
nginx
は、アドレスがすでに使用されていると非難し、開始を拒否しました!
魔法のlisten [::]:80 ipv6only=off;
を2つの従来のlisten
行で置き換えると、nginx
を正常に開始できます。
手動設定ではlisten [::]:80 ipv6only=off;
が便利かもしれませんが、自動設定システムで使用すると厄介な問題が発生する可能性があります。