必须关闭 proxy_buffering,否则 SSE 消息会卡在 Nginx 中导致前端无法实时接收事件;需同时配置 proxy_cache off、proxy_read_timeout 86400、proxy_send_timeout 86400、proxy_http_version 1.1、proxy_set_header Connection "" 和 chunked_transfer_encoding on,并仅对 SSE 路径精准启用。

必须关闭 proxy_buffering,否则 SSE 消息会卡在 Nginx 里,前端收不到实时事件——这不是延迟几毫秒的问题,而是整段堆积、间隔数秒才突然刷出多条,彻底破坏流式语义。
为什么 proxy_buffering on 对 SSE 是硬性冲突
Nginx 默认开启 proxy_buffering,本意是聚合小响应、减少网络开销。但 SSE 的响应头是 Content-Type: text/event-stream,且持续输出形如 data: hello\n\n 的分块,不设 Content-Length,也不结束连接。一旦缓冲启用:
- Nginx 把后端发来的每条
data:截留在内存(默认最多 128KB),等填满或后端关闭才转发 - 浏览器看到的不是“逐条到达”,而是“憋住几秒后一次性吐出”,
onmessage触发严重滞后 - Wireshark 可验证:开启时 TCP 包间隔大、ACK 延迟高;关闭后每个
data:几乎立刻触发独立 TCP 包 - 更隐蔽的问题:
Connection头可能被中间设备误判为短连接而主动断开
proxy_buffering off 单独写没用,必须配齐这四组参数
只加一行 proxy_buffering off 极大概率仍失败——Nginx 会用其他机制继续“拦”住流。以下配置需全部出现在同一 location 块中:
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
-
proxy_cache off:禁用缓存层,否则 Nginx 可能尝试“缓存整个流”,导致截断或返回陈旧数据 -
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 路径必须精准隔离,别全局关 proxy_buffering
全局设置 proxy_buffering off 会拖累所有接口性能:普通 JSON API 失去响应聚合、gzip 压缩失效、小包变多、内核 socket buffer 压力上升。正确做法是按路径精细化控制:
- 只对明确的 SSE 接口路径生效,例如
location /api/events { ... }或location ^~ /sse/ { ... } - 避免用模糊匹配(如
location / { ... })覆盖全部流量 - 后端未返回正确
Content-Type时,可兜底加add_header Content-Type "text/event-stream" - 加
add_header X-Accel-Buffering no,部分浏览器兼容层会读这个头来绕过自身缓冲
最容易被忽略的是 proxy_read_timeout 和 proxy_send_timeout 的数值——设成 300 秒看起来够长,但若后端心跳间隔是 45 秒、客户端重连策略是 5 秒,Nginx 仍可能在第 7 次空闲时断开连接。真实场景下,直接设为 86400(24 小时)更稳妥,反正连接由客户端控制生命周期。










