client_body_buffer_size 控制 POST 请求体内存缓存上限,超限部分写入临时文件;它不拒绝请求,仅影响存储位置,需与 client_max_body_size 配合使用以平衡内存与 I/O。

Nginx 的 client_body_buffer_size 指令控制的是客户端请求体(即 POST 数据)在内存中缓存的最大大小,它只在 http、server 或 location 块中生效,且仅对未被直接流式转发(如代理到后端)的请求起作用。
缓冲区大小如何影响 POST 请求处理
当客户端发送 POST 请求时,Nginx 默认会先将请求体读入内存缓冲区。若请求体大小 ≤ client_body_buffer_size,整个请求体就保留在内存中,后续模块(如 Lua、auth_request、或传递给 FastCGI/Proxy)可直接读取;若超过该值,Nginx 会把超出部分写入临时文件(路径由 client_body_temp_path 指定),此时请求体变成“磁盘+内存”混合存储。
- 内存缓冲越小,越早落盘 → 增加 I/O 开销,但节省内存
- 内存缓冲越大,越可能全程驻留内存 → 减少磁盘操作,但单请求占用更多内存
- 若设为 0,Nginx 不使用内存缓冲,所有请求体直接写临时文件(不推荐)
与 client\_max\_body\_size 的关键区别
client_max_body_size 控制的是整个请求体允许的最大尺寸(超限返回 413),而 client_body_buffer_size 只决定“多少放内存、多少写磁盘”,它本身不拒绝请求。两者常配合使用:
- 例如:设
client_max_body_size 10M,client_body_buffer_size 2M→ 小于等于 2M 的 POST 全在内存;2M–10M 的部分进内存、其余落盘 - 若后端应用(如 PHP-FPM)依赖完整请求体,且你希望减少磁盘 I/O,可适当调高 buffer(如设为 4M 或 8M),但需评估并发连接数下的内存压力
实际配置建议
默认值通常是 8k 或 16k,对纯表单提交足够,但对上传场景易触发落盘。调整时注意三点:
- 避免设得过大(如 >16M),否则高并发下可能耗尽内存
- 若使用
proxy_pass或fastcgi_pass,且后端能流式读取(如支持 chunked),可考虑关闭缓冲:client_body_buffer_size 0+proxy_buffering off(需谨慎) - 搭配
client_body_temp_path确保临时目录有足够空间和权限,尤其在 buffer 不足时落盘频繁
验证是否生效的小技巧
可通过开启 Nginx debug 日志(error_log /path/to/log debug;)观察 “*client request body buffered” 或 “*client request body temp file” 类日志;也可用 strace 跟踪 worker 进程对临时目录的 write/openat 系统调用频次变化。










