Nginx

IPv6 上基於 nginx 名稱的虛擬主機

  • June 7, 2011

我有一個 nginx 伺服器為近六個不同的網站提供服務。它在剛剛獲得 IPv6 本機支持(達拉斯數據中心)的 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=on參數),重新啟動 nginx 時出現以下錯誤:

* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3

似乎 nginx 的 IPv6 綁定方法不允許基於名稱的虛擬主機?我是否必須從我的主機獲取額外的 IPv6 地址(不是問題)並在 IPv6 上使用基於 IP 的虛擬主機和基於 IPv4 的基於命名的虛擬主機?還是我錯過了一個解決方案,可以讓我的配置在兩個堆棧上保持一致?

我希望在世界 IPv6 日之前將我的網站完全放在 IPv6 堆棧上,但除非我能迅速解決這個問題,否則我可能還沒有準備好。從任何實際的角度來看都沒什麼大不了的——我的網站都沒有資格成為“主要組織”——但請幫助我保存我的極客信譽!

編輯添加:

感謝@kolbyjack 的回答,我現在有了一個功能齊全的雙棧網路伺服器。為了清楚起見,我正在編輯他給我的解決方案,以便每個人都可以清楚地看到答案是什麼。

我的預設包羅萬象的虛擬主機具有以下listen指令:

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

我不知道順序是否重要,但確實如此。然後,每個額外的虛擬主機都有以下listen指令:

listen 80;
listen [::]:80;

(或者 8080 用於偵聽該埠的埠。)這裡的重要部分似乎是除了預設 vhost 的listen指令之外,所有其他指令都完全沒有任何附加參數——即沒有重複ipv6only=on.

再次感謝@kolbyjack 提供的解決方案!

您只需要在一個套接字聲明上使用監聽選項。通常,您會將它們放在還包含 default_server 標誌的聲明中,但是對於某些選項,我認為您可以將它們設置在任何一個監聽指令上。只需從除一個之外的所有偵聽中刪除 ipv6only=on 即可。

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