nginx缓存自动失效依赖proxy_cache_valid设ttl、inactive按访问时间淘汰冷数据、purger提升清理及时性,并通过proxy_cache_use_stale、proxy_cache_lock和proxy_cache_revalidate实现安全回源。

在负载均衡环境下,Nginx 的缓存自动失效不是靠“定时删除”,而是靠一套协同机制:用 proxy_cache_valid 控制可复用时长,用 inactive 淘汰冷数据,再配合 proxy_cache_use_stale 和 proxy_cache_lock 避免雪崩——核心是让缓存“自然过期 + 安全回源 + 可控清理”。
按响应状态设定不同缓存有效期
动态内容的更新节奏不一,不能一刀切设固定时间。应根据 HTTP 状态码分级控制:
-
proxy_cache_valid 200 302 10m;—— 成功响应缓存 10 分钟 -
proxy_cache_valid 404 1m;—— 错误页缓存仅 1 分钟,避免长期返回不存在页 -
proxy_cache_valid any 1m;—— 兜底规则,防止未匹配状态码被意外缓存
用 inactive 主动清理冷缓存(关键)
仅靠 proxy_cache_valid 不会真正删文件;真正释放磁盘空间靠的是 inactive 参数——它按“最后被访问时间”判断是否淘汰:
proxy_cache_path /cache levels=1:2 keys_zone=my_cache:10m inactive=30m max_size=2g;- 意思是:任意缓存条目若 30 分钟内没被任何请求命中,就会被后台进程标记为待清理
- 注意:这和 TTL 无关,即使
proxy_cache_valid设了 1h,只要 30 分钟没访问,仍会被清掉
启用 purger 提升清理及时性
默认 cache manager 扫描频率低(可能数小时一次),purger=on 启用专用清理协程,让 inactive 实际生效:
-
purger=on purger_sleep=100 purger_files=5;—— 每 100ms 扫一次,每次最多删 5 个冷文件 - 尤其在多节点负载均衡中,需确保
proxy_cache_key包含后端地址(如$upstream_addr),避免跨节点误删
缓存失效时平稳回源
缓存过期瞬间若大量请求并发回源,容易压垮上游。要用三重保护:
-
proxy_cache_use_stale error timeout updating http_500;—— 后端出错、超时或正在更新时,仍可返回旧缓存 -
proxy_cache_lock on;—— 同一 key 的首个请求回源,其余等待,避免重复穿透 -
proxy_cache_revalidate on;—— 缓存过期后,自动带If-None-Match回源验证,命中则返回 304











