关闭 proxy_buffering 可实现流式输出,适用于 SSE 等场景;需配合 proxy_buffer_size、tcp_nodelay 等配置,并确保后端主动 flush 且响应头正确。

关闭 proxy_buffering 可让 Nginx 将后端响应逐块转发给客户端,实现流式输出,适用于 SSE、长连接日志推送、大文件分块下载等场景。
proxy_buffering off 的作用机制
默认情况下,Nginx 会缓存后端完整响应(或至少一个 buffer 大小)再统一发送。设为 off 后,Nginx 不做缓冲,收到后端的每个 TCP 数据包(只要含响应体内容),就立即尝试转发给客户端。注意:这仅影响响应体(response body),状态行和响应头仍会等待后端发完 header 后一并发出(除非配合 proxy_buffer_headers off,但该指令不推荐随意关闭)。
必要配套配置项
单设 proxy_buffering off 常常不够,需协同调整以下几项:
- proxy_buffer_size:保持合理值(如 4k),它只控制响应头缓冲区,不影响流式体传输
- proxy_buffers:可保留默认(如 8 4k),实际不启用,但不能设为 0
- proxy_busy_buffers_size:建议设为与 proxy_buffer_size 相同(如 4k),避免意外阻塞
- tcp_nodelay on:禁用 Nagle 算法,减少小包延迟,提升实时性
- chunked_transfer_encoding off(可选):若后端已自行分块(如用 Transfer-Encoding: chunked),可关掉 Nginx 的自动分块,避免嵌套
后端与协议配合要点
流式生效依赖后端主动 flush 输出,并保持连接不关闭:
- 后端需禁用自身输出缓冲(如 PHP 的 ob_end_flush() + flush()、Python Flask 的 yield + response.stream、Node.js 的 res.write() 后调用 res.flush())
- 确保响应头中包含 Content-Type(如 text/event-stream、text/plain)和 Cache-Control: no-cache,避免浏览器或中间代理缓存
- 对于 SSE,必须设置 Content-Type: text/event-stream,并保证每条消息以 \n\n 结尾;Nginx 不会修改消息格式,只透传
- 避免后端返回 Content-Length,否则部分客户端可能等待“满长”才开始解析
调试与验证方法
确认是否真正流式输出,可通过以下方式验证:
- 用 curl -N http://your-domain/endpoint(-N 关闭 curl 自身缓冲),观察响应是否逐段打印
- 浏览器开发者工具 Network 面板中查看 Response 时间轴,看“Transferred”列是否随时间持续增长
- 在 Nginx 日志中开启 $upstream_http_content_length 和 $upstream_response_time,对比首字节时间和总耗时差值
- 临时加 add_header X-Buffering $sent_http_content_length;,检查响应头是否动态变化(需配合后端实时更新长度)
不复杂但容易忽略


















