绕过缓存与精准清除缓存是协同但分工明确的两种机制:绕过由nginx原生指令(如proxy_cache_bypass)实现请求直连后端,不删缓存;清除则依赖ngx_cache_purge模块通过purge方法删除指定key缓存条目,二者需共享一致cache_key规则并分阶段使用。

绕过缓存和精准清除缓存是两个不同目标,但可以协同使用:绕过用于临时跳过旧缓存验证新内容,精准清除则用于主动失效指定缓存条目。第三方模块(主要是 ngx_cache_purge)不负责“绕过”,而是专为“清除”设计;真正实现“绕过”的是 Nginx 原生命令如 proxy_cache_bypass 和 proxy_no_cache。两者结合的关键,在于分阶段控制——先绕过验证逻辑,再用 purge 清理对应 key。
明确绕过与清除的分工
绕过缓存(bypass)是指请求不查缓存、直接回源,常用于调试或发布后快速验证后端响应是否正确;清除缓存(purge)是指从磁盘和共享内存中真实删除某 key 对应的缓存条目,让后续请求必须回源重建。二者不能互相替代,但可按需组合:
-
绕过:靠
proxy_cache_bypass $arg_nocache或proxy_no_cache $cookie_admin等指令,由变量值触发 -
清除:靠
proxy_cache_purge指令 + PURGE HTTP 方法,严格匹配 cache key - 绕过本身不会删文件,也不影响其他用户请求;purge 则直接影响所有命中该 key 的后续请求
配置 purge 模块并确保 key 可被精准定位
精准清除的前提是 purge 请求 URI 与 proxy_cache_key 构造出的 key 完全一致。若你已在 location 中用 proxy_cache_bypass 实现按参数绕过(如 ?nocache=1),那么 purge 配置也需兼容同一套 key 规则:
- 例如 key 设为:
proxy_cache_key "$scheme$request_method$host$request_uri"; - 对应 purge location 应写成:
proxy_cache_purge my_cache "$scheme$request_method$host$1$is_args$args"; - 此时访问
/purge/api/v1/user?id=123才能清除GET example.com/api/v1/user?id=123的缓存 - 注意:绕过请求中的
?nocache=1不应参与 cache key,否则 purge 就无法覆盖它——建议把 bypass 变量排除在 key 外
结合使用的典型流程
上线新版本接口后,需要确认缓存已更新且不影响线上流量,可按以下顺序操作:
- 临时启用绕过:在对应 location 加上
proxy_cache_bypass $arg_force_reload;,然后用curl "https://example.com/api/data?force_reload=1"直接看后端返回 - 确认响应正确后,立即发送 purge 请求:
curl -XPURGE "https://example.com/api/data" - 检查响应头:
X-Cache-Status: MISS→HIT→ 再次MISS,说明 purge 生效 - 最后移除
proxy_cache_bypass行,恢复正常缓存逻辑
安全与权限控制不可省略
purge 是高危操作,必须限制调用来源,避免被恶意利用清空全站缓存:
- 只允许内网 IP 或运维平台出口 IP:
allow 10.0.1.0/24;、allow 127.0.0.1; - 务必以
deny all;收尾,防止默认放行 - 不要在 purge location 中开启
proxy_pass或其他代理逻辑,保持纯粹性 - 生产环境建议将 purge 接口统一走内部 API 网关,由鉴权层前置校验











