nginx虛擬主機中使用reuseport的正確方法

nginx虛擬主機中使用reuseport的正確方法

我使用 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取決於您的偏好。但作為一項規則,為了清楚起見,我建議指定其中一個serverwithdefault_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
}

相關內容