Apache mod_proxy_balancer实现bybusyness调度需启用mod_proxy、mod_proxy_http、mod_proxy_balancer和mod_lbmethod_bybusyness模块,在块内用ProxySet lbmethod=bybusyness指定算法,忽略权重,实时按后端活跃连接数分发请求。

用 Apache mod_proxy_balancer 实现基于活跃连接总数的流量分配,核心是启用 bybusyness 调度算法。它不按请求数或流量加权,而是实时查看每个后端节点当前正在处理的请求数(即活跃连接数),把新请求优先发给最空闲的那个节点。
必须启用的模块和基础配置
确保以下模块已加载:
- mod_proxy(反向代理基础)
- mod_proxy_http(支持 HTTP 后端通信)
- mod_proxy_balancer(负载均衡框架)
- mod_lbmethod_bybusyness(bybusyness 算法实现模块,需显式启用)
在 Debian/Ubuntu 上运行:a2enmod lbmethod_bybusyness
RHEL/CentOS 则确认 /etc/httpd/conf.modules.d/00-proxy.conf 中有对应 LoadModule 行。
配置 bybusyness 的关键写法
在虚拟主机或主配置中定义均衡器组时,必须明确指定 lbmethod=bybusyness,且不能与 weight 或 loadfactor 混用——该算法完全忽略权重,只看实时繁忙度:
<proxy balancer:>
BalancerMember http://192.168.1.10:8080
BalancerMember http://192.168.1.11:8080
BalancerMember http://192.168.1.12:8080
ProxySet lbmethod=bybusyness
</proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
注意:ProxySet 必须写在 块内部,且紧邻 BalancerMember 之后;单独写在 VirtualHost 顶层无效。
让活跃连接统计真正准确
bybusyness 的效果高度依赖后端是否真实反馈连接状态。Apache 默认通过内部计数器跟踪“已发出但未完成响应”的请求。要提升准确性,建议配合以下设置:
- 为每个
BalancerMember显式设置timeout=5 retry=30,避免因超时误判连接堆积 - 禁用粘性会话(注释或删除
ProxySet stickysession=...),否则用户被固定到某节点,活跃连接数失真 - 后端服务开启 HTTP keepalive,并返回
Connection: keep-alive,便于 Apache 复用连接并持续感知状态 - 若后端是 Tomcat/Jetty,确认其
maxThreads设置合理,避免线程池满而 Apache 仍认为“可接收新请求”
验证和观察实际分配效果
访问 /balancer-manager 页面(需提前配置授权),重点关注每行的 “Current Requests” 列:这个数字就是 Apache 当前认定的该节点活跃连接数。不断发起新请求,你会看到该列数值动态增减,且新请求大概率落到数值最小的节点上。
如需日志验证,可在 LogFormat 中加入:%{BALANCER_WORKER_ROUTE}e %{BALANCER_NAME}e
然后观察 access log,对比各节点的请求分布节奏是否随其 “Current Requests” 变化同步偏移。











