Ich habe einen Nginx-Server, auf dem fast ein halbes Dutzend verschiedene Websites betrieben werden. Es läuft auf einem Linode, der gerade native IPv6-Unterstützung hat (Dallas Data Center), und ich versuche, die meisten meiner Sites für den Dual-Stack-Betrieb zu konfigurieren. Ich habe den ersten mit einer IPv6-Subdomain wie der folgenden gestartet:
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
}
Dies funktioniert hervorragend - example.com ist (vorerst) nur IPv4-fähig und ipv6.example.com ist nur IPv6-fähig (hauptsächlich zu Testzwecken). Ich kann ping6 ipv6.example.com
, und auch wget ipv6.example.com
ohne ins Schwitzen zu geraten - so viel war angenehm schmerzfrei (nachdem ich das "gotcha" so gefunden hatte, wie Nginx virtuelle Hosts bindet, was das ipv6only=on
Argument und die doppelten listen
Anweisungen erforderlich macht ).
Ich versuche jetzt jedoch, dies zu erweitern, um meine anderen Domänen zu unterstützen, beginnend mit static.example.com. Wenn ich jedoch den gleichen Ansatz wie oben verwende (die dualen listen
Anweisungen, einschließlich des ipv6only=on
Arguments), wird beim Neustart von nginx der folgende Fehler angezeigt:
* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3
Es scheint, dass die Bindungsmethode von Nginx für IPv6 möglicherweise keine namensbasierten virtuellen Hosts zulässt. Muss ich zusätzliche IPv6-Adressen von meinem Host beziehen (kein Problem) und IP-basiertes virtuelles Hosting auf IPv6 mit benanntem virtuellem Hosting über IPv4 verwenden? Oder fehlt mir eine Lösung, mit der meine Konfigurationen auf beiden Stacks konsistent bleiben?
Ich hatte gehofft, meine Site rechtzeitig zum Welt-IPv6-Tag vollständig auf dem IPv6-Stack zu haben , aber wenn ich dies nicht schnell klären kann, bin ich möglicherweise nicht bereit. Vom praktischen Standpunkt aus keine große Sache - keine meiner Websites kann sich als "große Organisation" qualifizieren - aber helfen Sie mir, mein Geek-Credo zu bewahren!
Bearbeitet, um hinzuzufügen:
Dank der Antwort von @kolbyjack habe ich jetzt einen voll funktionsfähigen Dual-Stack-Webserver. Aus Gründen der Klarheit bearbeite ich die Lösung, die er mir gegeben hat, damit jeder klar sehen kann, wie die Antwort lautet.
Mein voreingestellter catchall vhost hat folgende listen
Anweisungen:
listen 80 default_server;
listen 8080 default_server;
listen [::]:80 default_server ipv6only=on;
listen [::]:8080 default_server ipv6only=on;
Ich weiß nicht, ob die Reihenfolge wichtig ist, aber da ist es. Dann hat jeder zusätzliche vhost die folgenden listen
Anweisungen:
listen 80;
listen [::]:80;
(Oder 8080 für denjenigen, der stattdessen diesen Port abhört.) Der wichtige Teil hier scheint das völlige Fehlen zusätzlicher Argumente für alle listen
Anweisungen außer den vhost-Standardanweisungen zu sein - dh keine Wiederholung von ipv6only=on
.
Nochmals vielen Dank an @kolbyjack für die Lösung hier!
quelle
ipv6only=on
. Alles andere blieb jedoch gleich, danke dafür!Antworten:
Sie benötigen nur Listen-Optionen für eine Deklaration für einen Socket. Im Allgemeinen würden Sie sie in die Deklaration einfügen, die auch das default_server-Flag enthält, aber für einige Optionen können Sie sie meiner Meinung nach einfach für eine beliebige listen-Direktive festlegen. Entfernen Sie einfach ipv6only = on von allen Listenern mit einer Ausnahme.
quelle
ipv6only=on
Wird nur (für jeden Port, den ich abhöre) in meinem Standard-vhost (nebendefault_server
) aufgeführt; Jeder vhost spezifiziert dann einfachlisten 80;
undlisten [::]:80
(überhaupt keine zusätzlichen Parameter), um sowohl auf IPv4 als auch auf IPv6 zu funktionieren. Jetzt muss ich nur noch die AAAA-Datensätze für meine Dual-Stack-Domains hinzufügen. Vielen Dank!