最精准可控的缓存配置是按状态码语义分组设置proxy_cache_valid指令:200/206/304缓存1小时,301缓存7天,302/307/308缓存2分钟,404缓存30秒,500-504缓存10秒,any兜底5秒;需确保已定义cache区、启用proxy_cache且响应允许缓存。

直接按状态码语义分组写多条 proxy_cache_valid 指令,是最精准、最可控的方式。它不看后端返回的 Cache-Control,只由 Nginx 主动控制缓存时长——但前提是缓存区已定义、缓存已启用、响应本身允许被缓存。
按状态码类型分别设时间
不同状态码代表不同业务含义,缓存时间必须匹配其稳定性:
-
200 / 206 / 304:正常响应或协商成功,内容稳定 →
proxy_cache_valid 200 206 304 1h; -
301:永久重定向,语义承诺长期有效 → 单独写
proxy_cache_valid 301 7d; -
302 / 307 / 308:临时跳转,需快速失效 →
proxy_cache_valid 302 307 308 2m; -
404:资源不存在,防扫描但不能掩盖上线 →
proxy_cache_valid 404 30s;(最长别超 1 分钟) -
500 / 502 / 503 / 504:后端故障,短时缓存缓解雪崩 →
proxy_cache_valid 500 502 503 504 10s; -
any:兜底未声明的状态码(如 403、429)→
proxy_cache_valid any 5s;(不会覆盖上面已定义的)
注意匹配顺序和覆盖规则
Nginx 从上到下逐行匹配,一旦命中就停止检查:
- 更具体的规则建议放前面,比如先写
301 7d,再写302 2m,互不干扰 - 避免把
any 1m放最前,否则会截断所有后续精确规则 - 同一状态码出现多次时,后写的会覆盖前面的(例如先写
200 10m,后写200 30s,最终生效的是 30 秒)
确保配置真正起作用的三个硬条件
缺一不可,否则 proxy_cache_valid 再精细也无效:
- 在
http块中定义缓存区:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g; - 在对应
location中启用:proxy_cache my_cache; - 上游响应默认不缓存带
Set-Cookie或Cache-Control: no-cache/private的响应;必要时加:proxy_ignore_headers Set-Cookie Cache-Control;
路径级差异化设置示例
不同路径可复用不同缓存区与规则,实现精细控制:
- 静态资源路径:
location ~* \.(js|css|png|woff2?)$ { proxy_cache static_cache; proxy_cache_valid 200 1y; } - API 接口路径:
location /api/ { proxy_cache api_cache; proxy_cache_valid 200 201 30s; proxy_cache_valid 404 10s; } - 健康检查路径:
location /health { proxy_cache_valid any 0s; }(强制不缓存)
不复杂但容易忽略。











