反向代理与缓存策略
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_bypass和proxy_no_cache控制不缓存的条件proxy_cache_use_stale在后端故障时提供降级服务proxy_cache_lock防止缓存击穿- 通过
$upstream_cache_status头监控缓存命中情况
📝 发现内容有误?点击此处直接编辑