Nginx代理流式响应需关闭proxy_buffering并协同调大超时参数。必须设proxy_buffering off;配proxy_http_version 1.1、proxy_set_header Connection '';禁用proxy_cache和gzip;合理设置proxy_read_timeout、proxy_send_timeout。

要让 Nginx 正确代理流式响应(如 SSE、大模型 chat 接口、长轮询、分块下载),关键不是“延长超时”本身,而是让 Nginx 放弃缓冲、保持连接、按需转发——否则再大的超时值也救不了卡顿和截断。
必须关闭 proxy_buffering
这是所有流式场景的第一前提。默认 proxy_buffering on 会让 Nginx 把后端逐段输出的数据攒在内存或磁盘缓冲区里,等收完或超时才一次性发给客户端,彻底破坏“边收边发”特性。
- 只在对应流式路径中设置:proxy_buffering off;(例如
location /sse、location /chat、location /api/stream) - 不要全局关闭,避免影响普通接口性能
- 这一行不加,其他配置基本无效
超时参数要分层协同调大
流式响应的耗时主要分布在“等待新数据到达”环节,而非单次传输。三个超时参数需配合业务节奏设定:
- proxy_read_timeout:控制 Nginx 等待后端下一段数据的最长时间(从上一段发完开始计)。SSE 常设 3600s(1小时),大模型接口建议 300–600s
- proxy_send_timeout:控制 Nginx 向客户端发送响应时,两次 write 操作的最大间隔。应 ≥ 后端 flush 间隔(如每 30 秒发一次心跳,则设为 45s;无心跳可设 300s)
- proxy_connect_timeout:仅管建连,一般保持 5–10s 即可,无需拉长
协议与连接头必须显式对齐
HTTP/1.0 或错误的 Connection 头会导致连接反复关闭,破坏流式连续性:
- 强制使用 HTTP/1.1:proxy_http_version 1.1;
- 清空 Connection 头:proxy_set_header Connection '';(防止 Nginx 或后端误加 close)
- 若需支持升级(如 SSE + WebSocket 共存):proxy_set_header Upgrade $http_upgrade; 和 proxy_set_header Connection "Upgrade";
配套禁用干扰项
一些看似无关的默认行为会悄悄破坏流式透传:
- 关闭缓存:proxy_cache off;(防止缓存模块截断或重组响应流)
- 禁用 gzip:proxy_set_header Accept-Encoding "";(压缩会延迟输出,且可能与分块边界冲突)
- 避免在该 location 中使用
auth_request、复杂rewrite或sub_filter,它们会阻塞事件循环


















