keys_zone是Nginx缓存的核心共享内存区,专存缓存键、元数据和状态标记,用于微秒级判断命中;1MB约存8000个条目,大小需据业务key量合理预估,名称须与proxy_cache指令严格一致。

在 Nginx 中,“内存缓存区”本身并不是一个独立配置项,真正起作用的是 proxy_cache_path 指令中 keys_zone 所定义的共享内存区。它不缓存响应体(那是磁盘的事),而是专门存放缓存键(key)、元数据(如过期时间、状态、引用计数)以及快速判断 HIT/MISS 的索引结构——这才是影响缓存性能最关键的“内存部分”。
合理设置 keys_zone 大小
共享内存区太小会导致 key 频繁淘汰、命中率下降;太大则浪费内存,且无性能增益。关键看预期缓存的 key 数量:
- 1MB 共享内存约可存储 8000 个 key(64–128 字节/条,取决于系统架构)
- 若预估需缓存 50 万个 URL 变体(含参数、cookie 差异等),建议分配至少 64MB(500,000 ÷ 8000 ≈ 62.5)
- 生产环境常见配置:keys_zone=my_cache:64m 或 128m,兼顾稳定性与扩展性
避免多个 location 共用同一 keys_zone 导致冲突
同一个 keys_zone 是全局共享的,但不同业务场景对缓存策略(如过期时间、是否忽略 Cookie)差异很大。强行复用易引发误命中或私有内容泄露:
- 静态资源(JS/CSS/图片)单独配一个 zone,比如
keys_zone=static:32m - 用户 API 接口(需按 cookie 或 token 区分)另配 zone,如
keys_zone=api:128m,并配合自定义proxy_cache_key - 不要在一个 zone 里混用 public 和 private 缓存逻辑
配合 proxy_cache_key 提升内存利用率
默认 cache key 是 $scheme$proxy_host$request_uri,但很多请求实际应区分用户身份或设备类型。盲目扩大 keys_zone 不如精准构造 key,减少无效 key 占用内存:
- 对登录态接口:加入
$cookie_sessionid或$http_authorization - 对移动端适配:加入
$http_user_agent的简写哈希(如md5($http_user_agent)) - 避免把动态参数(如
timestamp=、rand=)直接塞进 key,应先用map过滤或重写 URI
监控与调优依据不能只靠猜测
keys_zone 是否够用,必须看运行时指标,而非拍脑袋估算:
- 启用
add_header X-Cache-Status $upstream_cache_status;观察 MISS 比例是否异常高 - 检查 Nginx error 日志是否有
keys_zone "xxx" is limited to ... keys类警告 - 用
nginx -T | grep keys_zone核对实际加载的配置,确认没有拼写错误或重复定义 - 通过
slab_stat(需编译时带 --with-http-slice-module)或第三方模块如 nginx-module-vts 查看共享内存使用率


















