Nginx在请求体超过client_body_buffer_size、启用chunked编码或client_body_in_file_only时写入client_body临时文件,路径由client_body_temp_path指定,默认为prefix/client_body_temp,文件在请求正常结束后自动清理。

Nginx 的 client_body 临时文件目录,主要用于缓存客户端上传的、超出内存阈值的请求体数据(如大文件上传、POST 表单中含大量文本或二进制内容),其存放逻辑由多个配置项协同控制,并非固定路径或简单写入。
核心触发条件:什么情况下会写入 client_body 临时文件?
当客户端发送的请求体(request body)大小超过 client_body_buffer_size 设定的内存缓冲区容量时,Nginx 会将超出部分暂存为磁盘临时文件。若整个请求体都不足以填满该 buffer,则全程在内存处理,不产生临时文件。
-
client_body_buffer_size默认通常为 8k 或 16k(取决于编译选项和系统页大小) - 即使设置了较大的 buffer,若请求体含 chunked 编码、或启用了
client_body_in_file_only on,也会强制落盘 - 当使用
proxy_pass转发请求时,Nginx 默认会先完整接收并缓存请求体,此时更易触发临时文件写入
临时文件存放路径由谁决定?
实际路径由 client_body_temp_path 指令显式指定;若未配置,则回退到编译时指定的默认临时路径(通常是 prefix/client_body_temp,即如 /usr/local/nginx/client_body_temp)。该路径必须存在且 Nginx worker 进程有读写权限。
- 支持多级子目录结构,例如:
client_body_temp_path /var/tmp/nginx/client_body 1 2;表示创建两级哈希子目录(如a/12/),用于分散文件、避免单目录海量文件性能下降 - 路径层级数字(如
1 2)代表每级子目录名取文件哈希值的字符位数,不影响功能但影响目录结构 - 该路径仅用于
client_body,与proxy_temp_path、fastcgi_temp_path等相互独立
临时文件的生命周期与清理机制
Nginx 不主动轮询或定时清理 client_body_temp 下的残留文件。临时文件在请求处理结束后由 worker 进程自行 unlink(删除),前提是请求正常结束、未被中断或超时。
- 若上传过程中连接断开、客户端取消、或后端服务响应超时(如
proxy_read_timeout触发),临时文件可能残留 - worker 进程异常退出(如 kill -9)也可能导致文件滞留
- 无内置自动清理策略,需运维侧配合脚本定期扫描 + 删除 n 天前的临时文件(建议基于修改时间 + 文件名特征过滤)
常见问题与调优建议
频繁出现大量临时文件、磁盘 IO 飙升或空间占满,往往不是路径配置错误,而是行为模式与配置不匹配所致。
- 对可信内网接口且上传可控,可适当调大
client_body_buffer_size(如 1m),减少落盘频率 - 禁用不必要的请求体缓存:若后端服务自身能流式处理(如支持 chunked 请求),可设
client_body_in_file_only off并确保client_max_body_size合理 - 避免将
client_body_temp_path指向系统盘或小容量分区;推荐挂载独立 SSD 分区并设置合理配额 - 通过
nginx -t和error_log level=debug可观察是否频繁创建/删除临时文件,辅助定位瓶颈










