nginx에 별도의 IPv4 및 IPv6 청취 지시문이 필요합니까?


71

nginx에서 듀얼 스택 IPv4 및 IPv6 가상 호스트를 처리하기위한 다양한 구성 예제를 보았습니다. 많은 사람들이이 패턴을 제안합니다.

listen 80;
listen [::]:80 ipv6only=on;

내가 볼 수있는 한, 이것은 정확히 다음과 같습니다.

listen [::]:80 ipv6only=off;

왜 전자를 사용 하시겠습니까? 내가 생각할 수있는 유일한 이유는 각 프로토콜에 특정한 추가 매개 변수가 필요한 경우입니다 (예 : deferredIPv4 에서만 설정하려는 경우) .


IP 스택 버전과는 아무런 관련이없는 것이 TCP 옵션입니다.
Xavier Lucas

1
물론, listen지시문에 설정하면 호스트 : 포트 쌍마다 옵션이 적용됩니다.
Synchro

흠 나는 당신이 그렇게하고 싶을 경우를 정말로 상상할 수 없습니다. 나는 유일한 이유는 역사적이라고 생각하고 Michael Hampton은 그것을 못 박았다.
Xavier Lucas

답변:


48

그건 아마 입니다 당신이 전자 구조, 요즘을 사용하는 유일한 이유에 대해.

이것이 보이는 이유는 아마도 기본값이 ipv6onlynginx 1.3.4에서 변경 되었기 때문일 것 입니다 . 그 전에는 기본적으로 off; 최신 버전에서는 기본값이 on입니다.

이것은 Linux의 IPV6_V6ONLY 소켓 옵션 및 기본값을 예측할 수없는 다른 운영 체제의 유사한 옵션과 상호 작용합니다. 따라서 IPv4와 IPv6 모두에서 실제로 연결을 수신하려면 이전 구문이 1.3.4 이전에 필요했습니다.

nginx 기본값을 변경 ipv6only하면 이중 스택 소켓의 운영 체제 기본값이 관련이 없습니다. 이제 nginx는 기본적으로 이중 스택 소켓을 만들기 위해 OS에 의존하지 않고 IPv4, IPv6 또는 둘 다에 명시 적으로 바인딩됩니다.

실제로, 1.3.4 이전 버전에 대한 표준 nginx 설정은 첫 번째 구성이며, 1.3.4 이후 버전은 모두 두 번째 구성입니다.

이중 스택 소켓 바인딩은 Linux 전용이므로 현재 구성은 첫 번째 예와 비슷하지만 ipv6only설정 하지 않은 채로 보입니다 .

listen [::]:80;
listen 80;

4
OpenBSD와 같은 일부 운영 체제는 이중 ipv4 및 ipv6 소켓을 전혀 사용하지 않으므로 두 번 청취해야합니다.
저스틴 코맥

@JustinCormack 네, 맞습니다. 그리고 한동안 그것을 고려했습니다. 지금까지이 게시물을 업데이트하지 않았습니다.
Michael Hampton

1
listen localhost:8080;모두 (1.12.2)을 듣고 사용하는 것 proxy_pass http://localhost:8080: 1 127.0.0.1 사이에 균형을로드합니다 - 나는 로그에 실제 IP를 얻기 위해 IPv6에 대한 행을 추가했다set_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
안토니 깁스를

65

단일 Nginx 인스턴스로 여러 vhost 도메인을 호스팅하는 경우 단일 결합 청취 지시문을 사용할 수 없습니다

listen [::]:80 ipv6only=off;

그들 각각을 위해. Nginx에는 이상한 ipv6only포트가 있습니다. 각 포트마다 한 번만 매개 변수를 지정할 수 있습니다 . 그렇지 않으면 시작되지 않습니다. 즉, 각 호스트 도메인 서버 블록에 대해이를 지정할 수 없습니다.

Michael이 언급했듯이 Nginx 1.3.4부터 ipv6only매개 변수의 기본값은 on입니다.

따라서 단일 Nginx 서버를 사용하여 IPv4 및 IPv6 모두에서 여러 도메인을 호스트하려는 경우 각 도메인 서버 블록에 대해 두 개의 청취 지시문을 사용해야합니다.

listen 80;
listen [::]:80; 

또한 Sander가 언급했듯이을 사용 ipv6only=off하면 IPv4 주소가 IPv6으로 변환된다는 단점이 있습니다. 리버스 변환 레이어에서 빌드하지 않으면 앱이 스패머의 IPv4 주소의 IPv6 변환을 확인하기 때문에 앱이 Akismet 또는 StopForumSpam과 같은 블랙리스트에 대해 IP 검사를 수행하는 경우 문제가 발생할 수 있습니다. 블랙리스트.


2
그렇습니다.에 대해 언급 한 것과 동일 deferred하며 다른 프로토콜 별 지시어도 마찬가지 입니다. 당신이 말하는 이유에 따라 listen 지시문과 별도로 지정할 수 있다면 유용 할 것입니다.
Synchro

1
문제의 핵심은 각 도메인에 대해 청취 지시문을 별도로 지정해야한다는 것입니다. 그렇지 않으면 어떻게 될까요? 사이트는 ipv4 및 ipv6을 통해 정상적으로 작동하며 nginx 시작 페이지를 표시합니다. ROFL
실버 문

2
철저한 설명 감사합니다! ipv6only=off같은 포트를 두 번 지정할 때 혼란스러운 오류가 발생 했습니다. 당신의 대답은 문제를 해결했습니다!

1
또한 당신은이 가상 호스트 모두 443을 듣고 사용하려는 경우 : listen 443; listen [::]:443;. 를 사용 listen [::]:80 ipv6only=off;하면 포트가 이미 사용중인 nginx 오류가 발생합니다
lukeaus

16

ipv6only=off의 IPv6 (소프트웨어 만)를 사용하여 어드레스로 구성 스타일는 IPv4 주소를 표시 할 수있는 IPv4 맵의 IPv6 주소 파일, 환경 변수 (REMOTE_ADDR) 등을 예를 들어 로그인


3
예, 그들은 이런 식으로 보여집니다.
Michael Hampton

2

내 이해에 (그리고 http://nginx.org/en/docs/http/ngx_http_core_module.html#listen 의 문서에 따르면 )

listen 80;

... 동일한 포트에서 IPv4 및 IPv6 트래픽을 모두 채널로 보내려면 충분합니다.


1
그것은 이미 확립되었고 질문에서 언급되었습니다. 차이점에 대한 다른 답변을 참조하십시오.
Synchro

3
그것은 나를 위해하지 않았다, 나는 둘 다 필요했다. "listen [::] : 80 ipv6only = on;"줄을 추가 할 때까지 ipv6을 사용할 때 실패하는 wget 및 curl
Basil A
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.