要让 nginx 处理 post 请求体时尽量不写磁盘,必须依据 p95/p99 请求体大小(非平均值)设 client_body_buffer_size,并上浮 25% 规避临界点(如 p99=300kb 应设 512k),同时严格同步配置 client_max_body_size、client_body_temp_path 和 client_body_in_file_only off。

要让 Nginx 处理 POST 请求体时尽量不写磁盘,client_body_buffer_size 不能盲目调大,而得按真实请求体大小精准设值,并绕开内部 25% 安全余量触发的临界点。
按业务请求体 P95/P99 值设缓冲大小
平均值没用,必须从 access log 的 $request_length 或前端上报的 Content-Length 中统计 P95 或 P99:
- 纯 JSON 接口(含 JWT):P99 通常在 80–120KB → 设
128k或256k - 带 Base64 图片的表单(头像、截图):P99 达 300–500KB → 设
512k - 文档/压缩包直传(≤20MB):P95 在 1.5–3MB → 设
2m~4m,但需后端同步支持
避开“差一点就落盘”的临界陷阱
Nginx 实际分配内存时会自动加约 25%(size += size >> 2)。比如设 256k,系统按 ~320KB 分配;若实测最大请求体是 319KB,看似够,但因余量逻辑易误判溢出,仍可能落盘:
- 实测最大为 319KB?别设
256k或320k,直接上探到384k或512k - 前端限制上传 ≤512KB → Nginx 设
client_body_buffer_size 512k更稳妥 - 避免卡在
1m、2m等整数边界附近,容易因余量计算失效
必须同步配齐的三项关键参数
只改 client_body_buffer_size 几乎无效:
-
client_max_body_size必须 ≥ 缓冲区值,且放在同一location块内;否则合法大请求直接返回 413 -
client_body_temp_path目录需存在、Nginx worker 用户(如www-data)可写,建议挂载tmpfs或专用 SSD 分区,例如:/dev/shm/nginx-body 1 2 -
client_body_in_file_only off(默认值),一旦设为on,所有请求强制落盘,缓冲区完全失效
验证是否真走内存,不靠猜测靠日志
配置 reload 成功 ≠ 生效,必须观测运行态行为:
- 开启 debug 日志:
error_log /var/log/nginx/debug.log debug; - 压测或真实上传后,搜索日志关键词:
http client request body buffered(走内存)或temp file(落盘) - 配合
iostat -x 1观察client_body_temp_path所在磁盘的write/s是否明显下降











