Vraag nginx op naam gebaseerde virtuele hosts op IPv6


Ik heb een nginx-server die bijna zes verschillende websites bedient. Het draait op een Linode die zojuist IPv6-native ondersteuning heeft gekregen (datacenter in Dallas) en ik probeer de meeste van mijn sites te configureren voor dual-stack-werking. Ik kreeg de eerste in gebruik met een IPv6-subdomein zoals:

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
}

Dit werkt prima - example.com is alleen IPv4 (voorlopig) en ipv6.example.com is alleen voor IPv6 (voornamelijk bedoeld voor testdoeleinden). ik kan ping6 ipv6.example.comen zelfs wget ipv6.example.com zonder zweten - dit was aangenaam zonder pijn (na het vinden van de "gotcha" met de manier waarop nginx virtuele hosts bindt, waardoor de ipv6only=on argument en de dual listen richtlijnen).

Ik probeer dit nu echter uit te breiden om mijn andere domeinen te ondersteunen, te beginnen met static.example.com; wanneer ik dezelfde benadering als hierboven neem, hoewel (de dubbele listen richtlijnen, inclusief de ipv6only=on argument), krijg ik de volgende fout bij het herstarten van nginx:

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

Het lijkt erop dat de methode van binding van nginx voor IPv6 mogelijk niet toestaat dat op naam gebaseerde virtuele hosts? Moet ik extra IPv6-adressen van mijn host krijgen (geen probleem) en IP-gebaseerde virtuele hosting gebruiken op IPv6 met named-based virtual hosting via IPv4? Of mis ik een oplossing waardoor mijn configuraties consistent blijven op beide stacks?

Ik hoopte dat mijn site volledig op tijd in de IPv6-stack zou zijn Wereld IPv6-dagmaar als ik dit niet snel op kan maken, ben ik misschien niet klaar. Geen big deal van praktisch standpunt - geen van mijn sites kwalificeert zich als een "grote organisatie" door een stuk van de verbeelding - maar help me mijn geek credo te redden!

Bewerkt om toe te voegen:

Dankzij het antwoord van @kolbyjack beschik ik nu over een volledig functionele dual-stack-webserver. Voor de duidelijkheid, ik bewerk in de oplossing die hij me gaf zodat iedereen duidelijk kan zien wat het antwoord is.

Mijn standaard catchall vhost heeft de volgende listen richtlijnen:

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

Ik weet niet of de volgorde ertoe doet, maar daar is hij. Vervolgens heeft elke extra vhost het volgende listen richtlijnen:

listen 80;
listen [::]:80;

(Of 8080 voor degene die in plaats daarvan naar die poort luistert.) Het belangrijkste onderdeel lijkt hier het totale ontbreken van aanvullende argumenten te zijn voor alle behalve de standaard vhost's listen richtlijnen - d.w.z. geen herhaling van ipv6only=on.

Nogmaals, veel dank aan @kolbyjack voor de oplossing hier!


44
2018-06-06 23:40


oorsprong


Met nginx 1.2.1 hoefde ik niet op te geven ipv6only=on. Al het andere bleef echter hetzelfde, bedankt hiervoor! - BeepDog


antwoorden:


U hebt alleen luisteropties nodig op één aangifte voor een socket. Over het algemeen zou je ze op de verklaring zetten die ook de vlag default_server bevat, maar voor sommige opties denk ik dat je ze gewoon op elke luisterrichtlijn kunt zetten. Verwijder eenvoudig de ipv6only = van alle luisterbeurten behalve één.


46
2018-06-07 02:12



Wacht, ik ben in de war. Ik dacht dat er minstens één luisterrichtlijn per serververklaring nodig was - anders zou nginx weten met welk serverblok bedoeld is te reageren op welke poort (en)? Ik heb het hierboven niet vermeld omdat ik het niet relevant vond, maar ik heb een server op 8080, de rest op 80, en ik ben van plan om 443 ook voor een paar aan te bieden, zodra ik dit heb opgelost en haal dan mezelf een SSL-certificaat. - Kromey
Oke, kijkend naar de documentatie, de sites op poort 80 zien eruit alsof ze helemaal geen luisterrichtlijn nodig hebben, slechts één met de vlag default_server in mijn catchall vhost. Dit mislukt echter nog steeds voor mijn server op 8080, waarvoor ik ook een standaard catchall gebruik (de catchall is geschreven om alle verzoeken voor een hostnaam die ik niet expliciet in een ander vhost heb geconfigureerd te negeren). - Kromey
Ik zeg niet om al je luisterrichtlijnen te verwijderen. Verwijder de ipv6only = op vlag van alle behalve één. Zonder een luisterrichtlijn in elke server zullen ze standaard standaard 80 luisteren; die ipv6 wel of niet kunnen bevatten. Ik denk dat de juiste aanpak is om beide luisterrichtlijnen in elke server op te nemen, maar zet de ipv6only = alleen op slechts één van de servers. - kolbyjack
Ah, ik begrijp nu wat je bedoelt. Ik heb je post oorspronkelijk verkeerd gelezen. Dit heeft voor mij gewerkt: ipv6only=on wordt alleen vermeld (voor elke poort waarop ik luister) in mijn standaard vhost (hiernaast default_server); elke vhost specificeert dan eenvoudig listen 80; en listen [::]:80 (helemaal geen extra parameters) om zowel op IPv4 als IPv6 te functioneren. Nu hoef ik alleen maar de AAAA-records voor mijn dual-stack-domeinen toe te voegen, en ik zou het goed zijn om hier naartoe te gaan. Bedankt! - Kromey
werkte ook voor mij, maar ik begrijp niet waarom ik nginx op ipv4 kan luisteren voor meerdere blokken, maar niet voor ipv6. . kunt u uitleggen ? - a deer