mod_proxy_balancer可通过分组隔离、配置热更新和路由切换实现按版本平滑切流:先定义v1/v2独立balancer组,再用proxypass指向当前版本并graceful重载,配合健康检查与mod_rewrite灰度分流。
apache 的 mod_proxy_balancer 本身不直接支持“按版本切流”,但它能通过分组隔离 + 配置热更新 + 路由切换三步,实现后端服务版本升级时的平滑切流。核心思路是:把不同版本的服务部署为独立的后端集群(如 balancer://v1 和 balancer://v2),再用最小侵入的方式切换入口路由。
一、提前定义多版本 balancer 组
每个版本对应一个独立的 <proxy></proxy> 块,避免混用或硬编码:
<proxy balancer:>
BalancerMember http://v1-01:8080 route=v1-01 loadfactor=100
BalancerMember http://v1-02:8080 route=v1-02 loadfactor=100
ProxySet lbmethod=bybusyness
</proxy><proxy balancer:>
BalancerMember http://v2-01:8080 route=v2-01 loadfactor=100
BalancerMember http://v2-02:8080 route=v2-02 loadfactor=100
ProxySet lbmethod=bybusyness
</proxy>
-
route=值需与后端应用(如 Tomcat 的jvmRoute)一致,保障会话粘性可延续; - 各组完全独立,互不影响,便于灰度验证和快速回滚。
二、主路由指向由配置控制,支持热切换
在虚拟主机或主配置中,用 ProxyPass 指向当前生效的版本组:
ProxyPass /api/ balancer://v1/ ProxyPassReverse /api/ balancer://v1/
升级时,只需改这一行:
ProxyPass /api/ balancer://v2/ ProxyPassReverse /api/ balancer://v2/
然后执行:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
apachectl graceful
- 已建立的连接继续走旧版本,新请求立即进入 v2;
- 不中断服务,无连接丢弃,符合“平滑”要求。
三、配合健康检查,自动规避故障节点
即使切到 v2,也要确保其节点真实可用。启用主动健康探测:
ProxyHCExpr ok200 {%{REQUEST_STATUS} = 200}
<proxy balancer:>
BalancerMember http://v2-01:8080 hcexpr=ok200 hcinterval=10 retry=30 timeout=3
BalancerMember http://v2-02:8080 hcexpr=ok200 hcinterval=10 retry=30 timeout=3
</proxy>
-
/health端点返回200才视为健康; - 单节点连续 30 秒失败即自动摘除,流量不打过去;
- 恢复后自动重新加入,无需人工干预。
四、进阶:支持灰度放量与条件切流
如果不想全量切,可用 mod_rewrite 实现按请求特征分流:
# 按 Header 标识灰度用户
RewriteCond %{HTTP:X-Release-Stage} ^canary$ [NC]
RewriteRule ^/api/(.*)$ balancer://v2/$1 [P,L]
# 默认走 v1
ProxyPass /api/ balancer://v1/
ProxyPassReverse /api/ balancer://v1/
- 规则顺序很重要:灰度规则必须放在
ProxyPass之前; -
[P]表示代理,[L]表示终止匹配,防止后续规则干扰; - 可结合 Cookie、UID 哈希、IP 段等灵活控制灰度比例。
不复杂但容易忽略









