要让 nginx 的某个 location 正确支持大文件分块传输,需在该 location 块内协同配置:关闭请求与响应缓冲(proxy_request_buffering off; proxy_buffering off;),强制 http/1.1 并清理 connection 头,合理设置大小限制与超时,避免 content-length 冲突及压缩干扰。

要让 Nginx 的某个 location 正确支持大文件的分块传输编码(Transfer-Encoding: chunked),重点不是“开启 chunked”,而是确保整个链路不拦截、不缓冲、不重写原始分块流。配置必须精准落在该 location 块内,且多项参数需协同生效。
必须关闭请求与响应缓冲
缓冲是流式传输的最大障碍:
- proxy_request_buffering off;:仅在该 location 中设置,让 Nginx 边收边转发上传体,避免把整个大文件缓存后再传给后端
- proxy_buffering off;:禁用响应缓冲,使后端输出的每个 chunk 都能原样透传,不攒、不重算 Content-Length
强制 HTTP/1.1 并清理连接头
HTTP/1.0 不支持 chunked,中间任何环节降级都会导致流式中断:
- proxy_http_version 1.1;:显式指定协议版本,不能依赖默认值
- proxy_set_header Connection '';:清除可能由客户端或负载均衡插入的 Connection 头,防止干扰
合理设置大小限制与超时
大文件传输周期长,超时和大小限制必须匹配实际场景:
- client_max_body_size 2g;:必须写在该 location 块中(不是 server 或 http 层),否则仍按默认 1MB 截断
- client_body_timeout 3600;、proxy_read_timeout 3600;、proxy_send_timeout 3600;:统一设为较长值(如 1 小时),适应弱网或后端处理耗时
避免内容长度冲突与压缩干扰
Content-Length 和 Transfer-Encoding 共存是非法 HTTP 行为,Nginx 会优先信任前者并丢弃 chunked:
- 后端代码中不要手动设置
Content-Length,尤其在使用流式响应(如 yield、StreamingResponse)时 - 禁用后端自动压缩中间件(如 Express compression、FastAPI gzip),它们会预读全部响应
- Nginx 自身的
gzip on在proxy_buffering off下不生效,建议显式关掉以防混淆











