IPv6의 nginx 이름 기반 가상 호스트 다시 시작할 때 다음 오류가

거의 6 개의 다른 웹 사이트를 제공하는 nginx 서버가 있습니다. IPv6 기본 지원 (Dallas 데이터 센터)을 갖춘 Linode에서 실행 중이며 대부분의 사이트를 이중 스택 작업으로 구성하려고합니다. 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땀 한방울 흘리지 않고 -이 훨씬 즐겁게 고통없이했다합니다 (, 방법의 nginx의 바인딩 가상 호스트와 함께 “잡았다”를 찾는 필요로 후 ipv6only=on인수 및 듀얼 listen지침을).

그러나 나는 이제 static.example.com으로 시작하여 다른 도메인을 지원하기 위해 이것을 확장하려고합니다. 그래도 위와 동일한 접근 방식 ( 인수를 listen포함한 이중 지시문)을 사용하면 ipv6only=onnginx를 다시 시작할 때 다음 오류가 발생합니다.

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

아마도 nginx의 IPv6 바인딩 방법은 이름 기반 가상 호스트를 허용하지 않는 것 같습니다. 호스트에서 추가 IPv6 주소를 가져와야하며 (문제는 아님) IPv4를 통한 이름 기반 가상 호스팅과 함께 IPv6에서 IP 기반 가상 호스팅을 사용해야합니까? 또는 두 스택에서 구성을 일관성있게 유지할 수있는 솔루션이 누락 되었습니까?

World IPv6 Day를 위해 제 시간에 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) 여기에서 중요한 부분은 기본 vhost의 listen지시문 을 제외한 모든 추가 인수가 전혀 없는 것 같습니다 ipv6only=on.

여기서도 솔루션을 제공하는 @kolbyjack에게 감사드립니다!



답변

소켓에 대한 하나의 선언에는 청취 옵션 만 필요합니다. 일반적으로 default_server 플래그를 포함하는 선언에 배치하지만 일부 옵션의 경우 하나의 청취 지시문에 설정할 수 있다고 생각합니다. ipv6only = on을 제외한 모든 청취에서 제거하십시오.