Nginx需配置proxy_request_buffering off等参数实现分片上传流式透传。关键包括:禁用请求体缓冲、启用HTTP/1.1并清空Connection头、不覆盖分块头、合理设置超时,确保Transfer-Encoding: chunked原样转发至后端。

在 Nginx 中使用 proxy_pass 转发超大请求体(如大文件上传、分片上传)时,若后端服务支持分片传输(例如通过 Transfer-Encoding: chunked 或分片 JSON/HTTP multipart),Nginx 默认行为可能中断或缓冲整个请求体,导致超时、内存溢出或分片语义丢失。关键在于让 Nginx 以流式方式透传请求体,避免缓存和重写。
确保 Nginx 不缓存请求体
Nginx 默认会对请求体进行缓冲(尤其是 POST/PUT),这对分片上传是致命的。需显式禁用缓冲并启用流式代理:
-
关闭请求体缓冲:设置
proxy_buffering off;—— 禁用 Nginx 对响应体的缓冲,也间接影响请求体处理逻辑;更关键的是配合下一条 -
禁用请求体读取缓冲:添加
client_body_buffer_size 128k;(按需调大)并设client_max_body_size 0;(不限制大小),但真正起作用的是:proxy_http_version 1.1;+proxy_set_header Connection ''; -
保持 HTTP/1.1 连接与透传分块头:Nginx 1.7.7+ 默认对
proxy_pass使用 HTTP/1.0,会丢弃Transfer-Encoding: chunked。必须显式启用 HTTP/1.1 并清除 Connection 头,否则后端收不到分块流:
location /upload/ {
proxy_pass https://backend/;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_buffering off;
client_max_body_size 0;
client_body_buffer_size 4m;
}允许原始分块编码透传(关键)
Nginx 默认会将带 Transfer-Encoding: chunked 的请求体自动转为 Content-Length(即缓冲全部内容再转发),这破坏了分片上传的实时性和低内存特性。要透传分块流,必须满足:
- 上游服务器(后端)明确支持
Transfer-Encoding: chunked请求 - Nginx 配置中不设置
proxy_set_header Content-Length ""或类似覆盖(Nginx 本身不会加 Content-Length,但若你手动加了就会冲突) - 确保没有启用
proxy_request_buffering on;(默认为 on,必须关掉)
从 Nginx 1.19.1 起,新增指令 proxy_request_buffering off; 是解决该问题的核心——它让 Nginx 直接流式转发原始请求(包括分块编码),不等待请求体结束:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
location /api/upload/chunked/ {
proxy_pass http://upload_backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_request_buffering off; # ✅ 关键!禁用请求体缓冲
proxy_buffering off;
}适配后端分片上传协议(如 tus、S3 presigned POST)
真实场景中,分片上传常基于标准协议(如 tus)或云存储预签名 URL。Nginx 无需理解协议,但需保证:
- 透传所有原始请求头(特别是
Tus-Resumable、Upload-Offset、Content-Range等)——默认已透传,除非你用proxy_set_header显式覆盖 - 不修改请求方法、URI 和 body 流——只要
proxy_request_buffering off开启,就能做到 - 超时设置合理:分片上传可能持续数分钟,需调大超时参数:
proxy_connect_timeout 60; proxy_send_timeout 600; # 发送单个分片的超时(如大分片慢速上传) proxy_read_timeout 600;
验证是否真正透传分块流
最直接的方式是抓包或在后端日志中检查:
- 查看后端收到的请求是否有
Transfer-Encoding: chunked头(而非Content-Length) - 用
curl -v --data-binary @large-file.bin -H "Transfer-Encoding: chunked" http://nginx/upload测试(注意:curl 默认不发 chunked,需用脚本或工具如httpie+ 插件模拟) - 观察 Nginx error log:若出现
upstream sent invalid chunked response或client closed connection,说明缓冲/协议配置有误
如果后端是 Node.js(Express/Fastify)、Python(FastAPI)、Go(net/http)等,它们原生支持 chunked request body;只要 Nginx 不拦腰截断,分片数据就能逐块抵达。

















