Apache本身不支持后端节点自动注册与下线,但通过mod_proxy_balancer配合mod_proxy_hcheck主动健康检查(hcmethod、hcuri、hcinterval等)、retry/timeout失效恢复策略、status人工干预及ProxyPassReverse会话保障,可实现故障节点自动隔离与恢复时平滑接入。

Apache 本身不支持节点的自动注册与下线,但通过 mod_proxy_balancer 配合健康检查和合理参数配置,可以实现后端节点的“优雅摘除”(即故障时自动隔离、恢复时平滑接入)和连接保护(避免向不可用节点发请求、防止雪崩)。关键不在“动态”,而在“可控的被动响应+可调的主动探测”。
启用并配置主动健康检查(hcmethod + hcexpr)
默认情况下,mod_proxy_balancer 只做静态轮询,不会主动探测节点是否存活。必须显式启用 mod_proxy_hcheck 模块,并为每个后端节点定义健康检查行为:
- 确认已加载模块:
a2enmod proxy_hcheck(Apache 2.4.33+) - 在
BalancerMember行中添加:hcmethod=HEAD hcuri="/health" hcinterval=15 hcfailures=2 hctimeout=3 -
hcuri必须指向后端真实暴露的健康端点(如 Spring Boot 的/actuator/health),不能是 Apache 自身路径 - 用
ProxyHCExpr自定义判定逻辑,例如只认 2xx 响应:ProxyHCExpr ok {%{REQUEST_STATUS} =~ /^[2]/},避免仅靠状态码误判
设置合理的失效与恢复策略(retry + timeout + cooldown)
节点不是“一错就踢”,也不是“一好就上”,需兼顾稳定性与及时性:
- 为每个
BalancerMember显式设timeout=5 retry=60:超时 5 秒即判为失败;进入 DOWN 状态后,60 秒才尝试首次恢复检查 - 恢复不是“检查一次 OK 就上线”,而是需满足「连续成功 + 冷却期」:若
hcinterval=15且hcfailures=2,则至少等待 30 秒才允许重新探测 - 避免将
retry设为 0(永不恢复)或过小(如 5 秒),否则网络抖动易导致节点反复上下线
利用 status 参数实现人工干预与热备控制
当需要手动摘除节点(如计划内维护),不重启 Apache 也能立即生效:
- 初始配置中使用
status=+H启用健康检查并保持在线 - 临时摘除某节点:改为
status=-H(禁用健康检查)或status=D(强制 DOWN),Apache 会立刻停止转发流量 - 添加热备节点时用
status=+H但不设loadfactor,它只在其他节点全部失效时才被启用 - 所有 status 修改后,执行
systemctl reload apache2或apachectl graceful即可热生效
配合 ProxyPassReverse 和粘性会话保障连接连续性
摘除节点时,若用户已有会话,需防止重定向跳转错误或 session 断连:
- 务必配置
ProxyPassReverse,确保后端返回的Location、Set-Cookie等响应头中的路径/域名被正确重写 - 开启粘性会话:
ProxySet stickysession=JSESSIONID|ROUTEID,并确保后端在server.xml(Tomcat)或应用配置中设置了对应jvmRoute - 若某节点被摘除,已有会话请求会因 route 匹配失败而按负载算法分发到其他节点——此时需后端自身支持 session 共享(如 Redis),Apache 不负责 session 迁移











