nginx不支持定时扫描删除过期缓存,依赖inactive参数自动清理冷数据;可辅以cron全量清空或ngx_cache_purge模块精准清除。

Nginx 本身不提供“定时扫描并只删过期缓存”的自动化脚本功能,它的过期清理是被动自治的——靠 inactive 参数自动回收冷数据,而不是按 HTTP 过期时间主动删除。所谓“定期清理过期缓存”,实际应理解为:确保 inactive 机制生效 + 补充安全兜底(如周期性全量清空)。以下是真正可行、生产环境常用的配置方式:
✅ 核心机制:用 inactive 让 Nginx 自动清理冷缓存
这是最轻量、最可靠的方式,无需外部脚本:
-
inactive决定缓存文件在磁盘上能“躺多久没人访问才被删”,和proxy_cache_valid的逻辑过期无关; - 只要缓存项在
inactive时间内没被任何请求命中,Nginx worker 进程会异步将其物理删除。
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=2g inactive=1h # ⚠️ 关键:1小时内未被访问,就自动删 use_temp_path=off;
示例:一个
/api/v1/user/123缓存即使proxy_cache_valid 200 7d,只要 1 小时内没人再请求它,就会被自动清理。
✅ 安全兜底:用宝塔计划任务或系统 cron 定期清空整个缓存目录
适用于缓存路径明确、且可接受全量清除的场景(比如测试环境、内容更新频繁的后台接口):
-
宝塔面板操作步骤:
- 进入【计划任务】→【添加计划任务】→ 类型选【Shell 脚本】;
- 脚本内容填:
cache_dir="/www/server/nginx/proxy_cache" [ -d "$cache_dir" ] && rm -rf "$cache_dir"/* && echo "[$(date)] proxy_cache cleaned" >> /var/log/nginx/clean.log
- 执行周期设为“每天凌晨2点”或“每6小时”;
- 点击【执行】验证是否清空成功。
-
Linux 系统级 cron(推荐用于非宝塔环境):
# 编辑定时任务 crontab -e # 添加一行(每天凌晨3点清理) 0 3 * * * /bin/rm -rf /var/cache/nginx/*
注意:该方式会清空所有缓存,适合缓存命中率不高、或后端响应快、可容忍短暂回源的业务。
✅ 精准控制:配合 ngx_cache_purge 模块按需清除指定路径
不是“定期”,但可集成进发布流程或运维脚本中,实现「更新后立即清理相关缓存」:
- 确保 Nginx 已编译
ngx_cache_purge(运行nginx -V | grep purge验证); - 在 server 块中添加 purge 接口:
location ~ ^/purge(/.*) { allow 127.0.0.1; deny all; proxy_cache_purge my_cache $scheme$host$1$is_args$args; } - 发布新版本后,用 curl 触发清理:
curl -XPURGE http://localhost/purge/api/v1/
这样就能在 CI/CD 脚本里写一句命令,精准清除某类接口缓存,避免全盘扫荡。
不复杂但容易忽略











