Nginx代理缓存自动淘汰靠max_size、inactive和keys_zone三参数协同:max_size设磁盘容量红线,超限即LRU清理;inactive定义无访问即淘汰时限;keys_zone需足够大以避免假未命中。

核心在于用好 proxy_cache_path 的三个关键参数:max_size、inactive 和 keys_zone,它们共同构成自动、持续、低干扰的淘汰机制,而不是等磁盘写满再人工清理。
设置硬性容量上限(max_size)
这是触发自动淘汰的“红线”。一旦缓存目录实际占用超过该值,Nginx 会立刻启动后台清理:
-
max_size=5g表示缓存总大小不能超过 5GB,超限即删 - 删除不是清空整个目录,而是按 LRU(最近最少使用)原则,只删最久没被访问过的文件
- 这个过程全自动、不中断服务、无需 reload 或重启
定义缓存项的“活跃寿命”(inactive)
inactive 决定一个缓存文件在无访问状态下能保留多久,它和 max_size 协同工作:
-
inactive=30m表示:哪怕该文件还没过proxy_cache_valid设定的有效期,只要 30 分钟内没人访问它,就标记为可淘汰 - 它不是定时批量扫描删除,而是由 cache manager 进程持续检查并清理
- 建议设为业务平均访问间隔的 2–3 倍,比如内容小时级更新,可设
inactive=1h
配足内存元数据区(keys_zone)
keys_zone 存的是缓存 key 的索引信息,大小直接影响命中率和淘汰效率:
-
keys_zone=my_cache:20m中的 20MB 是共享内存大小,1MB 约支持 8000 个 key,20MB ≈ 16 万个缓存条目 - 如果太小,key 频繁被挤出内存,导致“假未命中”,Nginx 误以为缓存不存在而反复回源,间接加剧磁盘压力
- 上线前预估并发请求覆盖的 URL 数量,留出 30% 余量配置 keys_zone
避免“假满”和写入失败
磁盘显示满但实际没真正用完?很可能是临时路径惹的祸:
- 默认
use_temp_path=on,Nginx 先写临时目录再 move 到缓存目录;若 temp 和 cache 不在同分区,tmp 满了就会报“缓存写入失败” - 统一关闭:
use_temp_path=off,让响应直接写入缓存目录,消除中转环节 - 确保缓存目录(如
/var/cache/nginx/my_cache)有足够空间和 Nginx 用户(如 www-data)的完整读写权限


















