必须关闭proxy_buffering,因其默认启用会缓存SSE数据导致延迟;需在location中配置proxy_buffering off、proxy_cache off、proxy_read_timeout 86400等协同参数,并仅对SSE路径精准关闭以兼顾性能。

处理 Server-Sent Events(SSE)时,必须关闭 proxy_buffering。Nginx 默认开启该指令,会把后端逐条输出的 SSE 数据攒在内存缓冲区里,等满或超时才发给浏览器——这直接破坏了 SSE 的实时性,导致消息延迟数百毫秒甚至整段堆积后才到达。
为什么 proxy_buffering 对 SSE 是“致命开关”
Nginx 的 proxy_buffering on 本意是优化普通 HTTP 响应:聚合小包、减少网络往返、缓解后端压力。但 SSE 的本质是“持续流式响应”,每条 data: xxx\n\n 都需立即透传。一旦启用缓冲:
- 数据被截留在 Nginx 内存中,不触发 TCP 发送
- 缓冲区大小(默认
proxy_buffer_size4KB)可能很快填满,引发意外截断或连接重置 - 后端已发送的事件头(如
Content-Type: text/event-stream)可能被延迟或覆盖
正确关闭 proxy_buffering 的操作要点
仅写 proxy_buffering off; 不够,需配合关键参数协同生效:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
proxy_cache off;:禁用缓存层,避免 Nginx 尝试“缓存整个流” -
proxy_read_timeout 86400;和proxy_send_timeout 86400;:防止空闲连接被主动断开(SSE 连接常空等数分钟) -
proxy_http_version 1.1;与proxy_set_header Connection "";:确保使用长连接,且不被中间设备误判为需关闭 -
add_header X-Accel-Buffering no;:显式告知客户端(及部分浏览器兼容层)Nginx 不做缓冲
只对 SSE 路径关闭,不影响其他接口性能
不必全局关掉 proxy_buffering。推荐按 location 精确控制:
- 对 SSE 接口(如
/events、/stream)单独配置proxy_buffering off - 普通 REST API 仍保留
on,享受缓冲带来的吞吐提升 - 这样既保障 SSE 实时性,又避免整体代理性能下降
验证是否生效的简单方法
修改配置后重载 Nginx,用 curl 检查响应头和行为:
-
curl -H "Accept: text/event-stream" http://your-domain.com/events—— 应持续输出、不中断 - 查看响应头是否有
X-Accel-Buffering: no - 对比开启/关闭前后,用浏览器 EventSource 控制台观察
message到达时间戳

















