缓存文件在inactive时间内被误删,主因是keys_zone内存不足导致key频繁踢出,使nginx无法更新last_access_time,进而错误判定为冷数据;需检查keys_zone容量、cache manager状态及响应头是否抑制缓存更新。

缓存文件在 inactive 时间内被误删,通常不是因为“过期”,而是缓存元数据或访问状态异常导致 Nginx 提前判定为“冷数据”。排查核心在于确认:该缓存是否真的没被访问(last_access_time 未刷新),还是系统层面干扰了访问记录。
检查 keys_zone 是否容量不足
共享内存区(keys_zone)过小会导致 key 被频繁踢出,即使缓存文件还在磁盘,Nginx 也查不到对应索引,无法更新 last_access_time,从而让 inactive 逻辑失效。
- 用
nginx -V 2>&1 | grep -o 'configure arguments.*'查 keys_zone 配置大小 - 通过
curl -s http://localhost/nginx_status | grep 'cache'或 Prometheus 的nginx_proxy_cache_size_bytes观察实际 key 占用趋势 - 若
ngx_http_file_cache_t->sh->count接近 keys_zone 上限(如 10m 区域接近 8 万个 key),说明 key 挤出严重,需扩容
验证 last_access_time 是否被正确刷新
每次命中(包括 STALE 状态下启用 proxy_cache_use_stale)都会重置计时器。若命中但未刷新,常见于以下情况:
- 启用了
proxy_cache_lock on,且并发请求触发锁等待,部分请求走回源未写入缓存,也未更新访问时间 - 响应头含
Cache-Control: no-cache或Set-Cookie,导致 Nginx 默认不缓存也不更新 last_access_time - 使用了
proxy_cache_bypass或proxy_no_cache,绕过缓存逻辑,自然不触发刷新
观察磁盘与句柄行为反推异常
缓存文件物理存在但反复重建,说明 Nginx 认为它“已丢失”或“不可用”:
- 用
lsof +D /var/cache/nginx查看是否有大量缓存文件处于DEL状态(已被 unlink 但句柄未释放) - 执行
find /var/cache/nginx -type f -mmin -30 | wc -l(假设 inactive=30m),对比实际命中日志中对应 URL 的访问频次 - 若 find 结果远少于访问次数,说明文件被删,但原因大概率是 keys_zone 不足或 cache manager 异常高频扫描
确认 cache manager 扫描是否异常频繁
正常情况下 cache manager 每 200ms 扫描一次,但若配置了 purger=on 且未设 inactive,或系统时间跳变(如 NTP 校正),可能引发误判。
- 检查
error_log中是否有cache manager process XXX exited或重复 reload 日志 - 运行
ps aux | grep cache,确认只有一个 cache manager 进程在运行 - 避免在生产环境手动执行
nginx -s reload过于频繁,它会重置所有缓存计时器











