proxy_cache_valid仅控制缓存时长,需配合缓存区定义、启用及响应可缓存三前提才生效;按状态码分层配置:200/301/302设10m(301可单独7d),404设30s,5xx设10s,any作兜底;作用域内就近覆盖,调试用x-cache-status验证。

proxy_cache_valid 不决定“要不要缓存”,只控制“缓存多久”。它必须配合缓存区定义、缓存启用和响应可缓存这三项前提,才能真正生效。
按状态码显式设置缓存时长
不同状态码代表不同业务语义,应分别配置:
-
200 / 301 / 302:成功响应和重定向,内容相对稳定 → 推荐
proxy_cache_valid 200 301 302 10m;其中 301 可单独设为7d,体现永久性 -
404:资源不存在,缓存过长会掩盖新上线路径 → 控制在
30s到1m,如proxy_cache_valid 404 30s -
500 / 502 / 503 / 504:后端故障类错误,短时缓存防雪崩 → 建议
10s–30s,例如proxy_cache_valid 500 502 503 504 10s -
兜底规则:用
any覆盖未显式声明的状态码,如proxy_cache_valid any 5s(注意:它不覆盖已定义的状态码)
确保缓存机制真正起效的硬性前提
仅写 proxy_cache_valid 不够,以下三点必须同时满足:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 在
http块中定义缓存区:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g; - 在
location或server块中启用该缓存:proxy_cache my_cache; - 上游响应需允许缓存:默认不缓存含
Set-Cookie、Cache-Control: private或no-cache的响应;必要时加proxy_ignore_headers Set-Cookie Cache-Control;强制忽略
利用作用域层级实现精细控制
Nginx 支持在不同配置块中重复使用 proxy_cache_valid,以最近的作用域为准:
- 全局基础策略(
http块):proxy_cache_valid 200 5m; any 1m; - 特定接口覆盖(
location /api/):proxy_cache_valid 200 30s; 500 5s; - 结果:该路径下 200 缓存 30 秒,500 缓存 5 秒,其余未覆盖状态码仍走
any 1m
验证是否按预期工作
调试阶段建议添加响应头标识:
- 加一行:
add_header X-Cache-Status $upstream_cache_status;,响应中会出现HIT、MISS、EXPIRED或BYPASS - 用
curl -I http://host/path多次请求,观察X-Cache-Status变化和响应时间下降 - 注意:浏览器对 301 有强本地缓存,测试时优先用 curl 绕过干扰










