应精简 proxy_cachekey,仅保留影响响应内容的变量,如静态资源用 $scheme$host$uri,SSR 页面保留 lang/region 等路由参数,过滤 utm* 等埋点参数,并通过 map 预处理提取关键 query 和 Cookie 字段,配合 cache_bypass 与 no_cache 实现精准缓存控制。

直接用默认的 proxy_cache_key,Nginx 会把整个请求 URI(含所有 query 参数、Cookie、Header)原样拼进去,结果就是同一张图片、同一个 API 接口,因带了 utm_source=weibo 或 _ga=GA1.2.xxxx 就生成完全不同的缓存项——命中率暴跌,磁盘白白占用,回源压力不降反升。
只留影响内容的变量,剔除干扰项
缓存键不是越“全”越好,而是越“准”越好。关键原则是:只有真正导致后端返回不同响应的变量,才放进 key。
- 静态资源(JS/CSS/图片)通常只需
$scheme$host$uri—— 文件路径不变,内容就不该变 - Next.js 或 Nuxt 等 SSR 页面,要保留
lang、region、slug这类服务端路由或 locale 参数,但过滤掉utm_*、ref=、fbclid=等纯埋点参数 - 登录态页面若需区分用户身份,只取关键 Cookie 字段(如
session-token),而非整段$http_cookie
用 map 预处理,让 key 构造清晰可控
避免在 proxy_cache_key 行内写正则或复杂逻辑。推荐用 map 指令提前提取干净变量:
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
剥离 query 中无关参数:
map $args $cache_args {
~^(?:(?!lang|region|id|theme).)*$ ""; # 全都不匹配时为空
~(lang=[^&]+|region=[^&]+|id=[^&]+|theme=[^&]+) $1;
}
提取指定 Cookie 值:
map $http_cookie $cache_session {
~session-token=([^;]+) $1;
default "";
}
最终 key 可写为:
proxy_cache_key "$scheme$host$uri|$cache_args|$cache_session";
配合 cache_bypass 与 no_cache 实现动态穿透
精准 key 解决了“该缓存什么”,而 proxy_cache_bypass 和 proxy_no_cache 决定“什么时候不缓存”:
- 开发调试时加
?nocache=1:用proxy_cache_bypass $arg_nocache;跳过缓存,直连后端 - 登录用户访问个人页,可设
proxy_no_cache $cookie_session_token;,有 session 就不缓存(或仅缓存片段) - 灰度发布时用特定 Cookie 或 Header 控制,例如
proxy_cache_bypass $http_x_abtest_flag;
验证与监控不能少
改完 key 后必须确认是否生效:
- 查看响应头中
X-Cache-Status(需先配置add_header X-Cache-Status $upstream_cache_status;),对比 HIT/MISS/MISS 的分布 - 检查日志中
$upstream_cache_status字段,观察不同 UA、不同参数组合下的命中趋势 - 对关键路径做 AB 测试:相同 URL 带不同 utm 参数,确认是否命中同一缓存项

















