Apache不对静态请求加权分发,仅对动态请求(如/api)通过balancer://集群按weight值和lbmethod算法实现加权负载均衡,需严格动静分离、禁用stickysession并合理配置健康检查与连接复用。

Apache 本身不直接对“静态请求”做加权分发——静态资源由 Apache 本地响应,不走代理;所谓“加权分发”,只适用于动态请求的后端集群。真正需要加权的是多个动态应用节点(如多台 Tomcat),而静态资源应由 Apache 直接服务,不参与权重调度。
明确动静职责边界
加权分发的前提是先完成动静分离:Apache 负责静态文件(HTML/CSS/JS/图片等)的零计算响应;动态请求(如 /api、/admin、/*.do)才被代理出去,并在多个后端间按权重分配。
- 静态路径必须优先排除,避免被误代理:用 ProxyPass /static ! 或 ProxyPass /assets ! 显式跳过
- 动态路径统一归入负载均衡集群,例如所有 /api 开头的请求都走 balancer://myapi
- 不要把静态目录配置成 ProxyPass,否则会绕过本地文件系统,白白增加代理开销
配置加权负载均衡集群
启用 mod_proxy、mod_proxy_http 和 mod_proxy_balancer 后,在虚拟主机或主配置中定义带权重的后端组:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 使用 balancer:// 协议声明集群:<Proxy "balancer://myapi">
- 每个 BalancerMember 指定真实地址和整数 weight(如 weight=3),默认为 1
- 必须显式设置调度算法:ProxySet lbmethod=byrequests(按请求数比例)或 bybusyness(按当前活跃连接数)
- 最后用 ProxyPass /api balancer://myapi/api 将路径接入该集群
确保权重生效的关键细节
权重配置写对只是第一步,常见失效原因往往藏在配套设置里:
- 禁用会话粘滞:stickysession(如 JSESSIONID)会让用户固定到某节点,掩盖权重效果;调试时可临时注释掉
- 控制健康检查节奏:设 hcinterval=15、hcfail=3,避免因探测太频繁压垮后端,或太迟钝导致故障节点仍收流量
- 不要混用算法:bybusyness 完全忽略 weight,若需严格按比例,请用 byrequests
- 验证方式:访问 /balancer-manager(需授权),观察各节点的 “Current Load” 是否随权重线性增长
协同优化提升加权实际效果
权重分发要落地,还需前后端配合:
- Apache 端开启 KeepAlive(KeepAliveTimeout 6、MaxKeepAliveRequests 300),后端(如 Tomcat)必须匹配,否则连接复用断开,导致每次请求重新选节点
- 对 API 类服务,建议用 bybusyness + HEAD 健康探针,比静态 weight 更贴近实时压力
- 若后端支持 HTTP/2,加上 ProxySet http2=on,提升高权重节点的并发吞吐能力
- 精简响应头(Header unset Server X-Powered-By)、启用代理层缓存(CacheEnable socache),减少加权链路的无效负载

















