proxy_cache_key高效索引需按业务语义分层设计:区分设备、用户身份等隔离维度,归一化版本参数等可合并请求,剥离utm、v、t等干扰参数,用map预处理args,键前缀加业务标识便于管理,避免使用$request_time等易变值,并协同缓存策略控制生命周期。

要让 proxy_cache_key 真正支撑多维度业务数据的高效索引,关键不是堆变量,而是按业务语义分层设计缓存键结构——既要区分需隔离的维度(如设备、用户身份),又要归一化可合并的请求(如版本参数、跟踪ID)。
明确哪些维度必须参与缓存键计算
业务中真正影响内容差异的字段才应进入 proxy_cache_key。例如:
- 移动端适配场景:用
$device(desktop/mobile/tablet)替代完整$http_user_agent,避免 UA 微小变化导致缓存分裂 - 登录态个性化内容:加入
$cookie_user_id或$arg_uid,但需确保未登录用户使用统一占位符(如"guest") - 语言/地区差异化:用
$http_accept_language提取主语言(如zh-CN),或结合 CDN 提供的$geoip_country_code,而非原始 header 全值
主动剥离干扰性参数,提升命中率
URL 中常见但不影响实际内容的参数(如 ?utm_source=xxx、&v=20260429、&t=123456789)必须剔除,否则同一资源会生成大量无效缓存项:
- 在
location块中配合proxy_ignore_headers Set-Cookie和proxy_cache_bypass $arg_nocache,让调试或灰度请求绕过缓存 - 用
map指令预处理复杂逻辑,例如:
map $args $clean_args {
~^(.*&)?v=[^&]+(&.*)?$ "$1$2";
default $args;
},再在proxy_cache_key中引用$clean_args
保持键结构稳定,兼顾可观测与刷新能力
自定义缓存键一旦上线,就决定了缓存生命周期和刷新方式:
- 键中包含 Cookie 或 Header 后,无法再用“按 URL 刷新”功能,必须改用“按 Cachekey 刷新”,所以建议在键开头加入业务标识前缀,例如
"api_v2:$scheme://$host$request_uri:$device",便于批量识别和清理 - 避免在键中使用易变且无业务意义的值(如
$request_time、$msec),会导致 100% 缓存未命中 - 上线前可用
log_format cache_log "... $upstream_cache_status $cache_key"记录真实生成的 key,抽样验证是否符合预期
与缓存策略协同,避免维度爆炸
多维缓存键会显著增加缓存碎片,必须配套收紧生命周期和分级控制:
- 对含
$device或$cookie_user_id的 key,proxy_cache_valid 200 302 2h比设为 1d 更安全 - 静态资源(JS/CSS/图片)建议剥离所有动态维度,统一用
"$scheme://$host$request_uri",并配合文件名哈希实现长期缓存 - 高频更新接口(如实时行情)可保留
$arg_symbol但禁用inactive过长,依赖proxy_cache_use_stale updating降低回源压力


















