必须关闭 proxy_buffering off,否则无法实现流式响应;还需禁用缓存、强制 HTTP/1.1、清空 Connection 头、延长读写超时,并确保分块传输与长连接稳定。

要让 Nginx 在 HTTP 代理场景下真正实现流式响应(即“边收边发”),核心不是开启某个功能,而是**关闭默认缓冲行为,并确保协议与连接机制支持持续传输**。尤其在大模型 API、SSE、长轮询或文件流式下载等场景中,配置错误会导致响应延迟、超时或内容截断。
必须关闭响应缓冲
这是最关键的一步。Nginx 默认启用 proxy_buffering on,会等后端把整个响应发完再统一转发,彻底破坏流式特性。
-
proxy_buffering off; —— 必须设为
off,否则其他配置无效 - proxy_cache off; —— 防止缓存模块意外截断或重组响应流
- proxy_buffer_size 4k; 和 proxy_buffers 8 4k; 可适当调小,减少首块延迟(非必需,但推荐)
强制使用 HTTP/1.1 并清理连接头
HTTP/1.0 不支持分块传输,且容易触发 Connection: close,中断长连接。
-
proxy_http_version 1.1; —— 显式指定版本,确保支持
chunked编码 -
proxy_set_header Connection ''; —— 清空该头,避免 Nginx 或后端误加
keep-alive或close - proxy_set_header Upgrade $http_upgrade; 和 proxy_set_header Connection "Upgrade"; —— 若需 WebSocket 或 SSE 升级,这两行不能少
延长超时并保持连接稳定
流式响应往往耗时较长,Nginx 默认超时(60秒)极易导致连接被主动断开。
- proxy_read_timeout 300; —— 等待后端响应的最长时间,建议 ≥ 后端最长空闲间隔(如 SSE 心跳间隔)
- proxy_send_timeout 300; —— 向后端发送请求体(如上传流)的超时,适用于流式上传场景
-
keepalive_timeout 300; —— 客户端连接空闲超时,配合 upstream 的
keepalive 32;复用连接
验证与避坑要点
配置完不等于生效,还需确认实际行为是否符合流式预期:
- 用
tcpdump或 Wireshark 抓包,观察 Nginx 到后端的 TCP 流是否在响应未结束时已开始向客户端发送 - 日志中加入
$body_bytes_sent,看大响应是否呈现“逐步增长”而非“一次写入” - 禁用
gzip(proxy_set_header Accept-Encoding ""),避免压缩干扰流式透传(尤其搭配sub_filter时) - 避免在该 location 中使用
auth_request、复杂rewrite或if,它们会阻塞事件循环


















