Nginx proxy_cache_purge不支持通配符,仅精确匹配cache key;需通过脚本生成key列表批量PURGE,或用proxy_cache_bypass+自定义header实现软清理,并注意location匹配、Host头、缓存生效等坑。

Nginx 官方模块 ngx_http_proxy_cache_purge 本身不支持通配符(如 /api/v1/users/* 或 /static/css/*.css)直接匹配清理,它只接受**完全精确匹配的 URI**。所谓“通配符批量清理”,本质是通过外部逻辑生成一批确定的缓存键(cache keys),再逐个或批量触发 purge 请求实现。下面讲清楚怎么做、踩什么坑、怎么稳。
理解 purge 的真实作用对象:cache key,不是原始 URI
proxy_cache_purge 清理的是 Nginx 缓存中存储的「key」,而这个 key 默认由 proxy_cache_key 指令定义(常见为 $scheme$proxy_host$uri$is_args$args)。这意味着:
- 即使你请求
/api/v1/users/123和/api/v1/users/456,只要它们的 cache key 不同,就必须分别 purge; - 带不同 query 参数的请求(如
?t=1vs?t=2)会产生不同 key,不能靠删路径前缀一并清除; - 如果你用了
proxy_cache_key $host$request_uri,那 purge 时必须带上完整 query string,例如:curl -X PURGE "http://example.com/api/v1/data?id=100"。
实战:用脚本 + map 构建“伪通配符”批量清理能力
没有魔法,但可以低成本模拟。核心思路:把“要清哪些路径”的业务规则,翻译成一组可枚举的 cache key,并用自动化方式发 PURGE。
-
步骤 1:定义可预测的缓存 key 规则
避免使用难以枚举的变量(如随机 token、用户 session ID)。例如,对资源类接口统一按
/assets/{type}/{id}设计,且不带敏感参数; -
步骤 2:用 Nginx map 构建路径白名单(可选但推荐)
在 nginx.conf 中声明允许 purge 的路径模式,防止恶意调用:
map $request_uri $purge_allowed { ~^/api/v1/posts/.*$ 1; ~^/static/images/.*\.(png|jpg|webp)$ 1; default 0; }然后在 location 中加限制:if ($purge_allowed = 0) { return 403; }; -
步骤 3:编写清理脚本(Python / Bash 示例)
比如要清空所有文章详情页缓存(
/api/v1/posts/123,/api/v1/posts/456…),可从数据库或 CMS 获取最新 ID 列表,生成 purge URL 并并发请求:for id in $(cat post_ids.txt); do curl -X PURGE "https://cdn.example.com/api/v1/posts/$id" -H "Host: example.com" done更健壮的做法是用 Python + requests 控制超时、重试、限速;
进阶技巧:用 proxy_cache_bypass + 自定义 header 实现“软清理”
当无法精确知道所有 key(比如评论数实时变化导致 cache key 动态含时间戳),可改用“绕过缓存”策略,让下一次请求强制回源,等新内容写入后旧缓存自然过期:
- 在需要清理的场景(如后台发布新文章),向 Nginx 发一个带特殊 header 的请求:
curl -H "X-Refresh-Cache: true" https://example.com/api/v1/posts/123; - Nginx 配置中捕获该 header,并设置
proxy_cache_bypass $http_x_refresh_cache; - 同时配
proxy_cache_valid 200 10s,保证“绕过”只是临时行为,不影响长期缓存效率。
避坑提醒:几个高频翻车点
-
没开 purge 方法支持:确认编译时启用了 --with-http_v2_module 和 purge 模块,且配置中有
proxy_cache_purge on;; -
location 匹配不到 purge 请求:PURGE 是方法名,不是路径,确保你的 location 能覆盖到对应 host + uri,例如用
location / { ... proxy_cache_purge $purge_variable; }; -
HTTPS 下 Host 头缺失导致 key 不一致:curl 测试时务必加
-H "Host: yourdomain.com",否则 Nginx 可能用 IP 当 host,生成错误 key; -
缓存未生效就 purge:先确认响应头有
X-Proxy-Cache: HIT或MISS,再操作,避免“清了个寂寞”。











