精准清理Nginx proxy_cache需严格匹配proxy_cache_key并使用ngx_cache_purge模块:purge请求必须复用完全相同的变量组合构造key,成功后秒级删除共享内存中元数据,磁盘文件由inactive机制异步回收。

清理 Nginx proxy_cache 中指定的缓存文件,核心在于“精准匹配缓存键(key)”和“触发对应物理文件删除”。Nginx 本身不提供直接按 URL 查找并删文件的命令行工具,但可通过配置 + 请求方式实现定向清除,无需清空整个缓存目录。
确认缓存键规则(关键前提)
缓存能否被精准 purge,完全取决于 proxy_cache_key 的定义是否与你要清理的目标一致。常见配置如:
-
proxy_cache_key "$scheme$request_method$host$request_uri";→ 清理时需完整复现协议、方法、域名和路径(含查询参数) -
proxy_cache_key "$host$request_uri$is_args$args";→ 忽略请求方法,但保留所有参数 - 若含
$cookie_user或$request_body,则该缓存实际是用户级或 POST 专属,普通 purge 很难命中
建议在响应头中添加 add_header X-Cache-Key $cache_key;(需开启 underscores_in_headers on;),用浏览器或 curl 查看真实 key 值,避免因配置理解偏差导致 purge 失败。
使用 ngx_cache_purge 模块精准删除
这是最常用、最安全的指定清理方式,但需提前编译或启用该模块(OpenResty / 宝塔默认支持;官方开源版需手动编译)。
- 在 server 或 location 块中添加 purge 配置(注意 keys_zone 名称要与
proxy_cache_path中一致):
allow 127.0.0.1;
deny all;
proxy_cache_purge my_cache "$scheme$request_method$host$1$is_args$args";
}
- 执行清理:访问
curl -X PURGE http://example.com/purge/path/to/page或curl -X PURGE "http://example.com/purge/path?k=v" - 成功返回
200 Purged,失败通常为404 Not Found(key 不匹配)或405 Not Allowed(未授权)
手动定位并删除单个缓存文件(仅限调试或紧急场景)
当 purge 不可用或想验证磁盘实际状态时,可手动查找。缓存文件名由 key 的 MD5 哈希生成,目录结构由 levels=1:2 等参数决定。
- 先算出目标 URL 对应的 key 字符串(例如
httpsGETexample.com/about) - 计算其 MD5:运行
echo -n "httpsGETexample.com/about" | md5sum→ 得到类似8f4169a6e2b1c7d8e9f0a1b2c3d4e5f6 - 按
levels=1:2拆分:取最后 1 位6→ 第一级目录;倒数第 2~3 位f6→ 第二级子目录;剩余部分为文件名:/var/cache/nginx/6/f6/8f4169a6e2b1c7d8e9f0a1b2c3d4e5f6 - 确认文件存在后,
sudo rm /var/cache/nginx/6/f6/8f4169a6...
⚠️ 注意:该文件包含元数据头 + 响应体,直接删不会影响 Nginx 运行,但操作繁琐且易出错,不建议日常使用。
真正清理“过期但未访问”的缓存文件
很多人误以为 proxy_cache_valid 200 5m 到期后文件就自动消失——其实只是逻辑过期,文件仍留在磁盘。要释放空间,靠的是 inactive 参数:
- 在
proxy_cache_path中设置inactive=30m:表示该缓存条目 30 分钟内无任何请求命中,worker 进程会自动 unlink 删除对应文件 - 这个机制是异步的、后台运行的,不需要额外模块或脚本
- 它不看 Cache-Control 或 max-age,只看最后访问时间(atime),所以高频刷新的页面即使逻辑过期也不会被删


















