proxy_cache_purge模块不能自动清理过期缓存,仅支持按URI或自定义key主动删除;过期资源由proxy_cache_valid与inactive机制异步淘汰,purge是人工/程序化精准清除手段,需二者配合且确保purge key与cache_key严格一致。

使用 proxy_cache_purge 模块不能直接清理“已过期”的缓存文件,它只支持按请求 URI(或自定义 key)主动触发删除,不自动识别过期状态。真正清理过期资源靠的是 Nginx 自身的缓存淘汰机制(proxy_cache_valid + inactive),而 purge 是人工/程序化强制清除的补充手段。实战中需二者配合,并注意配置细节。
确认模块已启用并正确加载
Nginx 官方主线版本默认不包含 proxy_cache_purge,需确认你使用的是含该模块的发行版(如 OpenResty、Tengine)或自行编译时添加了 --add-module=ngx_http_proxy_cache_purge_module。运行以下命令验证:
nginx -V 2>&1 | grep -o 'proxy_cache_purge'
若无输出,说明未启用,需重新部署支持 purge 的 Nginx。
基础 purge 配置:定义缓存区与 purge 接口
在 http 或 server 块中声明缓存路径和 purge 权限控制:
- 用
proxy_cache_path设置缓存目录,并指定keys_zone名称(如STATIC_CACHE),这是 purge 操作的依据 - 在需要提供清理入口的 location 中启用
proxy_cache_purge,通常限制为内部 IP 或带鉴权头,避免被恶意调用 - 示例配置片段:
proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=STATIC_CACHE:100m inactive=12h max_size=5g;
server {
listen 80;
server_name example.com;
location ~ ^/purge/(.*)$ {
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
proxy_cache_purge STATIC_CACHE "$scheme$request_method$host$1";
}
location /static/ {
proxy_pass https://backend;
proxy_cache STATIC_CACHE;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
}
注意:$scheme$request_method$host 必须与后端实际缓存 key 一致(默认是 $scheme$proxy_host$request_uri),否则 purge 失效;建议统一用 proxy_cache_key 显式定义。
安全触发 purge:curl 示例与常见错误
清理 /static/js/app.js 缓存,向 /purge/static/js/app.js 发送 PURGE 请求:
curl -X PURGE http://example.com/purge/static/js/app.js
返回 204 No Content 表示成功;404 Not Found 表示该 URI 当前未被缓存;405 Method Not Allowed 通常是 location 未允许 PURGE 方法(需加 limit_except 或显式 if ($request_method = PURGE) { ... });403 Forbidden 是 IP 不在白名单内。
配合过期策略实现“准自动”清理
虽然 purge 不自动过期,但可结合业务流程做轻量自动化:
- 发布新版本静态资源时,由 CI/CD 脚本批量调用 purge 接口,清空对应路径(如
/purge/static/css/) - 对带版本号的资源(
/static/v2.3.1/app.js),无需 purge —— 浏览器 URL 变更即自然绕过旧缓存 - 对无版本号资源,可在更新后立即 purge,同时设置较短的
inactive=10m,让 Nginx 在 10 分钟内自动清理长时间未访问的过期条目
关键点:过期(expired)≠ 删除(deleted)。Nginx 只在 serving 时检查过期并回源刷新,或在 inactive 时间后异步清理磁盘文件。purge 是即时、精准的干预手段。


















