Nginx不支持真正意义上的请求体分段缓存,其处理本质是缓冲+落盘+透传;应通过client_body_buffer_size控制内存缓冲、client_max_body_size设硬限制、client_body_temp_path启用临时落盘、proxy_request_buffering off实现流式透传,并配合超时机制防拖垮。

Nginx 不支持真正意义上的“请求体分段缓存”——它无法像后端应用那样边接收、边解析、边处理流式请求体(如逐块解析 JSON 数组或 multipart 表单字段)。所谓“分段缓存”,实际是误解;Nginx 的请求体处理本质是缓冲+落盘+透传,优化目标应是:避免整块驻留内存、及时释放资源、按需交由后端流式消费。
以下是生产中切实可行的配置逻辑,聚焦请求体(request body)在反向代理场景下的高效流转:
控制内存缓冲大小,防止单连接吃光内存
每个请求体默认加载进内存缓冲区,大小由 client_body_buffer_size 决定:
- 小型 API(JSON/表单,<16KB):设为
16k或32k - 含 Base64 图片或长文本:可放宽至
64k~128k,但需评估 worker 进程内存余量 - ❌ 避免设
1m或更大——高并发下极易触发 OOM
同时必须配合硬限制:
client_max_body_size 10m; # 超过直接返回 413,不进缓冲流程
启用临时文件落盘,作为内存溢出的安全兜底
当请求体超过 client_body_buffer_size,Nginx 自动写入磁盘(非“缓存”,而是临时中转):
client_body_temp_path /var/tmp/nginx/client_body 1 2;
-
1 2表示两级哈希子目录,防文件堆积 - 目录需有写权限,且磁盘空间充足
-
client_body_in_file_only off;(默认值,切勿开启——否则所有请求强制落盘,徒增 IO)
按需关闭代理缓冲,实现流式透传
若后端(如 Node.js、Go、Python FastAPI)支持流式读取(如 req.body 流、io.Copy),可跳过 Nginx 缓冲:
location /upload/ {
proxy_request_buffering off; # 关键:禁用缓冲,直通转发
proxy_pass http://backend;
}- 此时 Nginx 不等待请求体收完,边收边发,内存占用趋近于零
- 前提:后端必须能处理未完成的请求体(例如不依赖
$request_body变量) - ⚠️ 不适用于需要
auth_request、Lua 脚本读取完整 body 的场景
配合超时与熔断,防止慢请求拖垮服务
client_body_timeout 12s; # 两次读取间隔超时,防慢速攻击 proxy_read_timeout 60s; # 后端响应超时 proxy_send_timeout 60s; # 向后端发数据超时
- 长上传场景可适当调大,但建议搭配
client_max_body_size和前端分片上传使用
不复杂但容易忽略。


















