跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何通过 proxy_cache_path 的 purger 指令实现定时自动化清理磁盘过期文件

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 是运维辅助手段,不是过期治理主力。

相关文章