2014-02-07 57 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评论很好)。