nginx缓存清理关键在于精准可控:需确认purge模块已加载、缓存区已定义、purge key与cache_key严格一致;键应标准化可追踪,接口须加ip/token/限速等访问控制;200响应不等于删除成功,需通过响应头或缓存目录验证。

要用 Nginx 的代理缓存清理(Purge)机制真正管好缓存,关键不是“能不能删”,而是“删得准、删得稳、删得可控”。它不提供自动扫描或通配匹配,只做精确键值删除。所以管理的核心是:让缓存键可预期、purge 路径可收敛、权限可锁定。
确保 purge 模块已就位且配置可用
官方主线版 Nginx 不带 proxy_cache_purge,必须确认模块存在:
- 运行
nginx -V 2>&1 | grep cache_purge,有输出才表示已加载 - 检查
proxy_cache_path是否定义了缓存区(如keys_zone=my_cache:10m),这是 purge 的操作目标 - 在对应 location 中启用
proxy_cache_purge my_cache $key,其中$key必须和缓存时的proxy_cache_key完全一致
设计可追踪、可批量构造的缓存键
缓存键决定了 purge 能否命中。混乱的 key(比如含随机 token、session ID 或未标准化的 Host 头)会让清理失效。
- 推荐 key 模式:
"$scheme$request_method$host$uri$is_args$args"—— 简洁、可复现、兼容大多数场景 - 负载均衡下务必加入后端标识,例如
"$scheme$request_method$host$uri$is_args$args|$upstream_addr",避免跨节点误删 - 若需按业务维度批量清理(如清空某类文章),把路径规则固化(如
/api/v1/posts/[0-9]+),再用脚本生成具体 key 列表发起 PURGE
把 purge 接口做成“受控入口”,而非开放后门
直接暴露 /purge/xxx 是高危操作。必须叠加访问控制层:
- 用
allow/deny限定来源 IP,例如只允运维网段10.10.5.0/24或跳板机地址 - 强制校验请求头,如
X-Purge-Token,配合map指令做白名单比对(token 建议轮换,不硬编码) - 加速率限制:
limit_req zone=purge_limit burst=2 nodelay;防探测与误刷 - 独立 location 匹配 purge 路径,例如
location ~ ^/purge(/.*)?$,避免与主业务逻辑混用
验证是否真删掉了,而不是“以为删了”
PURGE 请求返回 200 ≠ 缓存已被清除,只代表“Nginx 尝试去删了”。实际是否生效,要看 key 是否匹配、缓存是否存在、权限是否放行。
- 删完立刻用原请求测试,观察响应头
X-Cache-Status是否从HIT变为MIS或MISS - 手动查缓存目录(如
/var/cache/nginx),用find . -name "*$(echo -n "http://example.com/path" | md5sum | cut -d' ' -f1)"查文件是否存在 - 注意:带 query 参数的 URL,purge 时必须完整带上,
/api?id=1和/api?id=2是两个完全不同的 key











