proxy_cache_valid 可按状态码精细设置缓存时间,优先匹配精确码再范围码,未配置的状态码默认不缓存;需配合 proxy_cache_use_stale、proxy_ignore_headers 等指令实现可靠缓存控制。

Nginx 的 proxy_cache_valid 指令可以为不同 HTTP 状态码分别设置缓存有效期,这是实现精细化缓存控制的关键手段。
按状态码指定缓存时间
语法格式为:proxy_cache_valid [code ...] time;。可多次使用该指令,Nginx 会按顺序匹配最具体的一条规则(例如先匹配 200 201,再匹配通用的 200-302)。
-
proxy_cache_valid 200 302 10m;—— 仅对 200 和 302 响应缓存 10 分钟 -
proxy_cache_valid 404 1m;—— 对 404 响应缓存 1 分钟(避免频繁回源查不存在资源) -
proxy_cache_valid 500 502 503 504 30s;—— 对常见服务端错误缓存 30 秒,减轻上游压力 -
proxy_cache_valid 200-302 5m;—— 匹配 200 到 302 范围内所有状态码(含 206、301 等)
注意匹配优先级与默认行为
如果没有显式配置某状态码,Nginx 不会缓存它(即使启用了缓存模块)。多个 proxy_cache_valid 指令共存时,Nginx 从上到下匹配,一旦命中即停止查找。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 建议把精确状态码(如
404)写在范围规则(如200-302)之前 - 未被任何
proxy_cache_valid覆盖的状态码(如206或自定义418),默认不缓存 - 若只写
proxy_cache_valid 5m;(无状态码),则仅对200、301、302生效(Nginx 内置默认值)
配合其他指令增强控制力
单靠 proxy_cache_valid 不足以覆盖全部场景,需结合其他缓存相关指令协同工作:
-
proxy_cache_use_stale:允许在上游异常或过期时返回旧缓存(如error timeout updating) -
proxy_ignore_headers:忽略响应头中的Cache-Control或Expires,强制走proxy_cache_valid规则 -
add_header X-Cache-Status $upstream_cache_status;:方便调试,查看是否命中缓存(HIT/MISS/EXPIRED)
实际配置示例
以下是一个兼顾可用性与准确性的典型配置片段:
proxy_cache_valid 200 201 206 1h; proxy_cache_valid 301 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid 500 502 503 504 30s; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_ignore_headers Cache-Control Expires Set-Cookie;
该配置明确区分成功响应、重定向、客户端错误和服务器错误的缓存策略,并通过 proxy_ignore_headers 屏蔽后端干扰,确保缓存行为可控。

















