nginx无自动过期清理机制,purger仅支持请求驱动的主动清除,不感知过期、不扫描磁盘、不支持定时;应依赖cache manager进程(默认启用)配合inactive参数,并辅以find+cron兜底清理。

nginx 本身不提供 proxy_cache_path 的自动过期清理机制,purger 也不是 nginx 官方指令 —— 它是第三方模块 ngx_cache_purge 提供的功能,用于按 URL 主动清除缓存,**不支持定时、不扫描磁盘、也不自动识别“过期”文件**。因此,不能直接靠它实现“定时自动化清理磁盘过期文件”。
为什么 purger 无法自动清理过期缓存文件
purger 是请求驱动的主动清除机制,不是后台守护进程或定时扫描器。它的作用是在收到特定 purge 请求(如 GET /purge/xxx)时,根据 URI 匹配并删除对应缓存键的文件。它:
- 不感知缓存是否已过期(不读取
proxy_cache_valid或响应头中的Expires/Cache-Control) - 不遍历 cache 目录扫描旧文件
- 不支持 cron 式调度,需外部触发
- 依赖手动构造 purge 请求或配合业务逻辑调用
真正可行的定时清理过期缓存方案
要实现“定时自动化清理磁盘上实际已过期的缓存文件”,应结合 nginx 缓存元数据与系统级工具。以下是可靠做法:
-
启用 cache manager 进程(默认开启):nginx 主进程会定期(默认每 0.5 秒)唤醒 cache manager 子进程,检查缓存项状态,自动删除过期、失效、临时或超限的缓存文件。这是最核心、最轻量的内置机制,无需额外配置,但需确保
proxy_cache_path中的inactive参数合理设置(例如inactive=12h),否则长时间未被访问但未过期的文件不会被清理。 -
用 find + cron 清理物理残留(兜底):cache manager 可能因重启、异常中断等遗留已过期但未及时删除的文件。可写定时脚本,按缓存目录 mtime 或文件名时间戳清理:
# 示例:清理 /var/cache/nginx/proxy_cache 下 24 小时前创建且无有效锁的缓存文件 find /var/cache/nginx/proxy_cache -type f -mmin +1440 ! -name "*.*" -delete
注意:慎用-delete,建议先用-ls验证;避免匹配到.temp、.pid等控制文件。 -
监控 cache 使用率并触发清理(可选):通过
df -h /var/cache/nginx或解析proxy_cache_path目录大小,当使用率超阈值(如 85%)时,运行find ... -delete或发送信号重载 nginx(触发 cache manager 紧急扫描)。
如果仍想用 ngx_cache_purge 做“伪定时清理”
可通过外部调度间接模拟,但属于非标准用法,仅适用于有明确 URI 规律的缓存(如带时间戳路径):
- 编写脚本生成一批待 purge 的旧 URL(例如:过去 7 天的
/api/v1/data/YYYY/MM/DD/*) - 用 curl 发送 purge 请求:
curl -X PURGE "http://localhost/purge/api/v1/data/2024/04/01/item123" - 将脚本加入 crontab(如每天凌晨执行)
- 注意:该方式依赖 URI 可枚举、且 purge 模块已正确配置
location ~ /purge(/.*)?
本质上,nginx 缓存的生命周期管理应以 inactive + cache manager 为主,系统级定时扫描为辅。purger 是运维辅助手段,不是过期治理主力。











