proxy_cache_path 中 use_temp_path=off 可禁用临时路径,使缓存直写目标目录;use_temp_path=on 时需配合 proxy_temp_path 配置绝对路径、权限及层级结构,否则易触发跨设备错误。

proxy_cache 本身不直接配置 use_temp_path 的存放目录,真正控制临时文件路径的是 proxy_temp_path 指令,而 use_temp_path 是 proxy_cache_path 中的一个开关参数,用于决定缓存写入过程是否经过该临时路径。
简单说:
-
proxy_temp_path定义“临时文件放哪儿”; -
use_temp_path=on|off决定“缓存写入时要不要先写到那个地方再搬走”。
✅ 正确理解 use_temp_path 的作用位置
use_temp_path 只能在 proxy_cache_path 指令中设置,属于它的可选参数之一,语法如下:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=2g inactive=1d use_temp_path=off; # ← 关键:在这里设,不是在 proxy_temp_path 里
它默认是 on。设为 off 后,Nginx 会跳过 proxy_temp_path,把缓存内容直接写入 proxy_cache_path 指定的目录,不再中转。
✅ 如何配合设置临时文件目录(当 use_temp_path=on 时)
如果你保留 use_temp_path=on(比如因文件系统限制必须用临时中转),那就需要显式配置 proxy_temp_path,且必须满足三项硬性要求:
-
绝对路径:如
/var/tmp/nginx_proxy_temp,不能用相对路径或变量; -
手动创建并赋权:
mkdir -p /var/tmp/nginx_proxy_temp chown nginx:nginx /var/tmp/nginx_proxy_temp
-
指定层级结构(推荐
1 2):proxy_temp_path /var/tmp/nginx_proxy_temp 1 2;
这样 Nginx 才能把大响应体拆成类似 /var/tmp/nginx_proxy_temp/a/3f/xxx.tmp 的散列临时文件。
⚠️ 常见误区提醒
- ❌
use_temp_path不是proxy_cache或location块里的指令,不能写在proxy_cache my_cache;后面; - ❌ 不要以为配了
proxy_temp_path就自动生效——它只在proxy_buffering on且响应体溢出内存缓冲、或proxy_cache未命中回源时才被使用; - ❌ 如果
proxy_cache_path和proxy_temp_path不在同一挂载点,又没关use_temp_path,就会触发Invalid cross-device link错误,导致缓存静默失效(X-Proxy-Cache: BYPASS)。
✅ 推荐实践:优先关闭 use_temp_path
对绝大多数生产环境,更稳妥高效的做法是:
- 直接在
proxy_cache_path中设use_temp_path=off; - 删除或注释掉
proxy_temp_path配置(它此时已无作用); - 确保缓存目录所在磁盘空间充足、文件系统支持原子写入(ext4/xfs OK,NFS/overlayfs 谨慎)。
这样既避免跨设备 rename 失败,也减少一次磁盘 I/O,还能简化目录管理。
✅ 验证是否生效的小方法
重启 Nginx 后:
- 请求一个可缓存资源(如静态图片),多次
curl -I,看X-Proxy-Cache是否稳定返回HIT; - 进入
proxy_cache_path目录,检查是否有按levels=1:2生成的子目录和真实缓存文件(不是.tmp结尾); - 查
error.log,确认没有cross-device类报错。
不复杂但容易忽略。











