nginx proxy_cache无纯内存缓存,但可通过keys_zone内存管理元数据、linux page cache缓存文件页、ssd存储及proxy_cache_lock等机制实现类内存响应速度。

Nginx 本身不提供纯内存缓存(如 Redis 或 Memcached 那样的 RAM-only 缓存),它的 proxy_cache 和 fastcgi_cache 等机制默认将缓存内容写入磁盘(配合共享内存区管理元数据)。但你可以通过合理配置共享内存区 + 高速存储 + 内核级优化,让 Nginx 缓存行为接近“内存级响应速度”。关键不是“把所有缓存放内存”,而是让热数据尽可能驻留内存、减少磁盘 I/O 延迟。
✅ 共享内存区(keys_zone)是真正的内存缓存核心
keys_zone 是 Nginx 缓存中唯一真正常驻内存的部分——它不存响应体,但存所有缓存项的 key、状态、过期时间、引用计数等元数据。命中与否、是否过期、是否锁住,全靠它快速判断。
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:64m inactive=60m max_size=20g;
-
keys_zone=my_cache:64m:64MB 内存专用于缓存键管理 - 每个 key 约占用 256–512 字节(取决于 key 长度和配置),64MB 可容纳约 12万~25万个缓存条目
- 若你的热点 URL 数量在 10 万级,64m 是稳妥起点;超 50 万请升至 128m 或 256m
- 不足会导致 key 被频繁淘汰 → 缓存假性 MISS → 回源压力陡增
? 提示:用
nginx -T | grep keys_zone查看实际分配;监控ngx_http_proxy_module的proxy_cache_miss/hit指标,若 miss 率长期 >15%,优先检查 keys_zone 是否过小。
✅ 让缓存文件更可能被 Linux Page Cache “留住”
Nginx 缓存文件虽落盘,但 Linux 内核会自动将频繁读取的文件页缓存在内存(Page Cache)。这是你获得“类内存速度”的主要途径:
- 使用
use_temp_path=off(已默认推荐)→ 避免文件 move 开销,提升首次读取稳定性 - 将缓存路径挂载到 SSD 或 NVMe 分区(非机械盘)→ 降低冷读延迟
- 确保系统有足够空闲内存(建议预留 ≥2GB 给 Page Cache)
- 关闭 swap(或设
vm.swappiness=1)→ 防止内核把缓存页换出
可临时验证 Page Cache 效果:
# 清空缓存(仅测试用) sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" # 访问一个已缓存资源,再查其文件是否进 cache grep -i "my_cached_file" /proc/meminfo | head -n1
✅ 启用 proxy_cache_lock + background update,减少内存争抢
高并发下多个请求同时触发回源,不仅浪费后端资源,还会因重复写缓存造成短暂 I/O 尖峰,间接影响内存友好性:
proxy_cache_lock on; # 只允许首个请求回源 proxy_cache_lock_timeout 5s; # 锁超时,防长尾阻塞 proxy_cache_background_update on; # 过期后异步更新,前台仍返回旧内容
这样既保障响应速度(用户拿到的是内存中的旧缓存或 Page Cache 中的热文件),又避免多线程争抢同一缓存文件写入。
✅ 避免“伪内存策略”陷阱
以下做法不能提升内存效率,反而有害:
- ❌ 把
max_size设得极大(如 100G)却不配足够 keys_zone → 元数据内存不足,缓存管理崩溃 - ❌ 用
tmpfs挂载/var/cache/nginx当“内存盘” → 缓存无持久性,重启即丢,且易 OOM(tmpfs 占用 real memory) - ❌ 关闭
inactive或设为0→ 失效缓存堆积,磁盘满、查找变慢、keys_zone 溢出
⚠️ 注意:Nginx 没有
proxy_cache_memory_only这类指令。所谓“内存缓存”,本质是「元数据内存化 + 文件页缓存化 + 架构零拷贝化」。
不复杂但容易忽略











