Apache不直接感知CPU/内存压力,但可通过mod_proxy_balancer的weight机制按预设比例分流请求;权重仅在<Proxy "balancer://xxx">块内对BalancerMember设置有效,须搭配lbmethod=byrequests等算法及排除sticky session等干扰项。

Apache 本身不直接“感知”节点 CPU 或内存压力,但可以通过 mod_proxy_balancer 的权重机制,结合合适的调度算法,实现按预设比例将请求分发到不同配置的后端节点。关键不是让 Apache 自动读取系统指标,而是由你明确指定每台服务器的处理能力相对值,并确保调度逻辑按此执行。
必须用 balancer:// 协议定义后端池
权重(weight)只在 <Proxy "balancer://xxx"> 块中对 BalancerMember 设置才有效。以下写法是错误的:
✘ 错误示例(会被忽略或报错):ProxyPass / balancer://mycluster/ http://10.0.1.10:8080 weight=3
✓ 正确结构:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 先启用必要模块:
mod_proxy、mod_proxy_http、mod_proxy_balancer - 用
<Proxy "balancer://mycluster">包裹所有后端节点 - 每个
BalancerMember显式写weight=数值(推荐 Apache 2.4.7+ 使用weight,旧版用loadfactor)
选对 lbmethod 才能让权重生效
权重怎么被“算”取决于负载均衡算法。默认的 byrequests 是最常用也最符合“按比例分流”的直觉:
-
lbmethod=byrequests:按请求数累计,权重 4 和 1 就接近 4:1 分流(需关闭 sticky session 干扰) -
lbmethod=bytraffic:按响应字节数加权,适合大文件服务;小页面测试看不出差异 -
lbmethod=bybusyness:完全忽略 weight,只看当前活跃连接数——这是“压力感知”的近似方式,但不是基于你设的权重
务必显式声明:ProxySet lbmethod=byrequests,不要依赖默认值(尤其在复杂配置中)。
避开常见干扰项
即使 weight 写对了,流量也可能偏离预期。排查重点:
-
会话粘滞(sticky session):如果配置了
stickysession=JSESSIONID,同一用户所有请求都会固定到一台机器,权重失效。临时注释掉测试 -
健康检查失败或 retry 时间过长:某节点短暂超时后被标记为临时失效,默认
retry=60秒内不再转发请求。可调为retry=10加快恢复 -
节点状态被禁用:检查是否误加了
status=+H(禁用)或status=+D(停用),这类节点不会收任何流量 -
权重值过大或含小数:Apache 内部用整型计数器,
weight=100和weight=4等价于weight=25和weight=1,但前者易溢出;weight=0.8会被截断为 0
验证分流效果
别只看日志总数,要实时观察动态分布:
- 启用并安全配置
/balancer-manager页面(需mod_status和访问控制) - 访问该页面,查看 “Current Load” 列:在
byrequests下它显示各节点已处理请求数;在bytraffic下显示累计响应字节 - 用脚本循环发起请求(如
for i in {1..100}; do curl -sI http://lb/ >/dev/null; done),再刷新页面对比数值增长比

















