nginx高效请求路由缓存的核心是基于请求特征的智能缓存,需精准设置proxy_cache_key、按业务划分缓存区、结合状态码与生命周期策略;仅适用于响应稳定、无用户上下文、无副作用的只读请求。

在 Nginx 中实现高效的请求路由缓存,核心不是“按路由路径缓存”,而是通过精准控制缓存键(proxy_cache_key)、合理划分缓存区、配合状态码策略与缓存生命周期管理,让相同语义的请求命中同一缓存条目——这本质上是“基于请求特征的智能缓存”,而非简单匹配 location 路径。
明确缓存适用边界
路由缓存只对满足以下条件的请求有效:
- 上游响应内容稳定(如静态页、API 返回结果变化不频繁)
- 请求无强用户上下文(避免缓存含登录态、个性化数据的响应)
- 客户端可接受一定延迟(缓存过期机制决定新鲜度)
- 后端无副作用(GET 类只读请求最安全,POST/PUT 不应缓存)
构造高区分度且稳定的缓存键
缓存命中率取决于 proxy_cache_key 是否能准确反映“请求语义等价性”。仅用 $request_uri 容易因无关参数(如跟踪 ID、时间戳)导致重复缓存。
推荐写法(兼顾安全性与复用性):
proxy_cache_key "$scheme$request_method$host$uri$is_args$arg_id$arg_type";
说明:
- 保留关键业务参数(如
id、type),剔除干扰项(如utm_*、ts) - 用
$uri(不含 query)+$is_args$arg_xxx显式控制参数参与,比$request_uri更可控 - 若需忽略大小写或标准化编码,可在 map 块中预处理变量
为不同路由特征分配独立缓存区
避免所有请求挤在同一个缓存池里,造成高频缓存驱逐低频但重要的内容。按业务维度拆分更高效:
proxy_cache_path /var/cache/nginx/api levels=1:2 keys_zone=api_cache:50m max_size=2g inactive=30m; proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=static_cache:20m max_size=5g inactive=1h;
然后在对应 location 中分别启用:
location /api/v1/products {
proxy_pass http://backend;
proxy_cache api_cache;
proxy_cache_valid 200 201 10m;
}
<p>location ~* .(js|css|png|jpg|webp)$ {
proxy_cache static_cache;
proxy_cache_valid 200 1h;
}</p>
精细控制缓存生命周期与失效逻辑
光设 max_size 和 inactive 不够,还需结合响应状态和业务规则:
- 对 200/201 响应缓存较久,404 只缓存 1 分钟(防雪崩)
- 用
proxy_cache_use_stale updating允许缓存过期时仍返回旧内容,同时异步刷新 - 对需强一致性的接口(如 /api/user/profile),加
proxy_cache_bypass $cookie_auth或$arg_no_cache实现按需绕过 - 禁止缓存含 Set-Cookie 或 Cache-Control: private 的响应(Nginx 默认遵守)
不复杂但容易忽略:缓存效率最终取决于你是否真正理解“哪些请求该共用一份响应”,而不是配置了多少个 proxy_cache_path。











