通过Nginx在Node.js上的服务器发送事件连接超时

25

我有一个通过Nginx设置的Node.js,并涉及到Server-Sent事件。

无论我使用什么Nginx配置,sse连接在60秒后都会中断并重新初始化。如果我直接连接到Node服务它的端口上,则不会发生这种情况,因此显然是某个Nginx代理问题。

我希望sse连接没有超时。这可能吗? 我尝试了调整send_timeoutkeepalive_timeoutclient_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;
  }
}
1个回答

32

回答自己。实际上,解决方案并不难找到,只需要仔细查看nginx文档。

proxy_read_timeout是一个负责此问题的指令,默认情况下设置为60秒。因此,可以通过设置例如以下内容来轻松解决:

proxy_read_timeout 24h;

设置0不起作用,这实际上会导致所有连接中断,因此我们需要想出足够长的超时时间。

修复了这个问题后,我也解决了另一个问题,但这次与浏览器如何处理连接有关。由于某种原因,在5分钟的不活动之后,浏览器会悄无声息地丢弃连接。更糟糕的是,双方都没有被通知它已经被丢弃,对于双方来说,它仍然表现为连接在线,但数据无法传输。解决方法是定期发送一些保持活动的 ping(普通 sse 评论效果很好)。


5
如果有人想知道,proxy_connect_timeout 指令是用来控制与代理服务器建立连接的超时时间,因此仅使用 proxy_read_timeout 是不会抑制任何真正的 504 错误(即应用服务器崩溃时)的。 - ATG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接