调整 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 将缓存键的索引存放在共享内存区域以便多 worker 进程访问。如果该区域过小,无法存储足够多的键,新请求无法命中缓存;如果该区域过大,会占用过多系统 RAM,尤其在多实例部署时可能引发内存不足。
分步处理
1. 估算唯一键数量:根据业务 URL 规律预估同时活跃的唯一缓存键数量。
2. 计算内存大小:参考官方数据,1MB 共享内存约存储 8000 个键,据此计算所需大小。
3. 修改配置文件:编辑 nginx.conf,调整 keys_zone=name:size 中的 size 值。
4. 测试并重载:执行 nginx -t 检查语法,确认无误后执行 nginx -s reload。
怎么验证是否生效
使用 free -m 命令观察系统共享内存变化,检查 Nginx 错误日志 error.log 是否有内存分配失败记录。
若配置正确,Nginx 进程启动正常且无 OOM 报错,缓存命中率随时间趋于稳定。
常见坑
共享内存大小一旦设定,重载配置不会立即释放旧区域内存,需重启 Nginx 才能完全生效。
不要将 keys_zone 与 max_size 混淆,后者限制磁盘缓存总大小,前者限制内存键索引大小。
常见问题
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