Nginx缓存索引存储在proxy_cache_path定义的keys_zone共享内存区中,由cache loader进程启动时加载、cache manager进程持续维护,Worker进程仅并发读取索引元数据(key、路径、状态等),写操作受锁保护;所有进程共享该内存,实现O(1)查找与高效缓存命中。

Nginx 的 Worker 进程本身不直接“管理”缓存索引,而是通过协作机制依赖专门的缓存管理进程(cache manager)和缓存加载进程(cache loader)来完成索引的构建、清理与维护。Worker 进程主要负责处理请求并读写缓存数据,而索引元数据(即 keys_zone 中的内容)的生命周期管理由独立后台进程承担。
缓存索引存在哪里
缓存索引存储在 proxy_cache_path 指令中 keys_zone 定义的共享内存区域里,例如:
proxy_cache_path /tmp/nginx/cache levels=2:2:2 keys_zone=my_cache:128m;
这里的 my_cache:128m 表示:用 128MB 共享内存保存所有缓存项的 key、过期时间、文件路径等元信息。该内存被所有 Worker 进程共同访问,但写操作受锁保护,读操作无锁快速命中。
cache loader 进程负责冷启动重建
Nginx 启动后,会派生一个 cache loader 进程(仅运行一次,完成后退出):
- 扫描
proxy_cache_path指定目录下的所有缓存文件; - 根据文件名反推其 key(基于
proxy_cache_key规则),校验有效性(如未过期、格式合法); - 将有效条目加载进
keys_zone共享内存,建立初始索引; - 此过程可能持续数秒到数分钟,取决于缓存总量和磁盘性能。
cache manager 进程持续维护索引
Nginx 运行期间,会常驻一个 cache manager 进程(每个 master 对应一个):
- 定期(默认每 500ms)扫描
keys_zone,清理inactive超时且无访问记录的索引项; - 删除对应磁盘上的缓存文件(异步触发,不阻塞 Worker);
- 回收共享内存碎片,防止元数据区膨胀;
- 监控
max_size,当磁盘使用超限时,按 LRU 策略淘汰最久未用的缓存项及其索引。
Worker 进程如何使用索引
每个 Worker 在处理请求时:
- 根据
proxy_cache_key计算当前请求的 key(如$host$uri$is_args$args); - 在
keys_zone共享内存中查找该 key 是否存在、是否未过期; - 若命中且有效,则直接打开对应磁盘文件返回内容;
- 若未命中或已失效,则转发请求给后端,并在收到响应后:
- 写入磁盘(路径由
levels和 key 的哈希决定); - 同步更新
keys_zone中的索引条目(含时间戳、状态、大小等)。
- 写入磁盘(路径由
关键注意事项
-
keys_zone大小要合理:太小会导致索引频繁淘汰,缓存命中率下降;太大则浪费内存。经验参考:1MB ≈ 8000 个 key,128MB 可支撑百万级缓存项; -
inactive时间需匹配业务访问节奏:设为 1h 表示 1 小时内无访问即淘汰,不是“缓存有效期”,后者由proxy_cache_valid控制; - 不建议频繁重启 Nginx:每次重启都会触发
cache loader全量扫描,对 I/O 和 CPU 有瞬时压力; - 使用
use_temp_path=off可避免重命名开销,让索引与文件写入更原子,减少索引错位风险。
缓存索引的管理是 Nginx 实现高性能本地缓存的关键设计之一,它把“计算 key—查索引—读文件”拆解为低开销的并发路径,同时用专用进程隔离耗时任务,保障 Worker 始终轻量响应。


















