Nginx中需同时满足proxy_cache_path定义缓存区、proxy_cache启用缓存、上游响应允许缓存三个前提,proxy_cache_valid才能生效;多条指令按状态码精确匹配,后出现的同码配置覆盖前者,且作用域以最近location/server为准。

直接在 location 或 server 块中写多条 proxy_cache_valid 指令,每条明确列出状态码和对应时间,Nginx 会按状态码精确匹配并生效——更具体的状态码优先于 any,后出现的同状态码配置覆盖前者。
按业务语义分组设置最常用组合
不同状态码代表不同含义,缓存时长应反映其稳定性:
-
200 / 301 / 302:内容稳定或跳转长期有效,适合较长缓存,例如
proxy_cache_valid 200 301 302 10m; -
404:仅缓存“找不到”结果,防扫描但不宜久,建议
proxy_cache_valid 404 30s;或1m -
5xx 类错误(500/502/503/504):后端临时异常,短时缓存可缓解雪崩,如
proxy_cache_valid 500 502 503 504 10s; -
兜底规则:用
proxy_cache_valid any 5s;确保未显式声明的状态码也有默认缓存期(它不会覆盖已定义的状态码)
利用作用域层级实现精细覆盖
Nginx 支持在不同配置块中重复使用 proxy_cache_valid,以最近的作用域为准:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 在
http块设基础策略:proxy_cache_valid 200 5m; any 1m; - 在特定
location /api/中覆盖:proxy_cache_valid 200 30s; 500 5s; - 结果是:该路径下 200 缓存 30 秒、500 缓存 5 秒;其他未覆盖的状态码仍走
http块的any 1m
确保配置真正生效的关键前提
proxy_cache_valid 单独存在无效,必须同时满足三项条件:
- 已通过
proxy_cache_path定义缓存区(含keys_zone),例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m; - 在当前
location中启用该缓存区:proxy_cache my_cache; - 上游响应本身允许被缓存:不能含
Cache-Control: no-cache、private或Set-Cookie(除非用proxy_ignore_headers Set-Cookie Cache-Control;主动忽略)
验证是否按预期工作
最直观的方式是观察响应头与行为表现:
- 添加
add_header X-Cache-Status $upstream_cache_status;,请求后检查响应头中是否出现HIT、MISS或EXPIRED - 用
curl -I多次访问同一 URL,对比首次与后续的响应时间及X-Cache-Status变化 - 检查 Nginx error log(需开启 debug 级别)中是否有
using cached response或cached response expired等记录

















