nginx微服务网关缓存需按状态码语义分层设有效期:200设5–30分钟,301/302设24小时,404设1–3分钟,401/403设10分钟,any兜底1分钟;结合路径特征定制cache_key,并用proxy_ignore_headers和proxy_cache_use_stale提升韧性。

微服务网关场景下,Nginx 缓存有效期不能靠“统一设一个时间”来应付。关键在于按状态码语义、接口敏感度和请求特征做分层控制,同时用 stale 机制兜底保障可用性。
按 HTTP 状态码分级设定缓存时长
不同状态码代表完全不同的业务含义,混用同一有效期会引发数据陈旧或频繁穿透:
- 200 OK:常规成功响应(如用户资料、商品详情),内容相对稳定但需及时更新,建议 5~30 分钟;高频读写接口可缩至 5 分钟,低频配置类接口可延至 30 分钟
- 301/302:重定向逻辑通常长期有效,缓存 24 小时可显著降低网关路由判断压力
- 404:错误页缓存过久会掩盖新上线接口,设为 1~3 分钟即可
- 401/403:若由统一鉴权服务生成,可缓存 10 分钟,避免重复校验拖慢链路
- any:兜底规则,覆盖未显式声明的状态码(如 429、503),统一设为 1 分钟,防止异常响应滞留
结合接口路径与参数特征细化粒度
同一状态码下,不同接口的数据新鲜度要求差异极大,需配合 proxy_cache_key 控制:
- 固定资源类(如
/api/config、/api/status):排除$args,延长缓存至 15 分钟以上 - 带分页/排序的列表接口(如
/api/orders?page=2&sort=ctime):保留$args,但将proxy_cache_valid 200缩短至 2~5 分钟 - 搜索或实时查询接口(如
/api/search?q=nginx):即使返回 200,也应限制为 60 秒,防止冷门词缓存堆积 - 含认证头的接口(如需
Authorization):在 cache key 中加入$http_authorization,避免用户间缓存污染
用 ignore_headers 和 use_stale 提升韧性
后端服务常误设 Cache-Control: no-cache 或 Set-Cookie,导致缓存失效或泄露:
- 加
proxy_ignore_headers Cache-Control Expires Set-Cookie,强制忽略这些干扰头 - 启用 stale 机制:
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504,后端短暂不可用时仍可返回过期但可用的数据 - 开启后台刷新:
proxy_cache_background_update on,stale 响应返回的同时悄悄拉取新数据,前端始终无感知
暴露缓存状态便于快速定位问题
加响应头辅助排查:add_header X-Cache-Status $upstream_cache_status,通过 HIT/MISS/STALE 一眼识别缓存行为是否符合预期。











