我使用 nginx 作為帶有 Gunicorn 應用程式伺服器(Django 應用程式)的反向代理。
在我的 nginx 虛擬主機檔案中,有兩個server
區塊。前者將www
流量重定向到後者(後者處理non-www
,https
流量)。
具體來說,前一個位置區塊是:
server {
server_name www.example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
return 301 https://example.com$request_uri;
}
後一個位置區塊是:
server {
server_name example.com;
listen 443 ssl http2 reuseport;
listen [::]:443 ssl http2 reuseport;
# other directives here
}
reuseport
請注意後一個區塊中的使用。
如果我放入reuseport
兩個塊,則會收到錯誤:nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/vhost:62
。
如果我將它單獨插入前一個區塊中,它就可以工作。我對正確放置它的位置感到困惑,前一個塊還是後一個塊。有人可以澄清一下嗎?
據我所知,該reuseport
參數指示nginx 為每個工作進程創建一個單獨的偵聽套接字,允許內核在工作進程之間分配傳入連接(以處理客戶端和伺服器之間發送的多個資料包)。
但這並不能幫助我理解為什麼我不能reuseport
在上述兩個區塊中使用它,或者我應該在哪一個區塊中使用它(假設我只能在一個區塊中使用它)。
答案1
在 NGINX 中,您只需在配置中指定一次網路套接字的偵聽選項,並且它們「套用」到server
偵聽同一套接字(連接埠)的所有其他配置。引用文件:
Listen 指令可以有幾個特定於套接字相關係統呼叫的附加參數。這些參數可以在任何監聽指令中指定,但對於給定的位址:連接埠對只能指定一次。
因此,您必須從錯誤訊息中解讀出,您應該只reuseport
為每個唯一的listen
位址+連接埠指定一次。
您執行此操作的方式server
取決於您的偏好。但作為一項規則,為了清楚起見,我建議指定其中一個server
withdefault_server
指令,其中:
如果存在,將導致伺服器成為指定位址:連接埠對的預設伺服器。如果沒有指令具有 default_server 參數,則具有位址:連接埠對的第一個伺服器將是該對的預設伺服器。
然後將您的偵聽選項放置在該伺服器區塊中(您已指定的位置default_server
)。
例如
server {
server_name www.example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
return 301 https://example.com$request_uri;
}
server {
server_name example.com;
listen 443 ssl http2 default_server reuseport;
listen [::]:443 ssl http2 default_server reuseport;
# other directives here
}