nginx个性化缓存需自定义proxy_cache_key,用稳定cookie(如user_theme)或url参数(如ab_test)生成差异化缓存键,并配合proxy_no_cache/proxy_cache_bypass控制缓存逻辑,辅以x-cache-by等响应头增强可观测性。

要让 Nginx 缓存支持个性化分发,关键不是“统一缓存一份”,而是让不同用户(或不同参数)的请求生成不同的缓存键,从而各自命中专属缓存。这靠的是精准控制 proxy_cache_key,并配合合理的绕过与失效机制。
用 Cookie 值参与缓存键计算
默认缓存键是 $scheme$proxy_host$request_uri,它不区分用户。要实现个性化,需把目标 Cookie 的值显式加入:
- 在
http或location块中设置:proxy_cache_key "$host$request_uri$cookie_user_theme$cookie_preferred_language"; - 注意只选稳定、低频变更、非敏感的 Cookie,比如
user_theme(dark/light)、preferred_language(zh/en),避免用session_id或auth_token; - Nginx 会自动提取
$cookie_XXX变量,无需额外解析;值为空时,该项为字符串空,不影响语法,但建议后续加 fallback 处理。
用 URL 参数参与缓存键计算
对带查询参数的个性化场景(如 A/B 测试、地区标识),可直接将参数纳入缓存键:
- 例如按
ab_test参数分流:proxy_cache_key "$host$request_uri$args";或更精确地:proxy_cache_key "$host$request_uri$is_args$arg_ab_test"; - 若只关心特定参数,可用
map提前归一化,避免因参数顺序不同导致重复缓存; - 配合
proxy_ignore_client_abort off和合理超时设置,防止参数变动频繁引发缓存碎片。
灵活控制哪些请求不进缓存
不是所有带 Cookie 或参数的请求都该缓存。要用 proxy_no_cache 和 proxy_cache_bypass 区分语义:
-
proxy_no_cache $cookie_nocache $arg_nocache;:遇到这些变量非空,完全不写入缓存(适合调试开关、临时禁用); -
proxy_cache_bypass $cookie_nocache $arg_nocache;:跳过缓存读取,但依然可能写入(适合灰度流量先走后端再落缓存); - 两者可共存,也可只启用其一,取决于你是否希望“绕过缓存”同时“阻止缓存生成”。
增强可观测性与一致性
个性化缓存容易出问题,加几个小配置能快速定位:
- 响应头里加标识:
add_header X-Cache-By "theme=$cookie_user_theme;lang=$cookie_preferred_language"; - 启用缓存状态头便于调试:
add_header X-Upstream-Cache-Status $upstream_cache_status;(命中 HIT/MISS/EXPIRED/BYPASS); - Cookie 变更后,可通过 purge 接口或 Redis key pattern 清除对应缓存,避免 stale 数据残留。











