client_max_body_size是准入上限,不等于调缓冲区,必须与client_body_buffer_size、client_body_temp_path、client_body_timeout等协同配置,否则大文件上传仍会失败或报错。

调整 client_max_body_size 本身不等于“调缓冲区”,但它必须和缓冲相关参数协同配置,否则大文件上传仍会失败、中断或报错(如 413、500、502)。关键不是单独放大一个值,而是让 Nginx 的请求体接收机制整体适配业务需求。
client_max_body_size 和缓冲参数的关系
client_max_body_size 是“准入上限”,决定是否允许请求进入;而 client_body_buffer_size 和 client_body_temp_path 才真正控制“怎么存”——是全放内存,还是落盘暂存。两者配合不当,就会出现:
- 设了
client_max_body_size 100m,但client_body_buffer_size还是默认的 8k → 每次上传都刷磁盘,慢且易因权限/空间失败 - 临时路径
/tmp权限不对或磁盘满 → Nginx error.log 报open() failed (13: Permission denied),实际返回可能是 500 或 502,而非 413 - 只调大
client_max_body_size,没延长client_body_timeout→ 弱网上传中途超时,直接断连
推荐的缓冲组合配置(写在同个 location 块内)
针对明确的上传路径(如 /upload、/api/file),建议这样写:
-
client_max_body_size 200m;—— 按业务最大单次上传设定(如高清报告、样品集) -
client_body_buffer_size 1m;—— 大于默认 8k,减少刷盘频次;小于max_body_size,避免内存浪费 -
client_body_temp_path /var/tmp/nginx-body 1 2;—— 指向独立分区,确保空间充足、权限可控(chown www-data:www-data /var/tmp/nginx-body) -
client_body_timeout 300s;—— 给弱网用户 5 分钟传完请求体
要不要把 buffer 设成和 max_body_size 一样大?
可以,但仅限低并发、内存充裕场景:
- 设
client_body_buffer_size 200m;+client_max_body_size 200m;→ 全程走内存,无磁盘 I/O,最快最稳 - 风险:每个上传连接独占 200MB 内存,10 个并发就吃掉 2GB,容易 OOM
- 不推荐在生产环境全局使用,更适用于内网可信服务或短时批量任务
别漏掉代理转发时的配套超时
如果 Nginx 是反向代理(比如转给 Spring Boot),还需同步加:
-
proxy_read_timeout 3600;—— 等后端完整接收并处理完大 body proxy_send_timeout 3600;-
proxy_buffering off;和proxy_request_buffering off;(Nginx ≥1.13.10)→ 避免 Nginx 缓冲整个 body 再转发,降低延迟和内存压力


















