nginx代理sse必须关闭proxy_buffering,否则缓冲会导致事件延迟到达;还需禁用缓存、调大读写超时、启用http/1.1和分块传输,并设置正确响应头。

要让 Nginx 正确代理 SSE 流式响应,proxy_buffering off 是最核心、不可省略的配置。它不是“可选优化”,而是解决前端收不到实时事件的根本手段。
SSE 为什么必须关掉 proxy_buffering
SSE 依赖持续不断的 HTTP 响应流,每条事件以 data: ...\n\n 形式逐块发出。而 Nginx 默认开启 proxy_buffering on,会把后端发来的数据先攒在内存缓冲区(默认最多 128KB),等填满或后端结束才一次性转发——这直接破坏了流式语义,导致前端“卡住几秒后突然刷出一大段”,完全失去实时性。
抓包可验证:开启 buffering 时,Wireshark 显示 TCP 包间隔大、ACK 延迟高;关闭后,每个 data: 行几乎立刻触发一个独立 TCP 包。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
只关 buffering 还不够:必须协同关闭缓存与调整超时
proxy_buffering off 必须搭配以下三项,否则仍可能失效或中断连接:
- proxy_cache off:SSE 响应不可缓存,否则 Nginx 可能截断流或返回过期内容
- proxy_read_timeout 86400(即 24 小时):SSE 连接常保持数分钟以上,该值需远大于客户端重连间隔(如 3 秒),避免 Nginx 主动断开后端连接
- proxy_send_timeout 86400:防止 Nginx 在空闲发送阶段因无数据而关闭连接
关键头设置与协议细节不能漏
SSE 要求 HTTP/1.1 长连接和干净的传输通道:
- proxy_http_version 1.1:强制使用 HTTP/1.1,支持 keep-alive
- proxy_set_header Connection '':清空 Connection 头,防止中间设备误判为短连接并关闭
- chunked_transfer_encoding on:显式启用分块编码,确保 Nginx 不尝试计算 Content-Length(SSE 不设该头)
- add_header Content-Type "text/event-stream":确保浏览器识别为 SSE 流(后端未正确返回时兜底)
- add_header Cache-Control "no-cache":明确禁止缓存,配合后端行为
生产环境推荐的最小化 location 配置
假设 SSE 接口路径为 /api/events,后端运行在 http://127.0.0.1:8080:
location /api/events {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
chunked_transfer_encoding on;
add_header Content-Type "text/event-stream";
add_header Cache-Control "no-cache";
}










