keys_zone是proxy_cache_path中必填的共享内存区参数,用于存储缓存key及元数据,单位为m或g;其大小应按实际唯一key数÷8000并加15%–20%冗余估算,如48万key建议设为72m,过小导致命中率下降,过大则浪费内存。

配置 Nginx 缓存的内存共享区域(即 keys_zone)大小,关键在于为 proxy_cache_path 指令中的 keys_zone 参数设定合理值,它不表示总缓存容量,而是专用于存储缓存 key、元数据(如过期时间、状态)的共享内存区。
明确 keys_zone 的作用和单位
keys_zone=name:size 中的 size 是纯内存占用,单位为 m(MB)或 g(GB),与磁盘缓存路径(/var/cache/nginx)完全分离。这块内存由所有 worker 进程共享,存放哈希索引和管理信息,不存响应体内容。
- 例如:
keys_zone=cache_one:50m表示分配 50MB 共享内存给名为cache_one的缓存区 - 该区域必须命名(如
cache_one),后续proxy_cache cache_one才能引用
按真实 key 数量估算最小安全值
不能凭并发数或流量估算,必须基于日志中实际出现的唯一缓存 key 数量:
- 从 access 日志提取并统计去重后的 key:
awk -F'"' '{print $2}' access.log | awk '{print $1,$2}' | sort -u | wc -l - 每 1MB 共享内存可稳定容纳约 8000 个平均长度的 key(含元数据)
- 计算公式:唯一 key 总数 ÷ 8000 → 向上取整得到基础 MB 数
- 再加 15%–20% 冗余(应对 key 长度波动或新增),即为推荐值
- 示例:48 万个唯一 key → 480000 ÷ 8000 = 60 → 建议设为
keys_zone=my_cache:72m
配置示例与常见错误
正确写法(放在 http 块中):
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=fastcache:64m max_size=2g inactive=30m;
-
levels=1:2是磁盘目录结构,不影响内存 -
max_size=2g控制磁盘缓存上限,与keys_zone无关 - 避免设过小(如
:1m):导致 key 频繁淘汰、哈希冲突升高、命中率骤降 - 避免设过大(如
:512m):浪费内存,且无性能增益
验证是否生效
配置后 reload,可通过以下方式确认:
- 检查 Nginx 启动日志,确认无
keys_zone相关警告 - 用
ipcs -m查看系统共享内存段,应有对应名称(如fastcache)和大小 - 启用
stub_status模块,观察ngx_http_cache_status_module相关指标变化


















