Apache 负载均衡配置指南
一 核心原理与准备
- 使用 mod_proxy、mod_proxy_balancer、mod_proxy_http 实现七层反向代理与负载均衡,常用算法包括 轮询(byrequests)、最少连接(least_conn)、按流量(bytraffic)、按繁忙程度(bybusyness)、IP 哈希(iphash)。
- 建议同时启用 mod_slotmem_shm,为 balancer-manager 提供共享内存支持。
- 系统准备:开放 80/443,放行 Apache 到后端端口(如 8080);后端服务需可达且返回正确的 Location/Set-Cookie 等头以便反向代理修正。
二 安装与启用模块
- Ubuntu/Debian
- 安装与启用:sudo apt-get install apache2;sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests;sudo systemctl restart apache2
- CentOS/RHEL
- 安装与启用:sudo yum install httpd mod_proxy mod_proxy_http;启用模块(编辑 httpd.conf 或 conf.modules.d 中对应 LoadModule 行);sudo systemctl enable --now httpd
- 模块要点
- 必须:proxy、proxy_http、proxy_balancer、lbmethod_byrequests
- 可选:slotmem_shm(管理共享内存,启用 balancer-manager 需要)、lbmethod_bytraffic / lbmethod_bybusyness / lbmethod_iphash(对应算法)
三 最小可用配置示例
<VirtualHost *:80>
ServerName www.example.com
# 可选:Balancer 管理页面(仅内网访问)
<Location /balancer-manager>
SetHandler balancer-manager
Require host localhost
</Location>
# 定义后端集群
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.101:8080 route=server1
BalancerMember http://192.168.1.102:8080 route=server2
ProxySet lbmethod=byrequests
</Proxy>
# 转发规则
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
- 要点
- 使用 ProxyPass / balancer://… 统一转发;ProxyPassReverse 修正重定向与 Set-Cookie 域名/端口。
- 管理页面建议仅本地访问,生产环境可关闭或加 IP 白名单。
四 关键进阶配置
- 会话保持(Sticky Sessions)
- 基于 Cookie:ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|PHPSESSID
- 基于源 IP 哈希:启用 lbmethod_iphash 模块,并在集群上设置 lbmethod=iphash(适合无法共享 Session 的场景)。
- 配合后端:如 Tomcat 需在 Engine 配置 jvmRoute=server1|server2,与 BalancerMember 的 route 一致。
- 健康检查
- 被动探测:BalancerMember 增加 ping=5(每 5 秒发 OPTIONS 探测存活)。
- 主动与健康阈值:BalancerMember 增加 status=+H(热备);集群上设置 failonstatus=500,503 将异常节点剔除。
- 新版本增强:Apache 2.4.37+ 支持 healthcheck=on、hcmethod=GET|HEAD、hcexpr=200-399 等更细粒度策略。
- 权重与故障策略
- 权重:BalancerMember 增加 loadfactor=3(相对权重,默认 1)。
- 超时与重试:如 timeout=10、retry=60、maxattempts=3,控制连接与故障恢复。
- 连接与缓冲优化
- 连接池:<Proxy *> 内 ProxySet maxconnections=50、acquire=3000
- 缓冲:ProxyIOBufferSize 8192、ProxyReceiveBufferSize 16384
- 示例(会话保持 + 权重 + 故障阈值)
<Proxy balancer://mycluster>
BalancerMember http://10.0.0.11:8080 route=app1 loadfactor=3 ping=5
BalancerMember http://10.0.0.12:8080 route=app2 loadfactor=1 ping=5 status=+H
ProxySet lbmethod=byrequests
ProxySet failonstatus=500,503
ProxySet timeout=10 retry=60 maxattempts=3
</Proxy>
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://mycluster/
- 说明
- 不同 Apache 版本对主动健康检查与健康表达式支持差异较大,建议先验证版本与模块可用性。
五 验证 监控 与排错
- 验证
- 访问应用域名,观察多后端命中;查看 balancer-manager 页面中各节点请求分布、错误计数与负载系数。
- 使用 ab/jmeter 做压测,核对吞吐、错误率与会话保持效果。
- 常见问题
- 502 Bad Gateway:后端未监听正确端口、防火墙/SELinux 拦截、ProxyTimeout 过短。
- 负载不均:调整 loadfactor、改用 least_conn 或 bybusyness,排查后端性能差异。
- 运维与安全
- 限制 /balancer-manager 的访问来源;对外启用 HTTPS 终止与回源加密。
- 负载均衡器单点可用:结合 Keepalived/VIP 或上层云 LB 实现高可用。