全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

Nginx缓存机制(proxy_cache)

NGINX 代理缓存将上游响应存储到本地磁盘,相同请求直接从缓存返回,减少上游请求次数和响应延迟。

缓存架构

nginx
Client → NGINX → 检查缓存 → HIT → 返回缓存
                    ↓ MISS
                请求上游 → 缓存响应 → 返回客户端

缓存区域定义

proxy_cache_path

nginx
http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=10g inactive=60m use_temp_path=off;
}
  • levels=1:2 — 两级目录(1位:2位),避免单目录文件过多
  • keys_zone=static_cache:10m — 共享内存区名称和大小
  • max_size=10g — 磁盘缓存上限
  • inactive=60m — 60 分钟未访问的缓存自动清除
  • use_temp_path=off — 直接写入最终目录

10MB keys_zone 约存储 80000 个缓存键。max_size 由 cache manager 后台进程监控,超出后淘汰 LRU 缓存。

使用缓存

启用缓存

nginx
server {
    location / {
        proxy_cache static_cache;
        proxy_pass http://backend;
        
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
    }
}

proxy_cache 引用已定义的缓存区域名称。proxy_cache_valid 按状态码设置有效期。

缓存键

自定义缓存维度

nginx
proxy_cache_key "$scheme$request_method$host$request_uri";
  • 默认值:$scheme$proxy_host$request_uri
  • 加入 $request_method 区分 GET/POST
  • 加入 $http_cookie 区分不同用户

缓存键决定哪些请求视为"相同"。不包含 Cookie 时所有用户的相同请求共享缓存。

条件缓存

不缓存的情况

nginx
# Cookie 和认证请求不缓存
proxy_cache_bypass $http_cookie $http_authorization;
proxy_no_cache $http_cookie $http_authorization;

# 仅缓存 GET 和 HEAD
map $request_method $skip_cache {
    GET 0;
    HEAD 0;
    default 1;
}
proxy_no_cache $skip_cache;
  • proxy_cache_bypass — 跳过缓存直接回源,但仍更新缓存
  • proxy_no_cache — 不缓存也不使用缓存

缓存验证

stale-while-revalidate

nginx
proxy_cache_revalidate on;
proxy_cache_min_uses 3;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
  • proxy_cache_revalidate — 使用 If-Modified-Since 验证过期缓存
  • proxy_cache_min_uses — 最少访问 N 次才缓存
  • proxy_cache_lock — 相同请求仅一个回源,其余等待
  • proxy_cache_lock_timeout — 锁超时时间

缓存状态头

监控缓存命中

text
add_header X-Cache-Status $upstream_cache_status;

$upstream_cache_status 值:

  • MISS — 未命中
  • HIT — 命中
  • EXPIRED — 过期需验证
  • STALE — 返回过期缓存
  • UPDATING — 正在更新
  • REVALIDATED — 验证通过
  • BYPASS — 跳过缓存

要点总结

  • proxy_cache_path 定义磁盘缓存和共享内存区域
  • proxy_cache 在 location 中启用缓存
  • proxy_cache_valid 按状态码设置不同有效期
  • proxy_cache_key 自定义缓存匹配维度
  • proxy_cache_bypassproxy_no_cache 控制不缓存条件
  • proxy_cache_lock 防止缓存击穿
  • $upstream_cache_status 头监控缓存命中情况

📝 发现内容有误?点击此处直接编辑

← 上一篇 隐藏Nginx版本号
下一篇 → Nginx限流配置(limit_req)
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库