web-dev-qa-db-ja.com

IPv6上のnginx名前ベースの仮想ホスト

Nginxサーバーが6種類近くの異なるWebサイトにサービスを提供しています。 IPv6ネイティブサポート(ダラスデータセンター)を取得したばかりのLinodeで実行されており、私のサイトのほとんどをデュアルスタック操作用に構成しようとしています。私は次のようにIPv6のみのサブドメインを使用して最初のものを起動して実行しました:

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

    server_name example.com ipv6.example.com;

    root /var/www/example.com/htdocs;

    #More stuff, including PHP, WordPress
}

これはうまく機能します-example.comはIPv4のみ(現時点では)であり、ipv6.example.comはIPv6のみです(主にテスト目的でそこにあります)。私は汗を流すことなくping6 ipv6.example.com、さらにはwget ipv6.example.comを行うこともできます-これは快適な痛みを伴うことはありませんでした(nginxが仮想ホストをバインドする方法で "gotcha"を見つけ、ipv6only=on引数とデュアルlistenディレクティブを必要とした後) 。

ただし、私は現在、static.example.comから始めて、他のドメインをサポートするようにこれを拡張しようとしています。上記と同じアプローチを取る場合(ipv6only=on引数を含むデュアルlistenディレクティブ)、nginxを再起動すると次のエラーが発生します。

* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3

おそらくnginxのIPv6のバインディング方法は名前ベースの仮想ホストを許可していないようです?ホストから追加のIPv6アドレスを取得し(問題はありません)、IPv6でIPベースの仮想ホスティングを使用し、IPv4で名前ベースの仮想ホスティングを使用する必要がありますか?または、両方のスタックで構成を一貫させるためのソリューションがありませんか?

World IPv6 Day に間に合うようにサイトをIPv6スタックに完全に配置したいと思っていましたが、これをすぐにクリアできないと、準備ができていない可能性があります。実用的な観点から見て大したことではありません-私のサイトは、想像力を伸ばしても "主要な組織"としての資格はありません-しかし、オタクの信用を保存するのに役立ちます!

編集して追加:

@kolbyjackからの回答のおかげで、私は現在、完全に機能するデュアルスタックWebサーバーを持っています。わかりやすくするために、私は彼がくれたソリューションを編集して、誰もが答えを明確に理解できるようにしています。

私のデフォルトのキャッチオールvhostには、次のlistenディレクティブがあります。

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

順序が重要かどうかはわかりませんが、重要です。次に、追加の各vhostには、次のlistenディレクティブがあります。

listen 80;
listen [::]:80;

(または、代わりにそのポートでリッスンするポートの場合は8080。)ここで重要な部分は、デフォルトのvhostのlistenディレクティブ以外のすべてに追加の引数がないことです。つまり、ipv6only=onの繰り返しはありません。

ここでも、@ kolbyjackの解決策に感謝します!

44
Kromey

ソケットの1つの宣言でのみlistenオプションが必要です。一般的には、default_serverフラグも含む宣言にそれらを配置しますが、一部のオプションでは、任意の1つのlistenディレクティブにそれらを設定できると思います。 1つを除くすべてのリッスンからipv6only = onを削除するだけです。

46
kolbyjack