Nginx代理缓存磁盘满时,应依赖max_size配合inactive和LRU机制自动回收:max_size为硬上限,超限时立即按LRU删除久未访问文件;需配全proxy_cache_path三要素,启用cache manager持续清理,并关闭use_temp_path避免假满。

Nginx 代理缓存磁盘跑满时,靠人工清理不现实。真正有效的解法是让 max_size 配合 inactive 和 LRU 机制自动腾空间——它不是“满了才删”,而是持续按需回收。
max_size 是硬性上限,触发后立即启动淘汰
当缓存目录实际占用超过 max_size 设定值(比如 max_size=5g),Nginx 会立刻启动后台清理流程,按 最近最少使用(LRU) 原则,优先删除最久未被访问的缓存文件,直到总大小回落到阈值以下。这个过程全自动、无需重启、不影响请求。
关键要配全三要素:
proxy_cache_path /var/cache/nginx/my_cache levels=1:2 keys_zone=my_cache:20m max_size=5g inactive=30m;proxy_cache my_cache;proxy_cache_valid 200 1h;
其中:
-
max_size=5g是总容量红线,超了就清 -
inactive=30m表示 30 分钟内没被任何请求命中的缓存项,即使还没过proxy_cache_valid设定的有效期,也会被提前淘汰 -
keys_zone=my_cache:20m要足够大(1m 内存约存 8000 个 key),否则 key 被挤出会导致命中率骤降,间接加剧磁盘压力
淘汰不是一次性动作,而是持续后台行为
Nginx 有两个内置进程协同工作:
-
cache manager:定期扫描缓存目录,检查inactive过期项并删除 -
cache loader:Nginx 启动时把磁盘缓存索引加载进内存 keys_zone,避免首次访问慢
这两个进程默认启用,无需额外开启。你可以通过 nginx -t 确认配置语法正确后 reload,淘汰逻辑即刻生效。
避免“假满”:注意 temp_path 和写入权限
如果 use_temp_path=on(默认),Nginx 先把响应写入临时目录再 move 到 cache 目录,临时目录若和 cache 不在同分区,可能因 tmp 占满导致写失败,误判为“缓存满”。建议显式关闭:
proxy_cache_path /var/cache/nginx/my_cache ... use_temp_path=off;
同时确保 /var/cache/nginx/my_cache 所在分区有足够空间,且 nginx 工作用户(如 nginx 或 www-data)对该路径有读写权限。
验证是否生效
查看缓存状态头:
add_header X-Cache-Status $upstream_cache_status;
再用 du -sh /var/cache/nginx/my_cache 观察实际占用变化;配合 find /var/cache/nginx/my_cache -type f -mmin +30 | wc -l 可粗略估算 inactive 淘汰量。
不复杂但容易忽略


















