client_max_body_size仅设准入上限,不管理缓冲;真正控制内存缓冲的是client_body_buffer_size,二者须协同配置,否则大文件会因缓冲不足落盘失败或报500错误。

配置 client_max_body_size 本身不设置“缓冲区”,它只控制请求体(如文件上传的 POST 数据)的最大允许大小;真正管理内存缓冲行为的是另一个独立参数:client_body_buffer_size。两者必须协同配置,否则即使放宽了大小限制,大文件仍可能因缓冲不足而落盘失败、超时或报 500 错误。
client_max_body_size 和 client_body_buffer_size 的分工
client_max_body_size 是“准入门槛”:决定 Nginx 是否接收该请求。超过即直接返回 413,连缓冲环节都不进入。
client_body_buffer_size 是“暂存空间”:决定请求体在内存中能缓存多少。超出部分会写入临时磁盘文件(由 client_body_temp_path 指定),若磁盘不可写或权限不对,就会失败。
按上传类型设合理的 client_body_buffer_size
- 纯 JSON 或表单类小数据(含 JWT、长 Header):64k–128k 足够,兼顾性能与内存占用
- 头像、截图、PDF 等 ≤2MB 场景:推荐 256k–512k,多数请求全程驻留内存,避免刷盘开销
- 压缩包、视频等 ≤20MB 场景:可设为 2m–4m,但需确认单 worker 并发数 × 缓冲大小不会挤占系统可用内存
- 高并发轻量请求(如 IoT 上报):反而建议调小至 4k–8k,节省内存给更多连接
必须同步配置的三项配套参数
-
client_max_body_size 必须 ≥ client_body_buffer_size,且写在同一作用域(如都放在
location /api/upload块内),否则请求还没进缓冲就被 413 拦截 -
client_body_temp_path 路径要确保有足够磁盘空间,且 Nginx 运行用户(如
www-data)对该路径有读写权限;建议挂载到/dev/shm(内存盘)或 SSD 分区 - client_body_timeout 设为 10–60 秒,防止慢速上传长期霸占缓冲区,拖慢 worker 进程
验证是否真走内存缓冲
修改后执行 nginx -t && nginx -s reload,然后开启 debug 日志(error_log /path/to/error.log debug;),上传一个略大于缓冲区但小于 client_max_body_size 的文件,查看日志中是否出现 client request body is buffered in memory —— 出现即表示成功驻留内存。











