inactive 才是自动清理过期缓存的决定性参数,它按“最后访问时间”淘汰长时间未命中的冷缓存;purger=on 仅是可选增强项,用于提升 inactive 清理的及时性与可控性。

proxy_cache_path 的 purger 参数不是用来“自动清理过期缓存”的指令,它本身不触发清理动作,也不替代 inactive 机制。它的作用是启用内置缓存清理协程(purger process),配合 inactive 时间,让 Nginx 主动、异步地扫描并删除长时间未被访问的缓存条目。
真正实现“过期缓存自动清理”的核心是 inactive,而 purger=on 是让这个清理更及时、更可控的可选增强项。
✅ inactive 才是自动清理过期缓存的决定性参数
inactive=time 表示:如果某缓存条目在指定时间内完全没有被再次命中(即未被请求访问),就判定为“过期”,会被清理。
注意:这不是按 proxy_cache_valid 设置的 TTL 到期就删,而是按“最后访问时间”计算的“冷数据淘汰”。
- 示例:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=30m max_size=1g;
表示:所有在最近 30 分钟内没被任何请求命中的缓存文件,将被后台进程逐步删除。
⚠️ 关键点:
inactive清理的是“不活跃缓存”,和 HTTP 状态码缓存规则(proxy_cache_valid)无关;后者只控制“新响应能否进缓存 & 缓存多久可被复用”。
✅ purger=on 的实际价值:让 inactive 清理更可靠
默认情况下(purger=off),Nginx 仅靠 cache manager 进程管理缓存,它主要处理 max_size 超限时的强制淘汰,对 inactive 的扫描频率低、延迟高(可能数小时才扫一次)。
开启 purger=on 后:
- Nginx 会启动一个独立的
cache purger进程; - 它以更高频次(默认每 200ms 检查一次)扫描缓存元数据;
- 主动识别并删除满足
inactive条件的条目; - 支持精细调优:
purger_files(单次最多删多少个文件)、purger_sleep(两次扫描间隔毫秒)、purger_threshold(仅当待删文件数 ≥ 此值才执行)。
示例增强配置:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=30m max_size=1g purger=on purger_files=10 purger_sleep=50 purger_threshold=5;
这样就能让冷缓存更快速、更平滑地释放磁盘空间,避免 inactive 形同虚设。
✅ 负载均衡场景下的注意事项
在多 upstream server 的负载均衡中,只要 proxy_cache_key 设计合理(例如包含 $upstream_addr 或 $host),缓存就是按后端节点隔离的,purger 清理时不会误删其他节点的缓存。
但务必确保:
- 所有负载均衡节点共享同一套
proxy_cache_path(如 NFS 或本地一致路径); -
keys_zone名称和大小在各节点保持一致; -
proxy_cache_key不依赖不稳定变量(如$request_time、随机值),否则会导致缓存碎片化,inactive失效。
常见安全 key 示例(兼顾负载均衡与缓存复用):
proxy_cache_key "$scheme$host$request_uri$is_args$args"; # 或带后端标识(需 proxy_pass 后能获取) proxy_cache_key "$scheme$host$request_uri$is_args$args $upstream_addr";
❌ 常见误解澄清
-
purger不等于proxy_cache_purge:前者是后台自动清理,后者是手动触发的精准清除(如/purge/xxx); -
purger=on不会清理proxy_cache_valid过期但仍在inactive内的缓存; - 没有
purger,inactive仍有效,只是清理滞后,可能积压大量冷缓存; -
purger不解决缓存雪崩或脏缓存问题,需配合proxy_cache_lock、proxy_cache_use_stale等协同使用。
不复杂但容易忽略。











