Ich habe verschiedene Konfigurationsbeispiele für den Umgang mit virtuellen Dual-Stack-IPv4- und IPv6-Hosts auf nginx gesehen. Viele schlagen dieses Muster vor:
listen 80;
listen [::]:80 ipv6only=on;
Soweit ich sehen kann, erreicht dies genau das Gleiche wie:
listen [::]:80 ipv6only=off;
Warum würden Sie die erstere verwenden? Der einzige Grund, den ich mir vorstellen kann, besteht darin, dass Sie zusätzliche Parameter benötigen, die für jedes Protokoll spezifisch sind, zum Beispiel, wenn Sie nur deferred
IPv4 aktivieren möchten .
listen
Direktiven und die Optionen werden pro Host: Port-Paar angewendet.Antworten:
Das wahrscheinlich ist so ziemlich der einzige Grund , warum Sie das ehemalige Konstrukt verwenden würde, in diesen Tagen.
Der Grund, warum Sie dies sehen, ist wahrscheinlich, dass sich die Standardeinstellung
ipv6only
in nginx 1.3.4 geändert hat. Zuvor war standardmäßig Folgendes eingestelltoff
: In neueren Versionen ist der Standardwerton
.Dies geschieht mit der Socket-Option IPV6_V6ONLY unter Linux und ähnlichen Optionen unter anderen Betriebssystemen, deren Standardeinstellungen nicht unbedingt vorhersehbar sind. Daher war das vorherige Konstrukt vor 1.3.4 erforderlich, um sicherzustellen, dass Sie tatsächlich auf IPv4- und IPv6-Verbindungen warteten.
Die Änderung der Nginx-Standardeinstellung für
ipv6only
stellt sicher, dass die Betriebssystem-Standardeinstellung für Dual-Stack-Sockets irrelevant ist. Nun bindet nginx entweder explizit an IPv4, IPv6 oder beides, je nach Betriebssystem jedoch nie, um standardmäßig einen Dual-Stack-Socket zu erstellen.In der Tat haben meine Standard-Nginx-Konfigurationen vor 1.3.4 die erste Konfiguration und nach 1.3.4 alle die zweite Konfiguration.
Da das Binden eines Dual-Stack-Sockets nur unter Linux möglich ist, sehen meine aktuellen Konfigurationen jetzt eher wie das erste Beispiel aus, jedoch ohne
ipv6only
Satz:quelle
listen localhost:8080;
scheint auf beide zu hören (1.12.2) undproxy_pass http://localhost:8080
würde mit Load Balance zwischen :: 1 und 127.0.0.1 - Ich musste eine Zeile für ipv6 hinzufügen, um echte IP in Protokollen zu erhaltenset_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
Wenn Sie mehrere vhost-Domänen mit einer einzelnen Nginx-Instanz hosten, können Sie die einzelne kombinierte Listen-Direktive nicht verwenden
für jeden von ihnen. Nginx hat eine seltsame Eigenheit, bei der Sie den
ipv6only
Parameter nur einmal für jeden Port angeben können, da er sonst nicht gestartet werden kann. Das heißt, Sie können es nicht für jeden vhost-Domänenserverblock angeben.Wie Michael bereits erwähnt hat, ist der
ipv6only
Parameter ab Nginx 1.3.4 standardmäßigon
.Wenn Sie mehrere Domänen sowohl auf IPv4 als auch auf IPv6 mit einem einzigen Nginx-Server hosten möchten, müssen Sie daher für jeden Domänenserverblock zwei Empfangsanweisungen verwenden:
Wie Sander bereits erwähnte,
ipv6only=off
hat die Verwendung außerdem den Nachteil, dass IPv4-Adressen in IPv6 übersetzt werden. Dies kann zu Problemen führen, wenn Ihre App die IP-Überprüfung anhand von Blacklists wie Akismet oder StopForumSpam durchführt. Wenn Sie keine Reverse-Translation-Schicht einbauen, überprüft Ihre App die IPv6-Übersetzung der IPv4-Adresse des Spammers, die keiner der IPv4-Adressen in entspricht die schwarze Liste.quelle
deferred
, und andere Pro-Protokoll-Richtlinien. Es wäre nützlich, wenn sie aus dem von Ihnen angegebenen Grund getrennt von der Listen-Direktive angegeben werden könnten.ipv6only=off
zweimaligen Festlegen desselben Anschlusses trat ein verwirrender Fehler auf . Ihre Antwort hat das Problem gelöst!listen 443; listen [::]:443;
. Unter Verwendunglisten [::]:80 ipv6only=off;
wird ein nginx Fehler aus , dass der Port bereits verwendetMit dem
ipv6only=off
Konfigurationsstil können die IPv4-Adressen als IPv6-Adressen unter Verwendung der (nur durch Software) IPv4-zugeordneten IPv6-Adressen in beispielsweise Protokolldateien, Umgebungsvariablen (REMOTE_ADDR) usw. angezeigt werden.quelle
Soweit ich weiß (und gemäß den Dokumenten unter http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ), verwenden Sie einfach
... ist ausreichend, wenn Sie sowohl IPv4- als auch IPv6-Datenverkehr auf demselben Port kanalisieren möchten.
quelle