nginx 稳定支持长周期 sse 的关键是关闭默认干扰机制、显式维持连接状态、透传关键语义:关缓冲缓存、调大各层超时、透传 sse 必需头信息、负载均衡适配连接分发与健康检查。

要让 Nginx 负载均衡层稳定支持长周期 SSE 推送,核心不是“加功能”,而是**关掉默认干扰机制 + 显式维持连接状态 + 透传关键语义**。SSE 不是普通接口,它是一条持续数小时、只写不读的 HTTP 长隧道,Nginx 默认配置全是为短请求设计的,必须针对性覆盖。
关闭缓冲与缓存:实时性的前提
SSE 数据必须逐行即时转发,任何缓冲都会造成秒级延迟甚至断连:
- proxy_buffering off:禁用代理级响应缓冲,强制流式透传
- proxy_cache off:SSE 响应不可缓存,否则可能返回旧事件或截断流
- proxy_request_buffering off:防止 Nginx 尝试缓存客户端请求(虽 SSE 通常无请求体,但保险起见)
- gzip off:禁用 gzip 压缩——分块流式数据被压缩后无法按行解析,浏览器会卡住
延长并协同各层级超时:避免连接被“静默切断”
单设 proxy_read_timeout 不够,网络链路中多个环节都可能主动断连:
- proxy_read_timeout 24h:设置为业务最大容忍时长(如监控系统可设 86400;金融行情建议 300–600 秒)
- proxy_send_timeout 24h:防止 Nginx 因“长时间未向客户端发数据”而关闭连接
- keepalive_timeout 24h:维持客户端到 Nginx 的 keep-alive 连接
- proxy_socket_keepalive on:启用 TCP 层保活,对抗中间防火墙/负载均衡器的空闲断连
注意:云厂商 LB(如 AWS ALB、阿里云 SLB)也有独立超时,默认常为 60 秒,需同步调大,否则 Nginx 配置再合理也无效。
协议与头信息透传:确保 SSE 语义不被污染
浏览器依赖特定响应头识别和维持 SSE 连接:
- proxy_http_version 1.1:必须启用,HTTP/1.0 不支持持久连接
-
proxy_set_header Connection "":清空 Connection 头,避免 Nginx 注入
close导致连接中断 - proxy_hide_header X-Accel-Buffering:隐藏 Nginx 自动添加的缓冲提示头
- add_header Cache-Control "no-cache" 和 add_header Access-Control-Allow-Origin "*":显式声明不可缓存、允许跨域(若需)
- 确保后端返回
Content-Type: text/event-stream,Nginx 不覆盖该头(不加add_header Content-Type,除非后端确实缺失)
负载均衡专项适配:连接分发与健康检查
在 upstream 块中需额外注意:
- least_conn 或 ip_hash:推荐 least_conn,避免某台后端堆积过多长连接;若需会话粘性(如基于内存的状态),可用 ip_hash
- keepalive 32(在 upstream 内):为每个 worker 保持与后端的空闲连接池,减少重复建连开销
- health_check interval=5 fails=3 passes=2:使用主动健康检查,但注意不要用 /health 这类短响应接口做探测——应单独提供轻量 SSE 兼容探针(如返回 200 + text/plain),避免干扰主 SSE 流
后端服务本身也需配合:每 20–30 秒发送 :keepalive\n\n 注释行,并设置 Cache-Control: no-cache 和 Connection: keep-alive 响应头。











