Nginx通过location分块结合proxy_cache_valid按状态码配置实现路径级缓存策略:不同路径映射到独立location,各定义专属缓存区和状态码缓存时长,需满足cache_path、proxy_cache启用及忽略禁用头等前提。

Nginx 本身不按“请求路径”直接设置状态码缓存,而是通过 location 分块 + proxy_cache_valid 按状态码配置 实现路径级差异化缓存策略。关键不是路径本身决定缓存,而是你把不同路径映射到不同 location 块,在每个块里独立声明哪些状态码、缓存多久。
✅ 按路径分组配置缓存策略
每个 location 可以启用独立缓存区、定义专属 proxy_cache_valid 规则,从而实现路径粒度的控制。
例如:
# 全局缓存区定义(必须在 http 块)
proxy_cache_path /var/cache/nginx/api levels=1:2 keys_zone=api_cache:50m max_size=2g;
proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=static_cache:20m max_size=5g;
server {
# 静态资源:只缓存 200,时间长,不关心 404/5xx
location ~* \.(js|css|png|jpg|webp|woff2?)$ {
proxy_cache static_cache;
proxy_cache_valid 200 1h;
proxy_pass https://cdn.example.com;
}
# API 接口:需精细控制各类状态码
location /api/v1/users {
proxy_cache api_cache;
proxy_cache_valid 200 201 5m; # 成功响应缓存 5 分钟
proxy_cache_valid 404 30s; # 404 缓存半分钟防刷
proxy_cache_valid 500 502 503 10s; # 错误快速过期,避免雪崩
proxy_pass http://backend_users;
}
# 管理后台健康检查:禁用缓存(避免掩盖真实状态)
location /health {
proxy_cache_valid any 0s; # 强制不缓存任何状态码
proxy_pass http://backend_health;
}
}⚠️ 注意:
proxy_cache_valid必须写在启用了proxy_cache的 location 内,否则无效。
✅ 同一路径下按状态码进一步区分
即使在同一 location,也可为不同状态码设不同有效期,Nginx 会精确匹配:
-
proxy_cache_valid 200 10m;→ 仅对 200 生效 -
proxy_cache_valid 301 1d;→ 301 单独缓存 1 天(永久重定向) -
proxy_cache_valid 302 2m;→ 302 只缓存 2 分钟(临时跳转) -
proxy_cache_valid 404 15s;→ 404 缓存 15 秒 -
proxy_cache_valid 500-504 5s;→ 所有 5xx 统一短时缓存
Nginx 匹配顺序是从上到下,先匹配最具体的规则(如 301),再 fallback 到范围规则(如 500-504),最后才是 any。
✅ 配合指令确保路径级策略生效
光写 proxy_cache_valid 不够,每个 location 还需满足三项硬前提:
- 已定义对应
keys_zone的proxy_cache_path(如api_cache) - 当前 location 启用了
proxy_cache api_cache; - 后端响应不含
Cache-Control: no-cache、Set-Cookie等禁止缓存头;若含,加:
proxy_ignore_headers Cache-Control Expires Set-Cookie;
✅ 调试与验证方法
加一行便于观察:
add_header X-Cache-Status $upstream_cache_status always;
用 curl 测试:
curl -I https://example.com/api/v1/users/123 # 第一次:X-Cache-Status: MISS # 几秒后再次请求:若返回 HIT 且状态码仍是 200,说明缓存已生效
注意:404 和 5xx 缓存同样可命中,只要响应头干净、规则显式声明、且未被 proxy_ignore_headers 拦截。
不复杂但容易忽略


















