Nginx 通过 map 指令将缓存开关转为变量,结合 proxy_cache_bypass 和 proxy_no_cache 实现按业务线动态启停缓存;支持基于 Host、路径、响应头 X-Biz-Line、请求头或 Cookie 等多维度控制,需在 http 块定义 map,注意正则顺序与变量触发逻辑。

直接用 map 控制 proxy_cache 是否生效,核心是把缓存开关变成变量,再通过 proxy_cache_bypass 和 proxy_no_cache 配合实现“按业务线动态启停”。Nginx 本身不支持 proxy_cache on/off 这样的布尔指令,但可以用变量驱动绕过或拒绝缓存,效果等同于“逻辑上关闭”。
按业务线标识(如 Host 或路径前缀)控制缓存开关
适合多业务共用一台 Nginx、但各业务对缓存敏感度不同(例如:支付线严禁缓存,查询线可缓存)。在 http 块中定义:
map $host $cache_enabled {
~^pay\.example\.com$ 0; # 支付子域,禁用缓存
~^api\.example\.com$ 1; # API 子域,启用缓存
~^report\.example\.com$ 1; # 报表子域,启用缓存
default 0;
}
然后在对应 location 中引用:
-
proxy_cache_bypass $cache_enabled;—— 当变量值为非空且非 0 时,跳过缓存(即强制回源) -
proxy_no_cache $cache_enabled;—— 当变量值为非空且非 0 时,不将响应存入缓存
注意:两者常一起使用。若只设 proxy_no_cache,请求仍会查缓存(可能 HIT),只是不存;加上 proxy_cache_bypass 才真正“不查也不存”,彻底隔离。
结合上游响应头(如 X-Biz-Line)做更细粒度判断
当后端服务在响应头中明确标记了业务线(比如 X-Biz-Line: logistics),可用 $upstream_http_x_biz_line 动态决策:
map $upstream_http_x_biz_line $cache_for_line {
"logistics" "1h";
"inventory" "5m";
"finance" "0s"; # 0s 表示不缓存该响应
default "10m";
}
再在 location 中写:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
proxy_cache_valid 200 302 $cache_for_line;-
proxy_no_cache $cache_for_line;(配合使用,确保 finance 响应绝不落盘)
⚠️ 前提:必须开启响应头透传:proxy_pass_request_headers on;,且确认 upstream 确实返回了该 header。
用 Cookie 或请求头区分灰度/调试流量
运维或开发常需临时关闭某条业务线的缓存做验证。可基于自定义请求头(如 X-Debug-Cache: off)或 Cookie:
map $http_x_debug_cache $skip_by_debug {
"off" 1;
default 0;
}
<p>map $cookie_cache_mode $skip_by_cookie {
"disabled" 1;
default 0;
}</p>在 location 中合并控制:
proxy_cache_bypass $skip_by_debug $skip_by_cookie;proxy_no_cache $skip_by_debug $skip_by_cookie;
这样只要请求带 X-Debug-Cache: off 或 Cookie: cache_mode=disabled,该请求就完全绕过缓存体系,不影响其他正常流量。
关键注意事项
-
map定义必须放在http块内(server 外),否则变量不可见 - 正则匹配顺序很重要:default 必须放最后;带
~*的规则要写在 default 上方 -
proxy_cache_bypass和proxy_no_cache接收多个变量,任一为真(非空/非 0)即触发动作 - 若业务线有独立缓存区(如
keys_zone=pay_cache),建议每个业务线单独定义proxy_cache_path,避免混用和锁竞争










