keys_zone是nginx缓存的核心内存区,专存缓存键、元数据和状态标记,用于微秒级判断缓存命中;1mb约存8000个条目,大小不足会导致假未命中,且必须与proxy_cache_path中名称一致才生效。

缓存分区(keys_zone)是 Nginx 缓存机制中最关键的内存管理单元,它不存实际响应体,而是专门存放缓存键(key)、元数据(如响应状态码、过期时间、访问次数)和状态标记。没有它,Nginx 就无法快速判断一个请求是否命中缓存——每次都要扫磁盘文件,性能直接归零。
为什么必须定义 keys_zone?
Nginx 在收到请求时,先根据 proxy_cache_key 生成唯一 key,然后在共享内存区里查找这个 key 是否存在、是否未过期、是否可返回。这个查找过程必须在微秒级完成,只能靠内存实现。磁盘路径(proxy_cache_path 的 path)只负责存储响应内容本身,不参与决策逻辑。
- 1 MB 共享内存约可存储 8000 个缓存条目(含 key + metadata)
- 若 keys_zone 过小,新 key 持续挤掉旧 key,导致“假未命中”,缓存率暴跌
- 若名称(如
my_cache)在proxy_cache和proxy_cache_path中不一致,缓存完全不生效
配置时的关键参数搭配
keys_zone 必须和 proxy_cache_path 同行声明,且大小需结合业务 QPS 和平均缓存对象数预估。常见合理组合:
-
keys_zone=static_cache:50m:适合日均百万级静态页(如文章、商品详情),支撑约 40 万个缓存条目 -
keys_zone=api_cache:20m:适用于高频但生命周期短的接口(如天气、行情),配合inactive=60s快速淘汰 - 避免写成
keys_zone=cache:1m—— 连首页轮播图都可能被反复覆盖,形同虚设
它和缓存路径(path)不是一回事
很多初学者误以为 /data/nginx/cache 是“缓存区”,其实那只是磁盘落盘位置;真正起调度作用的是 keys_zone 所定义的那块共享内存。二者关系类似“图书馆索引卡(内存)”和“书架上的实体书(磁盘)”——查不到索引卡,就等于没这本书,哪怕书就在架子上。
- 磁盘路径可扩容(
max_size=50g),但 keys_zone 内存大小一旦设定,重启前不可动态调整 - 删除缓存时(如用
proxy_cache_purge),操作对象是 keys_zone 中的 key,不是直接删磁盘文件 - 使用
nginx -t只能校验语法,无法验证 keys_zone 是否足够——得看运行时nginx -s reload后的stub_status或ngx_http_proxy_module日志中的 miss/hit 比











