Nginx 通过 ngx_cache_purge 模块支持按 URL 精确清理缓存,需编译时添加模块或使用含该模块的预编译包,配置 proxy_cache_purge 指令并限制 purge 接口访问权限,以实现安全高效的缓存主动失效。

Nginx 本身不支持直接删除缓存文件,但通过 ngx_cache_purge 模块可以实现按 URL 精确清理边缘缓存,适用于 CDN、反向代理等场景下的主动失效控制。
purge 模块的安装与启用
该模块非 Nginx 官方内置,需在编译时显式添加。若使用预编译包(如 Ubuntu 的 nginx-extras),通常已包含;否则需下载源码并重新编译:
- 从 https://github.com/FRiCKLE/ngx_cache_purge 获取对应 Nginx 版本的 purge 模块代码
- 配置编译参数时加入
--add-module=/path/to/ngx_cache_purge - 确认启用后,可通过
nginx -V 2>&1 | grep -o 'cache_purge'验证是否加载成功
配置缓存区域与 purge 接口
需先定义 proxy_cache 或 fastcgi_cache 区域,再在 location 中开放 purge 权限。典型配置如下:
- 在
http块中声明缓存区:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; - 在 server 块中设置可 purge 的 location:
location ~ /purge(/.*) { allow 127.0.0.1; allow 192.168.1.0/24; deny all; proxy_cache_purge my_cache $1$is_args$args; } - 注意:$1 捕获路径,
$is_args$args保证带查询参数的 URL 也能匹配清除
触发缓存清理的几种方式
清理操作本质是向 Nginx 发送 HTTP PURGE 请求,而非 DELETE:
- 命令行调用:
curl -X PURGE http://example.com/purge/path/to/resource - 带参数的清理:
curl -X PURGE "http://example.com/purge/index.html?version=2" - 通配符清理(需配合正则匹配):模块默认不支持通配,但可通过
location ~ ^/purge/.++proxy_cache_purge的变量组合实现路径前缀批量清除 - 生产环境建议限制 purge 来源 IP,并配合认证(如 HTTP Basic Auth)增强安全性
常见问题与注意事项
purge 操作看似简单,但实际运行中容易踩坑:
- 缓存 key 必须完全一致才能命中清除——检查你的
proxy_cache_key是否包含 $host、$scheme、请求头等,确保 purge 请求构造的 key 与缓存时一致 - 返回 200 表示“已尝试清除”,不等于“缓存一定存在或已被删掉”;返回 404 表示无匹配缓存;405 表示方法不被允许(未启用 PURGE)
- 不支持异步或后台清理,大缓存区下频繁 purge 可能短暂影响性能;高频更新场景建议结合 cache_lock 或 stale 更新策略降低冲击
- OpenResty 用户可考虑用 lua-resty-cache 或自定义 Lua 脚本替代,灵活性更高










