Nginx无法按目录路径批量清理缓存,因其缓存文件按哈希存储而非路径结构;但可通过ngx_cache_purge模块+合理proxy_cache_key设计+正则化purge规则实现按路径前缀精准清除。

Nginx 本身不支持按目录路径(如 /api/v1/)批量清理“过期”缓存文件,因为它的缓存不是按 URL 路径树结构存放的,而是通过哈希算法将 proxy_cache_key 映射为固定长度的文件名,并分散在多级子目录(如 levels=1:2 对应 c/2f/xxx)中。所以你无法直接 rm -rf /cache/api/v1/* —— 那个目录根本不存在。
但你可以实现「精准清除某前缀路径下所有缓存条目」,关键在于:让 purge 操作匹配该路径前缀的所有 key,而不是依赖文件系统目录结构。这需要配合 ngx_cache_purge 模块 + 合理的 proxy_cache_key 设计 + 正则化 purge 规则。
以下是可落地的配置方案:
✅ 用 proxy_cache_purge 实现按路径前缀批量清除
前提:已编译并启用 ngx_cache_purge 模块(检查 nginx -V | grep ngx_cache_purge)。
-
精简且可控的 cache_key
确保proxy_cache_key不含易变字段(如 cookie、时间戳),并显式包含路径前缀信息:proxy_cache_key $scheme$host$request_uri;
这样
/api/v1/users和/api/v1/posts会生成不同 key,但都以/api/v1/开头,便于后续正则匹配。 -
配置支持前缀匹配的 purge location
在server块中添加:location ~ ^/purge(/api/v1/.*) { allow 127.0.0.1; deny all; proxy_cache_purge my_cache $scheme$host$1$is_args$args; }✅ 解释:
-
^/purge(/api/v1/.*)捕获/api/v1/及其子路径(如/api/v1/users?x=1→$1为/api/v1/users) -
$scheme$host$1$is_args$args复原原始请求的完整 key,确保匹配成功 -
my_cache替换为你实际的keys_zone名称
-
-
触发批量清除
发送 PURGE 请求即可清除该路径下所有缓存(无论是否过期):curl -XPURGE http://your-domain.com/purge/api/v1/
⚠️ 注意:这不是“只删过期的”,而是删所有匹配
/api/v1/开头的缓存条目——这正是你想要的“整个目录下所有缓存”的等效操作。
✅ 补充:自动清理冷数据(防止磁盘爆满)
purge 是主动清除,而真正管理“过期后长期残留”问题,靠的是 inactive:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=1h max_size=1g;
→ 所有 1 小时内未被访问的缓存文件(包括 /api/v1/ 下的),会被 Nginx 后台自动物理删除。
❌ 不推荐的方式(风险高或无效)
- 直接
find /var/cache/nginx -name "*api/v1*" -delete:缓存文件名是哈希值,不含原始路径字符串,此命令必然失败 - 用
proxy_cache_valid控制“过期”再指望 purge 自动识别:purge完全不读取Cache-Control或max-age,它只认 key - 删除整个缓存目录:清空全部,失去选择性,影响其他业务
只要 proxy_cache_key 设计合理 + purge location 支持正则捕获,就能安全、精准地按路径前缀批量清理——这才是生产环境真正可用的“清一整个目录缓存”的做法。


















