Nginx正确支持SSE的关键是主动维持长连接:需设keepalive_timeout≥3600秒保TCP连接,proxy_read_timeout≥86400秒保数据通道,并同步调大云LB超时;同时必须proxy_buffering off确保实时透传,且后端返回Content-Type: text/event-stream和Cache-Control: no-cache。

要让 Nginx 正确支持 SSE(Server-Sent Events),关键不是“避免挂起”,而是主动维持连接不被意外中断。SSE 依赖单向、长时间存活的 HTTP 连接,而 Nginx 默认的超时机制会把它当成“空闲连接”直接断开——这正是前端看到连接闪断、事件流中断的根本原因。
下面直击核心配置点,分三块说清楚:
keepalive_timeout:控制客户端到 Nginx 的空闲连接寿命
这个参数决定:客户端和 Nginx 建立的 TCP 连接,在没有新请求的情况下,能保持打开多久。
SSE 场景中,连接建立后可能几十秒甚至几分钟内都没有新请求(只有服务端在持续发 data:),所以必须拉长它:
- 推荐设为
keepalive_timeout 86400;(24 小时)或至少3600;(1 小时) - 不要只写
keepalive_timeout 60;—— 这比多数 SSE 任务耗时还短,必然断连 - 若需兼容旧浏览器(如 IE),可加第二个参数同步响应头:
keepalive_timeout 3600 3600;
该配置通常放在 http 或 location 块里,例如:
location /stream {
proxy_pass http://backend;
keepalive_timeout 3600;
}
proxy_read_timeout:控制 Nginx 等待后端数据的耐心
注意:这不是“连接空闲多久断开”,而是 Nginx 从后端读取响应体时,愿意等多久才放弃。
SSE 是服务端边算边推,中间可能有几秒无数据(比如模型推理阶段),这时 Nginx 不能贸然关连接:
- 必须设为远大于单次事件间隔,例如
proxy_read_timeout 86400; - 它和
keepalive_timeout是协作关系:前者保“数据通道不断”,后者保“TCP 连接不回收” - 同时记得配好
proxy_buffering off;,否则 Nginx 可能缓存事件流,导致前端收不到实时数据
示例补充:
location /stream {
proxy_pass http://backend;
proxy_read_timeout 86400;
proxy_buffering off;
proxy_cache off;
}
别忘了云厂商负载均衡器(LB)的独立超时
如果你的流量经过阿里云 SLB、腾讯云 CLB 或 AWS ALB:
- 它们有自己的空闲连接超时,默认常为 60~300 秒
- 即使 Nginx 配得再长,LB 先把连接掐了,前端照样收不到后续事件
- 必须登录对应控制台,把 LB 的“空闲超时时间”也调到 ≥ 3600 秒
这点最容易被忽略,也是线上环境 SSE 断连的头号原因。
小提醒:SSE 响应头必须包含 Content-Type: text/event-stream 和 Cache-Control: no-cache,Nginx 不会帮你加,得由后端确保;Nginx 自身只需专注连接生命周期管理。










