Nginx无纯内存缓存,但通过proxy_cache+SSD+Page Cache可实现类内存速度;需配置use_temp_path=off、充足keys_zone、sendfile/tc_pnopush、noatime挂载及可选tmpfs。

Nginx 本身不提供纯内存(RAM)缓存机制,它的 proxy_cache 默认基于磁盘存储。但通过合理配置,可以实现“类内存级”响应速度——核心是让缓存热数据常驻于系统页缓存(Page Cache),并配合 Nginx 的共享内存索引与高效 I/O 调度,达到接近内存访问的性能。
用 proxy_cache 搭建高速缓存层
这是最常用且效果显著的方式。Nginx 将缓存元数据(key、过期时间、状态等)保存在 keys_zone(共享内存区),而实际响应体写入磁盘。只要磁盘使用 SSD,且系统有足够空闲内存,Linux 内核会自动将频繁读取的缓存文件缓存在 Page Cache 中,后续请求几乎不触发真实磁盘 I/O。
-
必须启用
use_temp_path=off:避免先写临时文件再重命名,减少一次磁盘操作 - 缓存路径挂载在 SSD 分区上:2025 年起主流部署已默认要求 NVMe SSD,随机读性能直接影响 HIT 延迟
-
keys_zone大小要充足:10MB 可存约 8 万个 key;高并发站点建议设为 50m~200m,避免 key 驱逐导致无效 MISS -
搭配
proxy_cache_lock on:防止缓存失效瞬间大量请求穿透到后端(即“缓存雪崩”)
启用 sendfile + TCP_NOPUSH 加速文件传输
当缓存命中时,Nginx 通过 sendfile() 系统调用直接将磁盘缓存文件从内核页缓存发送到 socket,全程不经过用户态内存拷贝,大幅降低 CPU 和延迟。
- 在
http或server块中开启:sendfile on; - 配合启用:
tcp_nopush on;(对 HTTP 响应头+body 合并发送,减少小包) - 确保后端返回的响应带有明确的
Content-Length,否则sendfile可能被禁用
优化系统级缓存行为
Nginx 不管理 Page Cache,但你可以引导内核更积极地缓存 Nginx 缓存目录:
- 将缓存目录(如
/var/cache/nginx)单独挂载为 ext4/xfs,并设置noatime:避免每次读取更新访问时间,减少元数据写入 - 调整内核参数(可选):
vm.vfs_cache_pressure=50(降低 dentry/inode 缓存回收倾向),vm.swappiness=1(抑制 swap,保障 Page Cache 空间) - 定期预热关键资源:用
curl -I或find … -exec cat {} \;触发缓存文件加载进 Page Cache
替代方案:仅限极低延迟场景的内存映射尝试
若业务对 P99 延迟极端敏感(如金融行情推送),可考虑将缓存目录挂载为 tmpfs(内存文件系统),但需严格评估风险:
- tmpfs 占用的是物理内存+swap,缓存容量受限于可用 RAM
- 机器重启或 OOM 时缓存全丢,需配合主动预热逻辑
- 配置示例:
mount -t tmpfs -o size=4g,mode=0755 tmpfs /var/cache/nginx,并确保proxy_cache_path指向该路径


















