2014-02-07 77 views
3

我有一個通過Nginx設置的Node.js,它涉及Server-Sent Events。通過Nginx在Node.js上發送服務器發送的事件連接超時

無論我的Nginx配置如何,sse的連接在60秒後都會中斷並重新初始化。如果我直接在應用程序的端口上連接應用程序,則不會發生這種情況,所以很顯然,這是一些Nginx代理問題。

我想在sse連接上沒有超時。那可能嗎?我試過調整send_timeout,keepalive_timeout,client_body_timeoutclient_header_timeout,但它沒有改變任何東西。以下是我的Nginx配置。

upstream foobar.org { 
    server 127.0.0.1:3201; 
} 

server { 
    listen 0.0.0.0:80; 
    server_name example.org; 

    client_max_body_size 0; 
    send_timeout 600s; 

    location/{ 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 

    proxy_pass http://example.org/; 
    proxy_redirect off; 

    proxy_set_header Connection ''; 
    proxy_http_version 1.1; 
    chunked_transfer_encoding off; 
    proxy_buffering off; 
    proxy_cache off; 
    } 
} 

回答

5

回答自己。實際上解決方案並不難找到,它只是要求仔細研究nginx文檔。

proxy_read_timeout是一個負責的指令,默認情況下它被設置爲60秒。因此,它可以通過設置例如爲:

proxy_read_timeout 24h; 

設置0將無法​​正常工作,這實際上使所有的連接斷裂,因此我們需要拿出足夠長的溢出很容易固定。

修復後,我也接近另一個問題,但這次涉及到瀏覽器如何處理連接。出於某種原因,5分鐘不活動的瀏覽器默默放棄連接。更糟的是,雙方都不會被告知它被丟棄,因爲它仍然表現爲連接在線,但數據無法通過。修復這個問題就是在間隔的基礎上發送一些保持活躍的ping(普通的sse評論很好)。