Tengo un servidor nginx que sirve casi media docena de sitios web diferentes. Se ejecuta en un Linode que acaba de recibir soporte nativo de IPv6 (centro de datos de Dallas), y estoy tratando de configurar la mayoría de mis sitios para la operación de doble pila. Obtuve el primero en funcionamiento usando un subdominio solo IPv6 como este:
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
}
Esto funciona muy bien: example.com es solo IPv4 (por ahora), e ipv6.example.com es solo IPv6 (principalmente allí para fines de prueba). Puedo ping6 ipv6.example.com
, e incluso wget ipv6.example.com
sin sudar, esto fue agradablemente indoloro (después de encontrar el "problema" con la forma en que nginx une a los hosts virtuales, lo que requiere el ipv6only=on
argumento y las listen
directivas duales ).
Sin embargo, ahora estoy tratando de expandir esto para admitir mis otros dominios, comenzando con static.example.com; Sin embargo, cuando adopto el mismo enfoque que el anterior (las listen
directivas duales , incluido el ipv6only=on
argumento), aparece el siguiente error al reiniciar nginx:
* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3
Parece que quizás el método de enlace de nginx para IPv6 no permite hosts virtuales basados en nombres. ¿Tendré que obtener direcciones IPv6 adicionales de mi host (no es un problema) y usar un alojamiento virtual basado en IP en IPv6 con un alojamiento virtual basado en nombre sobre IPv4? ¿O me falta una solución que permita que mis configuraciones permanezcan consistentes en ambas pilas?
Esperaba tener mi sitio completamente en la pila de IPv6 a tiempo para el Día Mundial de IPv6 , pero a menos que pueda aclarar esto rápidamente, es posible que no esté listo. No es un gran problema desde un punto de vista práctico, ninguno de mis sitios califica como una "organización importante" por ningún tramo de la imaginación, ¡pero ayúdame a salvar mi crédito geek!
Editado para agregar:
Gracias a la respuesta de @kolbyjack, ahora tengo un servidor web de doble pila totalmente funcional. Solo por razones de claridad, estoy editando la solución que me dio para que todos puedan ver claramente cuál es la respuesta.
Mi catchall vhost predeterminado tiene las siguientes listen
directivas:
listen 80 default_server;
listen 8080 default_server;
listen [::]:80 default_server ipv6only=on;
listen [::]:8080 default_server ipv6only=on;
No sé si el orden importa, pero ahí está. Luego, cada vhost adicional tiene las siguientes listen
directivas:
listen 80;
listen [::]:80;
(O 8080 para el que escucha en ese puerto en su lugar.) La parte importante aquí parece ser la falta total de argumentos adicionales en todas las listen
directivas de vhost por defecto, excepto las repeticiones ipv6only=on
.
Nuevamente, ¡muchas gracias a @kolbyjack por la solución aquí!
fuente
ipv6only=on
. Sin embargo, todo lo demás permaneció igual, ¡gracias por esto!Respuestas:
Solo necesita opciones de escucha en una declaración para un socket. En general, los pondría en la declaración que también incluye el indicador default_server, pero para algunas opciones, creo que puede configurarlos en cualquier directiva de escucha. Simplemente elimine ipv6only = on de todas las escuchas, excepto una.
fuente
ipv6only=on
solo aparece en la lista (para cada puerto en el que escucho) en mi vhost predeterminado (junto adefault_server
); cada vhost simplemente especificalisten 80;
ylisten [::]:80
(sin parámetros adicionales) para funcionar tanto en IPv4 como en IPv6. Ahora todo lo que tengo que hacer es terminar de agregar los registros AAAA para mis dominios de doble pila, y debería ser bueno ir aquí. ¡Gracias!