必须关闭 proxy_request_buffering,因为默认开启会导致大文件上传时串行等待、内存或磁盘耗尽、超时中断及与分片逻辑冲突;应置于 location 块内,搭配 proxy_buffering off 等参数协同调优。

proxy_request_buffering 是 Nginx 控制请求体是否预读缓存的关键开关,它不解决“上传慢”,但直接决定大文件上传能否成功、是否吃光内存、会不会卡死或返回 504。
为什么必须关掉 proxy_request_buffering?
Nginx 默认开启 proxy_request_buffering on,意味着它会把整个客户端上传的请求体(比如一个 200MB 的分片)先完整接收、暂存到磁盘或内存,再统一转发给后端。这对小请求没问题,但对大文件上传就是灾难:
- 上传过程变“串行”:必须等全部数据收完才发给后端,无法流式透传
- 内存或磁盘临时目录压力陡增:尤其并发多时,
/var/lib/nginx/body/可能被占满或 I/O 打满 - 容易触发超时:弱网下分片传输慢,Nginx 却在等“收完”,
client_body_timeout或proxy_send_timeout容易中断 - 和分片上传逻辑冲突:前端按 chunk 发送,后端期望边收边处理,Nginx 却硬要攒齐再交
在哪配?怎么写才有效?
这个指令必须放在 处理上传路径的 location 块内,不能只写在 http 或 server 层——否则可能影响其他不需要关闭缓冲的接口。
正确示例(针对上传接口):
proxy_pass http://backend;
proxy_request_buffering off;
proxy_buffering off;
client_max_body_size 2G;
}
注意:proxy_request_buffering off 是 1.13.10+ 版本才支持的核心项,旧版本无效;同时建议搭配 proxy_buffering off,避免响应阶段也缓存阻塞。
关掉之后,Nginx 怎么转发?
关闭后,Nginx 改为“边收边转”模式:
- 客户端每发来一段数据(如 8MB 分片),Nginx 立即转发给后端,不等待全部上传完成
- 后端可实时接收、校验、落盘或合并,响应也能更快返回(比如返回“分片接收成功”)
- 连接保持轻量,内存占用稳定,不再因单个大上传导致 worker 进程卡顿
这正是分片上传(如 tus、web-upload、自研 chunk 机制)真正需要的代理行为。
配套必须调的几项
单独关 proxy_request_buffering 不够,还需同步调整:
-
client_max_body_size:设为实际最大分片或整文件大小,如
client_max_body_size 2G; -
client_body_timeout:设长(如
300s),防止网络抖动导致单次分片传输中途断连 - proxy_send_timeout 和 proxy_read_timeout:分别设为 ≥300s,覆盖分片发送与后端处理耗时
- client_body_temp_path(可选):确认该路径空间充足、权限正确,即使不缓存,Nginx 仍可能用它做中转


















