У мене є сервер nginx, який обслуговує майже півдесятка різних веб-сайтів. Він працює на Linode, щойно отримав вбудовану підтримку IPv6 (центр даних Далласа), і я намагаюся налаштувати більшість моїх сайтів для роботи з двома стеками. Перший я запустився та запустив, використовуючи лише такий піддомен 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
не порушуючи піт, - це було приємно безболісно (після знаходження "gotcha" з тим, як nginx зв'язує віртуальних хостів, необхідні ipv6only=on
аргументи та подвійні listen
директиви).
Однак зараз я намагаюся розширити це для підтримки інших моїх доменів, починаючи з static.example.com; коли я використовую той же підхід, що і вище (подвійні listen
директиви, включаючи ipv6only=on
аргумент), я отримую таку помилку при перезапуску nginx:
* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3
Здається, що, можливо, метод прив'язки nginx для IPv6 не дозволяє віртуальних хостів на основі імен? Чи доведеться мені отримувати додаткові адреси IPv6 від свого хоста (не проблема) та використовувати віртуальний хостинг на основі IP-адреси на IPv6 із віртуальним хостингом на основі іменованих даних через IPv4? Або я пропускаю рішення, яке дозволить моїм конфігураціям залишатися послідовними на обох стеках?
Я сподівався, що мій сайт буде повністю на стеку IPv6 вчасно до Всесвітнього дня IPv6 , але, якщо я не можу це швидко прояснити, можливо, я не буду готовий. Не велика справа з будь-якої практичної точки зору - жоден з моїх сайтів не розцінюється як "велика організація" з будь-якої ділянки уяви - але допоможіть мені зберегти мої рахунки на виглядів!
Відредаговано, щоб додати:
Завдяки відповіді від @kolbyjack, у мене є повністю функціональний веб-сервер з двома стеками. Просто задля ясності, я редагую рішення, яке він мені дав, щоб усі могли чітко бачити, що відповідає.
У моїй вигідній програмі catchall 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 для того, хто слухає цей порт замість цього.) Важливою частиною тут є повна відсутність будь-яких додаткових аргументів для всіх, крім listen
директив vhost за замовчуванням - тобто не повторення ipv6only=on
.
Ще раз, велике спасибі @kolbyjack за рішення тут!
ipv6only=on
. Все інше залишилось колишнім, однак дякую за це!