proxy_cache_path必须在http块顶层定义,路径需手动创建并设置正确权限,keys_zone指定内存大小,max_size限制磁盘容量,levels控制目录层级,use_temp_path=off提升性能,inactive仅影响后台清理。

缓存目录必须在 http 块顶层定义,且路径权限要对
proxy_cache_path 不是 location 里能写的指令,放错位置会报 unknown directive "proxy_cache_path"。它必须出现在 http 块最外层,早于所有 server 和 location。
实操要点:
-
/var/cache/nginx目录需手动创建:运行sudo mkdir -p /var/cache/nginx - 属主必须匹配 Nginx worker 进程用户(常见为
www-data或nginx):sudo chown www-data:www-data /var/cache/nginx - 别用
/tmp或/dev/shm——前者重启清空,后者空间小、不持久、无持久化保障 -
keys_zone=my_cache:10m中的10m是内存键区大小(存 key 的哈希索引),不是磁盘容量;max_size=1g才是磁盘上限
levels=1:2 表示缓存文件按哈希散列到子目录,不能直接 ls 看见原始 URL
Nginx 把 proxy_cache_key 做 MD5,再按 levels 规则拆成子目录。比如 levels=1:2,哈希值 43c8233266edce38c2c9af0694e2107d 对应路径是 /var/cache/nginx/d/07/(取最后 1+2 位)。你不会在顶层看到 /api/user?id=123 这样的文件名。
这意味着:
-
rm -rf /var/cache/nginx/*会递归清空全部缓存,包括其他keys_zone的数据 - 多个
proxy_cache_path若共用同一父目录(如都用/var/cache/nginx),rm -rf就是一锅端 - 若配置中用了变量(如
$hostname),路径是动态生成的,得结合实际请求和proxy_cache_key计算才能定位
use_temp_path=off 是必须加的性能优化项
默认 Nginx 先写临时文件再 rename 到目标目录,这会触发额外 IO 和锁竞争。线上环境务必加 use_temp_path=off。
典型配置写法:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
注意:inactive=60m 不是“缓存过期时间”,而是“最后一次访问后 60 分钟未被再访问就淘汰”——它依赖后台清理进程,不实时,也不影响已命中的响应。
确认真实缓存路径要用 nginx -T,别信文档或直觉
配置 reload 后,Nginx 可能没真正加载你改的 proxy_cache_path。最可靠的方式是执行:
sudo nginx -T 2>&1 | grep proxy_cache_path
输出里显示的路径才是生效的实际路径。如果看到多个结果,说明有重复定义或 include 了多处配置;如果没输出,代表该指令根本没生效——常见原因是写进了 server 块或拼写错误(比如写成 proxy_cache_path 漏了下划线)。
复杂点在于:不同站点可能用不同 keys_zone,但底层路径可能重叠;FastCGI 缓存(fastcgi_cache_path)和 proxy 缓存路径完全独立,清理时不能混着来。











