Nginx透传chunked需关闭proxy_buffering、启用proxy_http_version 1.1、清空Connection头、禁用cache与redirect,并确保上游真实返回合法chunked响应(无Content-Length冲突)。

要让 Nginx 通过 ngx_http_proxy_module 正确透传流式分块传输(Transfer-Encoding: chunked),核心不是“开启某个模块”,而是关闭缓冲、明确协议版本、避免头冲突——因为 Nginx 默认会缓存响应并重写头部,从而破坏流式行为。
确保上游实际返回 chunked 响应
这是前提。后端服务(如 Flask、FastAPI、Node.js SSE 接口)必须:
- 使用 HTTP/1.1 协议响应
- 设置
Transfer-Encoding: chunked - 不同时发送
Content-Length(二者互斥,否则 Nginx 会优先信任Content-Length并丢弃 chunked) - 不主动关闭连接(保持 keepalive)
关键代理配置项
在对应 location 块中设置以下指令:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_http_version 1.1;:强制使用 HTTP/1.1,chunked 是其原生特性 -
proxy_buffering off;:禁用响应缓冲——这是最关键的一步,否则 Nginx 会收完整个响应再发,自动转为Content-Length -
proxy_set_header Connection '';:清空 Connection 头,防止上游或 Nginx 自行添加close或keep-alive干扰流式连接 -
proxy_cache off;:避免缓存机制介入,导致响应延迟或截断 -
proxy_redirect off;:防止重定向头干扰原始流式语义
典型流式场景配置示例
适用于 SSE、GPT 流式响应、实时日志推送等:
location /api/stream/ {
proxy_pass http://backend;
proxy_http_version 1.1;
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_set_header Connection '';
proxy_buffering off;
proxy_cache off;
proxy_redirect off;
}
验证是否生效
不要只看响应头,要观察真实流行为:
- 用
curl -v http://your-nginx/api/stream/查看原始响应流,确认有类似8\r\nhelloxxx\r\n0\r\n\r\n的分块格式 - 响应头中应包含
Transfer-Encoding: chunked,且无Content-Length - 检查 Nginx error log,排除
upstream sent no valid HTTP/1.1 header类警告 - 若响应明显延迟或整块返回,大概率是
proxy_buffering仍为 on 或后端未真正启用 chunked

















