client_max_body_size是硬限制(超限返回413),client_body_buffer_size是内存缓冲策略(超则落盘);二者须同级配置且前者≥后者,还需同步设置client_body_temp_path和client_body_timeout。

在 Nginx 中配置客户端请求体大小,核心是协调两个指令:client_max_body_size 控制是否拒绝请求(硬限制),client_body_buffer_size 控制请求体进内存还是落磁盘(性能策略)。两者必须同级配置在 http 块中,缺一不可。
明确两者的分工与依赖关系
client_max_body_size 是“闸门”:它决定请求体最大允许多大,超限直接返回 413 错误。默认为 0(无限制),生产环境必须显式设置,例如 client_max_body_size 20m;。
client_body_buffer_size 是“缓存策略”:它指定每个请求体最多用多少内存暂存。默认 8KB(x86/x64 平台)。若请求体超出该值,Nginx 会把溢出部分写入临时文件——哪怕只超 1 字节。
关键约束:client_max_body_size 的值必须 ≥ client_body_buffer_size。否则,一个合法的大请求(比如 16KB)可能因缓冲区设为 32KB 而被提前拦截(因 32KB > client_max_body_size 未同步增大)。
避开 25% 自动余量陷阱
Nginx 实际分配缓冲区内存时,会在你配置的 client_body_buffer_size 基础上自动加 25%(即 size += size >> 2)。这意味着:
- 设
256k→ 实际尝试分配约 320KB - 但若业务最大请求体是 255KB,设 256k 极易因余量计算偏差导致意外落盘
- 更稳妥的做法是向上取整:最大请求体 255KB → 设
384k或直接512k
前端若限制上传 ≤512KB,client_body_buffer_size 512k 就是合理起点。
配套参数必须同步声明
仅改 client_body_buffer_size 几乎无效,以下三项需在同一 http 块中完整配置:
-
client_max_body_size:必须 ≥ 缓冲区值,如
client_max_body_size 512k; -
client_body_temp_path:指定可写的临时目录,如
client_body_temp_path /var/tmp/nginx/client_body 1 2;;确保 worker 进程用户有读写权限、磁盘空间充足、I/O 稳定 -
client_body_timeout:建议设为
30s,防慢速上传长期占用缓冲区或临时文件句柄
验证是否真正生效
不能只看配置重载成功,要观测运行态:
- 开启 debug 日志:
error_log /var/log/nginx/debug.log debug;,搜索关键词http client request body buffered(走内存)或temp file(落盘) - 用
curl -v -X POST --data-binary @test.bin http://your.site/upload发送典型请求,观察响应头是否含自定义标识(如通过 Lua 注入X-Body-Status: in-memory) - 监控磁盘 I/O 和
/proc/[pid]/status中的 RSS 变化,确认大请求未频繁触发临时文件写入


















