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_bypass和proxy_no_cache控制不缓存条件proxy_cache_lock防止缓存击穿$upstream_cache_status头监控缓存命中情况
📝 发现内容有误?点击此处直接编辑