bybusyness算法是apache原生唯一基于实时运行指标(当前活跃请求数)的调度方式,仅依赖mod_lbmethod_bybusyness模块原子更新计数器,不采样、不预测、无需外部监控,但需配合event/worker mpm才能全局准确。

bybusyness 算法是唯一原生支持运行指标的调度方式
Apache mod_proxy_balancer 不提供 CPU、内存或自定义指标采集能力,所谓“基于节点运行指标”的智能调度,在标准模块中仅指 bybusyness —— 它只看一个真实运行时指标:当前正在处理的请求数(即活跃连接数)。不是预测,不是采样,而是每个请求进入/退出时原子更新的计数器。
它不依赖外部监控系统,也不需要 Prometheus 或自定义脚本。只要后端响应及时、连接不被长占(比如没超时、没卡在慢查询里),bybusyness 就能自然把新请求导向更空闲的节点。
-
bybusyness必须配合mod_lbmethod_bybusyness模块启用;Ubuntu/Debian 需运行a2enmod lbmethod_bybusyness,RHEL/CentOS 需确认配置中有LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so - 不能和
stickysession强制共存——若启用了粘性会话,bybusyness仍会计算,但用户会被固定路由,实际调度效果被覆盖 - 对长连接(如 WebSocket、HTTP/2 流)敏感:一个连接持续 5 分钟,就计为“1 个繁忙”,可能误判;建议搭配
timeout=30和keepalive=off控制连接生命周期
健康检查(hcheck)不是指标采集,但能间接影响调度权重
mod_proxy_hcheck(Apache 2.4.43+)本身不提供指标上报,它的作用是:当某节点连续失败健康检查时,Apache 会临时将其 status 标为 D(down),从而从 bybusyness 的候选池中剔除。这不是“根据指标降权”,而是“根据存活状态屏蔽”。
关键点在于:它不改变节点的 loadfactor,也不调整繁忙值,只是让调度器彻底跳过它。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 必须显式启用:仅加
hcmethod=GET不生效,还需配合ProxyHCExpr和ProxyHCTemplate(例如:ProxyHCExpr ok {%{REQUEST_STATUS} == 200}) - 健康检查路径(
hcuri)应返回轻量响应(如{"ok":true}),避免引入额外负载干扰bybusyness判断 - 若用
hcinterval=5但后端平均响应耗时 800ms,实际检查并发可能堆积,反而增加节点压力
真正“智能”的扩展只能靠外部代理层或重写逻辑
如果你需要依据 CPU 使用率、GC 时间、队列延迟等真实业务指标做调度,Apache 原生模块做不到。此时有且仅有两个务实路径:
- 在 Apache 前面加一层轻量代理(如 Envoy 或 Traefik),由它拉取各节点指标并做动态权重下发,Apache 退化为纯转发通道(通过
ProxyPass转给 Envoy) - 用
RewriteRule+ 自定义 CGI/Script 做条件路由:例如请求到达时调用 Python 脚本查本地指标 API,再用RewriteRule ^(.*)$ balancer://group-$1 [P]动态拼接后端组名(需提前定义好balancer://group-cpu-low等多组) - 放弃 Apache 负载均衡角色,改用 Consul + Fabio 或 Nginx Plus(支持 upstream health_check + least_conn + 自定义 status zone)
别试图用 mod_lua 在 Apache 内部轮询指标——它没有异步 I/O,每次请求都会阻塞主线程,反而成为性能瓶颈。
balancer-manager 页面显示的“Busy”值就是 bybusyness 的唯一依据
访问 /balancer-manager 时看到的 “Busy” 列数字,就是该节点当前被 mod_proxy_balancer 记录的活跃请求数。它不等于 netstat -an | grep :8080 | wc -l,也不等于后端应用的线程数,而只是 Apache 自身维护的一个整型计数器:收到 ProxyPass 请求时 +1,收到完整响应或超时/错误时 -1。
- 这个值在多进程 MPM(如 prefork)下是进程局部的,不跨 worker 共享 → 所以
bybusyness在 prefork 下效果打折;必须用 event 或 worker MPM 才能全局准确 - 如果某节点长期显示 Busy=0 却无流量,大概率是
ProxyPassReverse缺失或后端返回了 302 重定向,导致 Apache 无法正确匹配响应与原始请求,计数未归零 - 重启 Apache 后该计数清零,但不会触发节点状态重置(
status=D仍保留,直到 retry 秒后自动恢复)
所谓“智能调度”,在 Apache 体系里本质是一套极简、无状态、只看连接数的实时反馈机制。想让它更聪明,得接受它的边界,而不是强行喂它吃不下东西。










