Widziałem różne przykłady konfiguracji obsługi wirtualnych hostów IPv4 i IPv6 na dwóch stosach na nginx. Wielu sugeruje ten wzór:
listen 80;
listen [::]:80 ipv6only=on;
O ile widzę, osiąga dokładnie to samo, co:
listen [::]:80 ipv6only=off;
Dlaczego miałbyś skorzystać z tego pierwszego? Jedynym powodem, dla którego mogę wymyślić, jest to, że potrzebujesz dodatkowych parametrów, które są specyficzne dla każdego protokołu, na przykład, jeśli chcesz ustawić tylko deferred
na IPv4.
listen
dyrektywach, a opcje są stosowane dla poszczególnych hostów: pary portów.Odpowiedzi:
Prawdopodobnie jest to jedyny powód, dla którego używałbyś obecnie tego konstruktu.
Powodem tego jest prawdopodobnie domyślna
ipv6only
zmiana w Nginx 1.3.4. Wcześniej domyślnie byłooff
; w nowszych wersjach domyślnie jest toon
.Zdarza się to w interakcji z opcją gniazda IPV6_V6ONLY w systemie Linux i podobnymi opcjami w innych systemach operacyjnych, których ustawienia domyślne niekoniecznie są przewidywalne. Tak więc poprzednia konstrukcja była wymagana przed wersją 1.3.4, aby upewnić się, że faktycznie nasłuchujesz połączeń zarówno na IPv4, jak i IPv6.
Zmiana wartości domyślnej na nginx dla powoduje, że domyślny
ipv6only
system operacyjny dla gniazd z dwoma stosami nie ma znaczenia. Teraz nginx albo jawnie wiąże się z IPv4, IPv6, albo z obydwoma, nigdy domyślnie w zależności od systemu operacyjnego, aby utworzyć gniazdo z dwoma stosami.Rzeczywiście, moje standardowe konfiguracje nginx dla wersji wcześniejszej niż 1.3.4 mają pierwszą konfigurację, a wszystkie po wersji 1.3.4 mają drugą konfigurację.
Chociaż, ponieważ wiązanie gniazda podwójnego stosu jest kwestią wyłącznie Linuksa, moje obecne konfiguracje wyglądają teraz bardziej jak pierwszy przykład, ale bez
ipv6only
zestawu, to znaczy:źródło
listen localhost:8080;
wydaje się nasłuchiwać zarówno (1.12.2), a użycie ładowałobyproxy_pass http://localhost:8080
równowagę między :: 1 a 127.0.0.1 - Musiałem dodać linię dla ipv6, aby uzyskać prawdziwe ip w logachset_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
Jeśli hostujesz wiele domen vhost za pomocą jednej instancji Nginx, nie możesz użyć jednej połączonej dyrektywy Listen
dla każdego z nich. Nginx ma dziwne dziwactwo, w którym można określić
ipv6only
parametr tylko raz dla każdego portu, inaczej się nie uruchomi. Oznacza to, że nie można podać tego dla każdego bloku serwera domeny vhost.Jak wspomniał Michael, począwszy od Nginx 1.3.4,
ipv6only
domyślnym parametrem jeston
.Dlatego jeśli chcesz hostować wiele domen zarówno na IPv4, jak i IPv6 na jednym serwerze Nginx, musisz użyć dwóch dyrektyw nasłuchu dla każdego bloku serwera domeny:
Ponadto, jak wspomniano Sander, użycie
ipv6only=off
ma tę wadę, że adresy IPv4 są tłumaczone na IPv6. Może to powodować problemy, jeśli twoja aplikacja sprawdza IP na czarnych listach takich jak Akismet lub StopForumSpam, ponieważ jeśli nie zbudujesz warstwy tłumaczenia wstecznego, aplikacja sprawdzi tłumaczenie IPv6 adresu IPv4 spamera, który nie będzie pasował do żadnego z adresów IPv4 w czarna lista.źródło
deferred
i inne dyrektywy dotyczące protokołu. Byłoby użyteczne, gdyby można je było podać oddzielnie od dyrektywy Listen z podanego powodu.ipv6only=off
dwukrotnie podałem ten sam port. Twoja odpowiedź rozwiązała problem!listen 443; listen [::]:443;
. Użycielisten [::]:80 ipv6only=off;
spowoduje zgłoszenie błędu nginx, że port jest już w użyciuW
ipv6only=off
stylu konfiguracji adresy IPv4 mogą być wyświetlane jako adresy IPv6 przy użyciu adresów IPv6 odwzorowanych na IPv4 (tylko oprogramowanie), na przykład w plikach dziennika, zmiennych środowiskowych (REMOTE_ADDR) itp.źródło
W moim rozumieniu (i zgodnie z dokumentami na stronie http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ), używając tylko
... jest wystarczający, jeśli chcesz kierować zarówno ruch IPv4, jak i IPv6 na tym samym porcie.
źródło