必须关闭proxy_buffering off以确保SSE实时性,还需协同配置proxy_cache off、proxy_read_timeout和proxy_send_timeout设为86400、proxy_http_version 1.1、proxy_set_header Connection ''、chunked_transfer_encoding on,并透传Content-Type、Cache-Control与CORS头,且云LB超时需同步调整。

要让后端的 SSE 或长连接业务真正实现实时推送,proxy_buffering off 是必须打开的开关,不是可选项。Nginx 默认开启 buffering,会把后端逐条发出的 data: 消息攒在内存里,等缓冲区满(默认 4KB–128KB)或连接结束才转发——而 SSE 连接永不结束,结果就是前端“一条消息也收不到”或“卡几秒后突然刷出一堆”,完全违背实时性初衷。
只关 proxy_buffering off 远远不够
单独写一行 proxy_buffering off; 无法解决问题,必须搭配以下关键配置协同生效:
- proxy_cache off;:SSE 响应不可缓存,否则 Nginx 可能截断流、返回旧数据,甚至拒绝透传 event 标头
- proxy_read_timeout 86400; 和 proxy_send_timeout 86400;:SSE 连接常空闲数分钟,超时值必须远大于客户端重连间隔(如 3 秒),否则 Nginx 主动断开后端连接,导致前端反复重连
- proxy_http_version 1.1; 与 proxy_set_header Connection '';:强制使用 HTTP/1.1 长连接,并清空 Connection 头,防止中间网关误判为短连接而关闭
- chunked_transfer_encoding on;:显式启用分块传输,避免 Nginx 尝试计算 Content-Length(SSE 不设该头)
响应头透传与兜底设置不能漏
Nginx 默认可能覆盖或屏蔽关键响应头,需主动干预:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_hide_header X-Accel-Buffering;:防止 Nginx 注入
X-Accel-Buffering: yes,误导浏览器认为仍在缓冲 - add_header X-Accel-Buffering no;:显式告知客户端“此处无缓冲”,增强兼容性
- add_header Content-Type "text/event-stream";:后端若未正确返回该类型,此行可兜底,确保浏览器识别为 SSE 流
- add_header Cache-Control "no-cache";:配合后端行为,明确禁止任何中间层缓存
- add_header Access-Control-Allow-Origin "*";:SSE 不触发预检请求(OPTIONS),CORS 头必须由 Nginx 稳定注入,不能只依赖后端
精准作用于 SSE 路径,兼顾整体性能
不要全局关闭 proxy_buffering——那会影响普通 API、HTML 页面的吞吐效率。应在 location 块中**仅对 SSE 接口路径精准关闭**:
例如:location /api/sse {<br> proxy_pass http://backend;<br> proxy_buffering off;<br> proxy_cache off;<br> proxy_read_timeout 86400;<br> proxy_send_timeout 86400;<br> proxy_http_version 1.1;<br> proxy_set_header Connection '';<br> chunked_transfer_encoding on;<br> proxy_hide_header X-Accel-Buffering;<br> add_header X-Accel-Buffering no;<br> add_header Content-Type "text/event-stream";<br> add_header Cache-Control "no-cache";<br> add_header Access-Control-Allow-Origin "*";<br>}
注意云厂商负载均衡的“双超时”陷阱
如果你用的是阿里云 SLB、腾讯云 CLB 或 AWS ALB,它们自身也有独立的空闲连接超时(常见 60–300 秒),即使 Nginx 配置全对,也会被 LB 主动切断。务必同步调整 LB 层的 idle timeout,至少设为 86400(24 小时),否则所有 Nginx 设置都白搭。

















