通过 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_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】:

回答我自己。其实解决方案并不难找到,只是需要仔细查看 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

安装Nginx并为node.js设置反向代理

Node.js AWS 部署错误:找不到模块

Nginx + Node.js + Socket.io + SSL 可能吗?

如何在生产服务器上部署 Node.js 应用

创建 Node.js 应用