nginx无主动全局清理,依赖proxy_cache_path的inactive参数自动淘汰冷数据:24h内未被访问即删,配合proxy_cache_valid控制逻辑过期,精简cache_key确保统一回收。

Nginx 本身不提供“全局资源过期清理”的主动扫描式定时任务,它的缓存过期管理是被动+自治的:依靠 proxy_cache_path 的 inactive 参数自动淘汰冷数据,配合 proxy_cache_valid 控制逻辑过期时间。所谓“全局清理”,实际是让 Nginx 自动、持续地回收不再被访问且已过期的缓存项,无需外部干预。
以下三点是实现真正可用的全局过期清理的关键配置与逻辑:
设置合理的 inactive 时间(核心机制)
inactive 是决定缓存文件能否被自动删除的唯一内置依据——它不是按“创建时间”或“过期时间”判断,而是看该缓存项最后一次被访问距今是否超过设定时长。
-
示例配置:
proxy_cache_path /var/cache/nginx/my_cache levels=1:2 keys_zone=my_cache:10m inactive=24h # ⚠️ 关键:24小时内未被任何请求命中,即被自动删除 max_size=2g use_temp_path=off;
这意味着:即使一个响应本应缓存 7 天(
proxy_cache_valid 200 7d),只要它在 24 小时内没被再次访问,Nginx 就会把它从磁盘上清除。✅ 优势:零依赖、无额外进程、不占 CPU、完全由 Nginx worker 异步完成。
❌ 注意:
inactive不等于“过期后立即删”,它只管“冷度”,不管 HTTP 头里的Expires或Cache-Control。
配合 proxy_cache_valid 明确缓存策略
该指令定义哪些状态码、缓存多久(覆盖后端响应头):
proxy_cache_valid 200 301 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 1m; # 兜底:其他状态码缓存 1 分钟
- 它影响的是 Nginx 是否返回缓存内容,以及是否触发后台校验(如配了
proxy_cache_revalidate)。 - 但注意:即使缓存已过
proxy_cache_valid时间,只要仍在inactive窗口内被频繁访问,Nginx 仍会返回它(可能带X-Cache: STALE或走 revalidate)。
确保缓存 key 设计支持统一清理逻辑
全局清理效果依赖于缓存项能被一致识别和淘汰。避免因 key 过细导致大量碎片化缓存无法被 inactive 有效覆盖:
- 推荐精简
proxy_cache_key,例如:proxy_cache_key $scheme$host$request_uri;
- 避免混入易变变量(如
$cookie_session,$arg_ts),否则同一资源可能生成多个 key,每个都要单独满足inactive才删,降低清理效率。 - 若需区分用户级缓存,请用
map+proxy_cache_bypass控制跳过缓存,而非扩大 key 范围。
补充说明:不要指望
ngx_cache_purge模块来“全局清理”——它只支持按 URL 主动触发,无法遍历或扫描;也不要写脚本定期rm -rf缓存目录,这会破坏 Nginx 内部索引,可能导致502或缓存错乱。真正的全局过期清理,就是把inactive设对,并信任 Nginx 的内置回收机制。
不复杂但容易忽略。











