Node.js上的Server-Sent Events连接超时通过Nginx

Mar*_*wak 6 nginx node.js server-sent-events

我通过Nginx设置有一个Node.js,它涉及Server-Sent Events.

无论我有什么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;
  }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*wak 8

回答自己.实际上解决方案并不难找到,它只是需要仔细研究nginx文档.

proxy_read_timeout是一个负责该指令的指令,默认设置为60秒.所以可以通过设置例如:

proxy_read_timeout 24h;
Run Code Online (Sandbox Code Playgroud)

设置0不起作用,它实际上会使所有连接断开,因此我们需要提供足够长的超时.

在修复之后我也接近了另一个问题,但这次与浏览器如何处理连接有关.由于某些原因,浏览器在闲置5分钟后会以静默方式丢弃连接.更糟糕的是,没有任何一方被告知它被丢弃,因为它仍然看起来好像连接在线,但数据无法通过.修复这个问题是在间隔的基础上发送一些保持活动的ping(普通的评论很有用).

  • 如果有人想知道,`proxy_connect_timeout`指令是控制与代理服务器建立连接的超时的指令,因此单独使用`proxy_read_timeout`不应该禁止任何正版504(即,当应用程序服务器崩溃时). (2认同)