IPv6의 nginx 이름 기반 가상 호스트


44

거의 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에게 감사드립니다!


nginx 1.2.1에서는을 지정할 필요가 없었습니다 ipv6only=on. 그러나 다른 모든 것은 동일하게 유지되었습니다. 감사합니다!
BeepDog

답변:


46

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


2
잠깐, 혼란스러워 서버 선언 당 적어도 하나의 청취 지시문이 필요하다고 생각했습니다. 그렇지 않으면 nginx는 어떤 포트에서 어떤 서버 블록이 응답하는지 알 수 있습니까? 나는 그것이 적절하다고 생각하지 않았기 때문에 위에서 언급하지 않았지만 8080에 하나의 서버가 있고 나머지는 80에 있으며, 이것이 다림질되는 즉시 커플에게 443을 제공하려고합니다. 그런 다음 SSL 인증서를 받으십시오.
Kromey

자, 문서를 다시 살펴보면 포트 80에있는 사이트는 실제로 청취 지시문이 필요하지 않은 것처럼 보입니다. 내 catchall vhost에 default_server 플래그가있는 사이트입니다. 그러나 8080의 서버에서는 여전히 실패합니다. 기본 catchall도 사용합니다 (캐치 all은 다른 vhost에서 명시 적으로 구성하지 않은 호스트 이름에 대한 요청을 무시하도록 작성되었습니다).
Kromey

1
나는 당신의 모든 청취 지시문을 제거한다고 말하지 않습니다. ipv6only = on 플래그 중 하나만 제거하면됩니다. 각 서버에 수신 지시문이 없으면 기본적으로 수신 대기는 80입니다. ipv6을 포함하거나 포함하지 않을 수 있습니다. 올바른 접근 방식은 각 서버에 두 개의 청취 지시문을 모두 포함하는 것이지만 서버 중 하나에 만 ipv6only = on을 넣는 것입니다.
kolbyjack

4
아, 이제 무슨 말인지 알 겠어. 원래 게시물을 잘못 읽었습니다. 이것은 나를 위해 일했다 : ipv6only=on내 기본 가상 호스트 (내부)에 (내가 듣는 각 포트에 대해서만 default_server); 각각의 가상 호스트는 단순히 지정 listen 80;listen [::]:80IPv4와 IPv6 모두에 함수 (전혀 추가 매개 변수). 이제 이중 스택 도메인에 대한 AAAA 레코드 추가를 완료하기 만하면됩니다. 감사!
Kromey

1
나를 위해 일했지만, 왜 nginx가 ipv4에서 여러 블록에 대해 ipv4를 수신 할 수 있지만 ipv6이 아닌지 이해할 수 없습니다. . 설명 할 수 있습니까?
Adeerlike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.