nginx 的 proxy_cache_purge 模块仅支持按 URI 主动清除缓存,不负责定时或过期清理;自动清理由内置 cache manager 进程完成,它周期性扫描并删除 inactive 超时的缓存文件。

nginx 的 proxy_cache_purge 模块本身不支持定时物理清理过期缓存,它只提供按 URI 主动清除缓存的能力;真正负责自动清理过期缓存的是 nginx 内置的 cache manager 进程,而非 purger 模块。所谓“配置 purger 实现定时物理清理”属于常见误解 —— purger 不管过期、不管定时、也不管磁盘空间回收。
理解 cache manager 才是自动清理的关键
nginx 启动后会派生两个后台进程:
-
cache manager:周期性(默认每 5 秒)扫描缓存目录,检查文件最后修改时间,删除已过期(
inactive超时)且未被访问的缓存文件; - cache loader:仅在 nginx 启动初期运行一次,把磁盘上已有的缓存元数据加载进共享内存,之后退出。
这个机制完全独立于 proxy_cache_purge,无需额外模块或定时任务,只要正确配置 proxy_cache_path 的 inactive 参数,系统就会自动运行。
正确配置 proxy_cache_path 触发自动清理
关键参数是 inactive,它定义“一个缓存条目在多长时间内未被访问就视为过期并可被 manager 清理”:
-
inactive=12h表示:即使原始响应设置了 7 天缓存,只要 12 小时内没被再次命中,该缓存文件就会被 manager 删除; -
max_size=10g是配合项:当缓存总占用超过该值,manager 会优先清理最久未访问(LRU)的过期/非活跃文件; - 务必确保
levels和keys_zone设置合理,例如:proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:100m inactive=12h max_size=10g;
purger 模块的正确定位与使用场景
proxy_cache_purge(需编译时启用或使用 OpenResty/Tengine)只做一件事:根据请求触发**立即、精确、主动**删除指定 URI 对应的缓存(包括变体),典型用法:
- 后端内容更新后,通过
curl -X PURGE https://example.com/foo立即失效旧缓存; - 配合 CI/CD,在发布新版本时调用 purge 接口刷新关键路径;
- 不能替代 inactive 清理,也不能设置“每天凌晨清空所有”,它没有定时能力,也不扫描磁盘。
如需更精细的定时控制(非常规需求)
若业务要求强制每日清理全部缓存(如灰度切换前清场),可绕过 nginx 内部机制,用外部脚本 + find 定时执行:
- 写脚本遍历
/data/nginx/cache下所有文件,按修改时间删除超过 24 小时的; - 配合
crond每日执行一次,并 reload nginx 让 cache loader 重建索引(注意:reload 不中断服务,但会丢弃当前内存中未落盘的缓存状态); - ⚠️ 风险提示:手动删文件可能破坏 nginx 缓存一致性,强烈建议优先靠
inactive+max_size自控,仅在特殊运维场景下谨慎使用。


















