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

反向代理与缓存策略

NGINX 代理缓存将后端响应缓存到本地磁盘,相同请求直接返回缓存而不转发到后端,显著降低延迟和后端压力。

基础缓存配置

定义缓存区域

nginx
http {
    # 定义缓存存储
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
    
    server {
        location / {
            proxy_cache my_cache;
            proxy_pass http://backend;
            
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        }
    }
}

缓存路径参数

proxy_cache_path 详解

nginx
proxy_cache_path /var/cache/nginx
    levels=1:2
    keys_zone=my_cache:10m
    max_size=1g
    inactive=60m
    use_temp_path=off;
  • levels=1:2 — 缓存目录层级(1级1位:2级2位),避免单目录文件过多
  • keys_zone — 共享内存区域名称和大小,存储缓存键和元数据
  • max_size — 磁盘缓存上限,超出后淘汰最少使用
  • inactive — 指定时间内未访问的缓存自动清除
  • use_temp_path=off — 直接写入缓存目录,减少 I/O

10MB 的 keys_zone 可存储约 80000 个缓存键。inactive 不同于 max_age,即使缓存有效也会被清除。

缓存控制

按状态码设置缓存时间

nginx
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;

缓存键自定义

nginx
proxy_cache_key "$scheme$request_method$host$request_uri";

默认缓存键包含 $scheme + $proxy_host + $request_uri。自定义可区分不同协议或方法的缓存。

条件缓存

按请求参数控制

nginx
# 不缓存带 Cookie 的请求
proxy_cache_bypass $http_cookie $http_authorization;
proxy_no_cache $http_cookie $http_authorization;

# 仅缓存 GET 请求
map $request_method $no_cache {
    GET 0;
    default 1;
}

proxy_no_cache $no_cache;

后端控制缓存

nginx
# 尊重后端 Cache-Control 头
proxy_cache_revalidate on;
proxy_cache_min_uses 3;

proxy_cache_revalidate 使用 If-Modified-Since 验证过期缓存,减少不必要的数据传输。proxy_cache_min_uses 设定最少使用次数才缓存。

stale 缓存

后端故障时使用旧缓存

nginx
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
  • proxy_cache_use_stale — 后端异常时返回过期缓存
  • proxy_cache_lock — 多个相同请求仅一个回源,其余等待缓存
  • proxy_cache_lock_timeout — 锁超时时间

stale 缓存在后端故障时提供降级服务,虽可能不是最新数据但比 502 好。

缓存状态头

查看缓存命中情况

nginx
add_header X-Cache-Status $upstream_cache_status;

$upstream_cache_status 值:

  • MISS — 未命中,回源获取
  • HIT — 命中,返回缓存
  • EXPIRED — 过期,回源验证
  • STALE — 返回过期缓存
  • UPDATING — 正在更新旧缓存
  • REVALIDDATED — 验证通过

要点总结

  • proxy_cache_path 定义磁盘缓存和共享内存区域
  • proxy_cache_valid 按状态码设置不同缓存时间
  • proxy_cache_key 自定义缓存维度
  • proxy_cache_bypassproxy_no_cache 控制不缓存的条件
  • proxy_cache_use_stale 在后端故障时提供降级服务
  • proxy_cache_lock 防止缓存击穿
  • 通过 $upstream_cache_status 头监控缓存命中情况

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

← 上一篇 健康检查与故障转移
下一篇 → 性能调优与监控
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

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

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