Nginx 缓存 proxy_cache 配置如何调整 keys_zone 大小避免内存不足

文章导读
调整 Nginx proxy_cache_path 指令中的 keys_zone 参数大小是控制缓存键内存占用的直接方法,适合需要预估唯一 URL 数量的场景,风险在于设置过大会浪费共享内存,设置过小会导致缓存失效。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

调整 Nginx proxy_cache_path 指令中的 keys_zone 参数大小是控制缓存键内存占用的直接方法,适合需要预估唯一 URL 数量的场景,风险在于设置过大会浪费共享内存,设置过小会导致缓存失效。

先说结论:根据唯一 URL 数量估算 keys_zone 大小,避免盲目分配过大共享内存。

  • 适合:缓存命中率低或服务器内存紧张的场景
  • 先准备:统计预期缓存的唯一键数量
  • 验收:重载配置后观察内存占用和错误日志

命令速用版

http 块中修改 proxy_cache_path 配置,调整 keys_zone 后的数值:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;

其中 10m 为共享内存大小,可根据实际需求增减。

为什么会这样

keys_zone 仅存储缓存键和元数据,实际缓存内容存储在磁盘上。

Nginx 缓存 proxy_cache 配置如何调整 keys_zone 大小避免内存不足

Nginx 将缓存键的索引存放在共享内存区域以便多 worker 进程访问。如果该区域过小,无法存储足够多的键,新请求无法命中缓存;如果该区域过大,会占用过多系统 RAM,尤其在多实例部署时可能引发内存不足。

分步处理

1. 估算唯一键数量:根据业务 URL 规律预估同时活跃的唯一缓存键数量。

2. 计算内存大小:参考官方数据,1MB 共享内存约存储 8000 个键,据此计算所需大小。

3. 修改配置文件:编辑 nginx.conf,调整 keys_zone=name:size 中的 size 值。

4. 测试并重载:执行 nginx -t 检查语法,确认无误后执行 nginx -s reload

Nginx 缓存 proxy_cache 配置如何调整 keys_zone 大小避免内存不足

怎么验证是否生效

使用 free -m 命令观察系统共享内存变化,检查 Nginx 错误日志 error.log 是否有内存分配失败记录。

若配置正确,Nginx 进程启动正常且无 OOM 报错,缓存命中率随时间趋于稳定。

常见坑

共享内存大小一旦设定,重载配置不会立即释放旧区域内存,需重启 Nginx 才能完全生效。

不要将 keys_zonemax_size 混淆,后者限制磁盘缓存总大小,前者限制内存键索引大小。

Nginx 缓存 proxy_cache 配置如何调整 keys_zone 大小避免内存不足

常见问题

keys_zone 设大了会怎样?

会浪费系统共享内存,可能导致其他进程内存不足,但不会直接导致 Nginx 崩溃。

keys_zone 设小了会怎样?

缓存键存储不足,旧键会被淘汰,导致缓存命中率降低,回源请求增加。

如何监控 keys_zone 使用率?

原生 Nginx 不支持直接查看,需借助第三方模块如 nginx-module-vts 或通过日志分析估算。

参考来源

Nginx Official Documentation, ngx_http_proxy_module, https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path