Nginx

nginx 中是否需要單獨的 IPv4 和 IPv6 監聽指令?

  • November 15, 2021

我已經看到了在 nginx 上處理雙棧 IPv4 和 IPv6 虛擬主機的各種配置範例。許多人建議這種模式:

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

據我所知,這實現了完全相同的事情:

listen [::]:80 ipv6only=off;

為什麼要使用前者?我能想到的唯一原因是您是否需要特定於每個協議的附加參數,例如,如果您只想deferred在 IPv4 上設置。

如今,這可能您使用前一種構造的唯一原因。

您看到這種情況的原因可能是 nginx 1.3.4中的預設值已ipv6only更改。在此之前,它預設為off; 在較新的版本中,它預設為on.

這恰好與 Linux 上的 IPV6_V6ONLY 套接字選項以及其他作業系統上的類似選項互動,其預設值不一定是可預測的。因此,在 1.3.4 之前需要前一種構造,以確保您實際上正在偵聽 IPv4 和 IPv6 上的連接。

對 nginx 預設值的更改可ipv6only確保雙棧套接字的作業系統預設值無關緊要。現在,nginx 要麼顯式綁定到 IPv4、IPv6 或兩者,預設情況下從不依賴作業系統來創建雙棧套接字。

事實上,我的 1.3.4 之前的標準 nginx 配置具有第一個配置,而 1.3.4 之後的都有第二個配置。

雖然,由於綁定雙棧套接字是僅限 Linux 的事情,我目前的配置現在看起來更像第一個範例,但沒有ipv6only設置,即:

listen [::]:80;
listen 80;

引用自:https://serverfault.com/questions/638367