Apache反向代理实现集群滚动发布,关键是通过其作为流量调度层,结合后端健康状态、动态权重调整(如loadfactor)和会话保持(stickysession),将新旧版本服务同时接入balancer集群,逐步切流;需启用mod_proxy、mod_proxy_http、mod_proxy_balancer、mod_lbmethod_bybusyness、mod_slotmem_shm及mod_proxy_hcheck模块,配置健康探测(hcmethod/ hcuri/ failonstatus)、优雅停机协同,并通过apachectl graceful热重载调整权重,全程不中断请求。

Apache 反向代理实现集群滚动发布,关键不是让 Apache 自己“滚动”,而是通过它作为流量调度层,配合后端节点的健康状态、权重调整和会话保持,把新旧版本服务同时接入集群,再逐步切流。整个过程不中断请求,旧实例处理完剩余请求后下线,新实例按需承接流量。
启用必要模块并定义可伸缩的集群组
确保以下模块已加载(以 Debian/Ubuntu 为例):
- mod_proxy 和 mod_proxy_http:基础代理能力
- mod_proxy_balancer 和 mod_lbmethod_bybusyness:支持按后端负载动态分发(比 byrequests 更适合滚动场景)
- mod_slotmem_shm 和 mod_proxy_hcheck:支撑运行时健康探测与状态共享
在配置中用独立文件(如 /etc/apache2/balancer.conf)定义集群,避免硬编码 IP:
<Proxy balancer://rolling-app>
BalancerMember http://v1-node1:8080 route=v1-01 loadfactor=5 status=+H
BalancerMember http://v1-node2:8080 route=v1-02 loadfactor=5 status=+H
BalancerMember http://v2-node1:8080 route=v2-01 loadfactor=1 status=+H
BalancerMember http://v2-node2:8080 route=v2-02 loadfactor=1 status=+H
ProxySet lbmethod=bybusyness
ProxySet stickysession=ROUTEID
</Proxy>
说明:status=+H 启用健康检查;loadfactor=1 初始给新节点低权重,控制流量比例;ROUTEID 需与后端应用写入的 Cookie 值一致(如 Spring Boot 设置 server.tomcat.remoteip.remote-ip-header=x-forwarded-for 并透传路由标识)。
配置健康探测与自动故障隔离
为每个 BalancerMember 添加探测参数,让 Apache 主动识别节点状态:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
hcmethod=GET hcuri="/health":调用轻量健康接口 -
hcfails=2 hcpasses=2:连续失败 2 次摘除,恢复 2 次才上线 -
retry=60 timeout=3:摘除后等 60 秒再探,给后端留足优雅停机时间 -
failonstatus=503,500:返回这些码即判为不可用
后端服务必须支持优雅停机(如 Spring Boot 的 /actuator/shutdown 或 Tomcat 的 GracefulShutdown),并在停机前返回 503,Apache 才能及时将其从集群中剔除,避免新请求打过去。
通过权重调整实现渐进式流量切换
滚动发布过程中,不靠重启 Apache,而是动态修改 loadfactor 值并热重载配置:
- 初始阶段:v2 节点
loadfactor=1,v1 节点loadfactor=5→ 新节点仅承接约 14% 流量 - 验证稳定后:将 v2 节点改为
loadfactor=3,v1 改为loadfactor=3→ 流量均摊 - 全量切换后:v1 节点设为
status=+D(禁用),或直接删掉配置行
执行 sudo apachectl graceful 即可热重载,连接不中断,正在处理的请求继续完成,新连接按新权重分发。
兜底策略与可观测性增强
避免单点依赖,加一层安全缓冲:
- 用
ProxyPass /api/ balancer://rolling-app/ retry=0显式关闭该路径的默认重试逻辑,防止故障时反复打向异常节点 - 对响应头添加标识:
Header set X-Backend-Version "v2.1",便于前端或监控识别当前服务版本 - 开启
mod_status,访问/server-status?auto可实时查看各节点活跃连接、请求计数、状态标记 - 记录自定义日志字段,统计每条请求实际转发到哪个
route,辅助判断灰度效果

















