Apache的mod_proxy_balancer配合byrequests算法实现无状态集群均衡,需启用mod_proxy、mod_proxy_http、mod_proxy_balancer和mod_lbmethod_byrequests模块,配置纯轮询集群并禁用stickysession,通过retry、failonstatus、ping、timeout和maxattempts实现健康检查与故障剔除,同时启用balancer-manager提升可观测性。

用 Apache 的 mod_proxy_balancer 配合 byrequests 算法实现无状态集群均衡,关键在于让请求按数量均匀、可预测地分发到各后端节点,同时避免会话绑定和状态依赖。它适合 RESTful API、静态资源服务、微服务网关等典型无状态场景。
基础配置:启用模块并定义轮询组
确保以下模块已启用:
mod_proxy-
mod_proxy_http(或mod_proxy_ajp,如对接 Tomcat) mod_proxy_balancer-
mod_lbmethod_byrequests(这是byrequests算法的实现模块)
在虚拟主机或全局配置中定义一个纯轮询集群:
<Proxy balancer://api>
BalancerMember http://192.168.1.10:8080
BalancerMember http://192.168.1.11:8080
BalancerMember http://192.168.1.12:8080
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass /api/ balancer://api/
ProxyPassReverse /api/ balancer://api/
无状态适配:关闭粘性、剥离会话头
无状态集群必须防止请求被“绑定”到特定节点,否则就违背了设计初衷。需明确禁用所有粘性机制:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 不设置
route、sticky或path参数,避免 BalancerMember 带会话标识 - 不启用
ProxySet stickysession,也不配置JSESSIONID或PHPSESSID相关粘滞规则 - 若后端返回
Set-Cookie中含路由信息(如ROUTEID),可用Header unset Set-Cookie或RequestHeader unset Cookie清除(视安全策略而定)
提升可靠性:健康检查与自动故障剔除
byrequests 本身不感知节点状态,必须配合参数实现自动容错:
-
retry=15:节点失败后 15 秒内不参与调度,避免雪崩式重试 -
failonstatus=500-599:收到 5xx 响应即标记该成员为失效 -
ping=3:转发前发送 HEAD 探针,3 秒无响应则跳过本次请求(不触发 retry) -
timeout=10:单次请求超时设为 10 秒,超时后自动尝试下一节点(需maxattempts=2启用重试)
完整示例:
BalancerMember http://192.168.1.10:8080 retry=15 failonstatus=500-599 ping=3 timeout=10
可观测性与运维支持
启用 mod_status 和 balancer-manager 页面,便于实时查看各节点请求数、状态与权重:
- 在配置中加入:
<Location "/balancer-manager"> SetHandler balancer-manager </Location> - 限制访问来源(如
Require ip 192.168.1.0/24)保障安全 - 页面中可手动启停节点、临时调权,适合发布灰度或紧急干预
注意:byrequests 不支持动态加权——权重只能通过 reload 或 balancer-manager 接口修改,且后者重启后失效;如需指标驱动的自动调权,需外部脚本定期生成配置并 apachectl graceful。

















