Nginx无全局临时目录指令,必须按模块显式配置client_body_temp_path、proxy_temp_path、fastcgi_temp_path等绝对路径,且物理隔离、权限可控、禁用/tmp类系统路径。

Nginx 没有“全局临时目录”开关,安全隔离的临时文件写入必须按模块显式配置路径,并确保物理隔离、权限可控、挂载合理。核心是把 client_body、proxy、fastcgi 等各类临时路径全部从默认位置(如 /var/cache/nginx 或 /tmp)迁出,指向独立、受控的目录或内存盘。
用绝对路径 + 独立目录做物理隔离
每个 _temp_path 指令都必须用绝对路径,且不能共用同一磁盘分区:
-
client_body_temp_path /data/nginx/upload 1 2;—— 大文件上传暂存,推荐两级子目录(1 2)提升 inode 效率 -
proxy_temp_path /data/nginx/proxy 1 2;—— 代理响应缓冲,避免与上传路径争抢 I/O -
fastcgi_temp_path /data/nginx/fastcgi 1 2;—— PHP-FPM 响应暂存,若启用fastcgi_pass必须配置 - 所有路径都要提前创建:
mkdir -p /data/nginx/{upload,proxy,fastcgi} - 设对权限:
chown -R nginx:nginx /data/nginx(用户需与 Nginxuser指令一致)
避开系统临时区,禁用 /tmp 类路径
/tmp 和 /var/tmp 会被系统自动清理,也可能被其他进程写入,不适合存放 Nginx 临时文件:
- 绝对不要在配置中写
client_body_temp_path /tmp/nginx_client; - 若启用了 systemd 的
PrivateTmp=yes,Nginx 进程看到的/tmp是隔离的 tmpfs,但 Nginx 自身不感知该机制——仍需显式配置所有_temp_path到外部路径(如/var/lib/nginx/xxx),否则会因路径不可写而报错 - 建议路径统一放在
/var/lib/nginx/或/data/nginx/这类专用数据区,不在 Web 根目录下,也不在系统临时目录树中
用 tmpfs 实现内存级隔离(可选高阶方案)
对性能敏感场景,可将临时目录挂为 tmpfs,彻底规避磁盘 I/O:
- 例如挂载上传临时区:
mount -t tmpfs -o size=512m,mode=700 tmpfs /data/nginx/upload - 对应配置保持不变:
client_body_temp_path /data/nginx/upload 1 2; - 注意:tmpfs 占用内存,需预留足够空间并监控使用量;生产环境建议搭配
size=限制,防止 OOM - 代理缓存也可走内存:
proxy_cache_path /dev/shm/nginx_cache ... use_temp_path=off;,此时proxy_temp_path不再生效,必须删掉
配合权限与监控防堆积
路径配置只是第一步,还需配套措施保障长期安全:
- 禁止使用
noatime挂载选项(对 tmpfs 无效,但对 SSD/NVMe 数据盘有效),减少元数据写入开销 - 定期检查临时目录大小:
du -sh /data/nginx/*,异常增长可能意味着后端未正常关闭连接或超时设置过长 - 添加简单清理脚本(如每天清空 1 小时前的空子目录),或用
find /data/nginx/upload -type d -empty -mtime +1 -delete - 日志中记录异常临时文件操作:
error_log /var/log/nginx/error.log warn;,关注open() "/data/nginx/..." failed (13: Permission denied)类报错


















