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.