通过 Nginx 在 Node.js 上的服务器发送事件连接超时
Posted
技术标签:
【中文标题】通过 Nginx 在 Node.js 上的服务器发送事件连接超时【英文标题】:Server-Sent Events connection timeout on Node.js via Nginx 【发布时间】:2014-03-05 00:40:04 【问题描述】:我有一个通过 nginx 设置的 Node.js,它涉及服务器发送事件。
无论我有什么 Nginx 配置,60 秒后 sse 的连接都会断开并重新初始化。如果我直接在哪个节点为其提供服务的端口上连接到应用程序,则不会发生这种情况,因此这显然是一些 Nginx 代理问题。
我希望 sse 连接没有超时。那可能吗?我试过调整send_timeout
、keepalive_timeout
、client_body_timeout
和client_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;
【问题讨论】:
【参考方案1】:回答我自己。其实解决方案并不难找到,只是需要仔细查看 nginx 文档。
proxy_read_timeout
是负责此操作的指令,默认设置为 60 秒。因此可以通过设置例如:
proxy_read_timeout 24h;
设置0
不起作用,它实际上会使你的所有连接断开,因此我们需要提供足够长的超时时间。
修复后我也处理了另一个问题,但这次与浏览器如何处理连接有关。出于某种原因,在 5 分钟不活动后,浏览器会默默地丢弃连接。更糟糕的是,双方都没有被告知它已被丢弃,因为它仍然看起来好像连接在线,但数据没有通过。解决这个问题的方法是在间隔的基础上发送一些保持活动的 ping(简单的 sse 评论效果很好)。
【讨论】:
如果有人想知道,proxy_connect_timeout
指令是控制与代理服务器建立连接超时的指令,因此单独使用 proxy_read_timeout
不应抑制任何真正的 504(即,当应用程序服务器崩溃时)。以上是关于通过 Nginx 在 Node.js 上的服务器发送事件连接超时的主要内容,如果未能解决你的问题,请参考以下文章
在 Elastic Beanstalk 上扩展 Nginx - Node JS