nginx原生缓存为两级结构:keys_zone内存区(存键与元数据,纳秒级查询)+磁盘文件层(按levels=1:2散列存储响应体),配合proxy_cache_use_stale可形成“新鲜→过期→后端”隐式三级,再协同cdn与浏览器构成跨层缓存链。

多级缓存架构本身不是 Nginx 原生支持的“标准模式”,但通过合理组合 Nginx 自身的缓存层级(内存元数据 + 磁盘存储)与上游/下游协同策略,可以构建出事实上的多级缓存结构,从而显著降低后端服务器压力。核心不在于堆砌层级,而在于让不同粒度、不同时效性的请求在离用户更近的位置被拦截。
用 keys_zone + 磁盘缓存构成 Nginx 内部两级
Nginx 的缓存系统天然具备两级协作机制:
-
keys_zone(共享内存区):存放缓存键、过期时间、文件路径等元数据,访问极快(纳秒级),决定“有没有缓存”和“是否过期”。1MB 内存约存 8000 个 key,建议按业务规模预估,如
my_cache:512m可支撑数十万热点 key; -
磁盘缓存目录(proxy_cache_path 指定路径):真正存储响应体内容,按
levels=1:2分成多级子目录(如a/ab/abc123),避免单目录文件爆炸导致 inode 查找变慢; - 二者配合实现“内存查状态 + 磁盘取内容”的高效流程。命中时,Nginx 不访问后端,也不解析完整响应体——直接 sendfile 或零拷贝返回,CPU 和网络开销极低。
结合 upstream 与 proxy_cache_use_stale 构建逻辑三级
当缓存即将失效或回源失败时,Nginx 可主动降级,形成“新鲜缓存 → 过期缓存 → 后端兜底”的隐式三级:
- 配置
proxy_cache_use_stale error timeout updating http_500;,让 Nginx 在后台刷新缓存(updating)期间,继续向用户返回旧内容,避免并发回源; - 若后台刷新失败(如后端超时或 500),仍可返回已过期但未被清理的缓存(
stale),保障可用性; - 只有所有降级路径都不可用时,才穿透到 upstream 后端——相当于把后端变成最后一道防线,而非默认通道。
与客户端/CDN 协同形成跨层缓存链
Nginx 不孤立工作,需主动参与整个缓存链路:
- 对静态资源(JS/CSS/图片),通过
add_header Cache-Control "public, max-age=31536000"显式设置强缓存,推动浏览器和中间 CDN 长期复用,Nginx 层只承担首次回源和缓存管理; - 对动态接口,用
proxy_ignore_headers Set-Cookie Vary;防止后端误发的Set-Cookie导致缓存被跳过,确保 Nginx 能稳定接管; - 通过
X-Cache-Status响应头(HIT / MISS / STALE / EXPIRED)暴露缓存状态,便于前端或监控系统识别哪一层生效,快速定位压力来源。
规避伪多级:避免重复缓存与锁竞争
不是层级越多越好,错误叠加反而增压:
- 禁用
use_temp_path=off,否则响应先写临时文件再 rename,引发额外 IO 和锁等待; - 慎用
proxy_buffering off:关闭缓冲会让 Nginx 持有后端连接直到客户端收完,拖慢后端线程释放,在高并发下易造成连接池耗尽; - 不要在 Nginx 缓存之上再套一层 Redis 缓存同类接口——若 Nginx 已能 95% 拦截,Redis 层就成了冗余瓶颈和故障点。











