一、准备工作:安装并启用必要模块
Apache实现负载均衡需依赖mod_proxy(代理模块)、mod_proxy_balancer(负载均衡器模块)及对应的算法模块(如lbmethod_byrequests)。通过以下命令启用(以Ubuntu/Debian为例,CentOS需用yum安装模块):
sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
sudo systemctl restart apache2 # 重启Apache使模块生效
注:CentOS系统需先安装
mod_proxy和mod_proxy_http(sudo yum install mod_proxy mod_proxy_http),再启用模块。
二、基础负载均衡配置
定义后端服务器集群
在Apache配置文件(如/etc/apache2/sites-available/000-default.conf或/etc/httpd/conf.d/load_balancer.conf)中,用<Proxy>块创建集群(如mycluster),并通过BalancerMember指令添加后端服务器地址(支持HTTP/HTTPS):
<VirtualHost *:80>
ServerName example.com
# 定义负载均衡集群
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com # 后端服务器1
BalancerMember http://backend2.example.com # 后端服务器2
# 可添加更多服务器,如BalancerMember http://backend3.example.com
</Proxy>
# 将请求转发到集群
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/ # 修改响应头中的Location/Refresh为集群地址
</VirtualHost>
ProxyPassReverse用于确保后端服务器返回的重定向地址指向负载均衡器,避免客户端直接访问后端。
选择负载均衡策略
默认采用轮询(Round Robin)(请求依次分配给各服务器)。若需其他策略,可通过ProxySet指令设置:
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com
BalancerMember http://backend2.example.com
ProxySet lbmethod=byrequests # 默认,可省略
</Proxy>
# 改为最少连接:需确保模块lbmethod_bytraffic或lbmethod_bybusyness已启用
ProxySet lbmethod=bybusyness # 按服务器繁忙程度分配(Apache 2.4+)
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com route=1
BalancerMember http://backend2.example.com route=2
ProxySet lbmethod=byrequests
</Proxy>
# 需配合IP哈希算法(需Apache 2.4.7+)
ProxySet lbmethod=iphash
注:
bybusyness(按繁忙程度)需Apache 2.4及以上版本,iphash需2.4.7及以上。
三、高级配置:优化负载均衡
会话保持(Sticky Sessions)
若应用依赖Session(如PHP、Java Web),需确保同一客户端的请求始终分发到同一后端服务器。通过route参数和stickysession指令实现:
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com route=backend1
BalancerMember http://backend2.example.com route=backend2
ProxySet lbmethod=byrequests
</Proxy>
# 启用会话保持(以JSESSIONID为例,需与应用Session ID一致)
ProxyPass / balancer://mycluster stickysession=JSESSIONID
ProxyPassReverse / balancer://mycluster
注:
route参数需与后端服务器配置的jvmRoute(Tomcat)或sessionid(PHP)一致。
健康检查
自动剔除故障后端服务器,避免请求分发到不可用节点。通过healthcheck指令开启(Apache 2.4.37+):
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com route=1
BalancerMember http://backend2.example.com route=2
ProxySet lbmethod=byrequests
ProxySet healthcheck=on # 开启健康检查
ProxySet hcmethod=GET # 检查方法(GET/HEAD)
ProxySet hcexpr=200-399 # 响应码范围(200-399视为健康)
</Proxy>
若后端服务器未响应或返回错误码,Apache会自动将其标记为故障,停止分发请求。
负载权重调整
根据后端服务器性能差异,分配不同权重(loadfactor),性能强的服务器处理更多请求:
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com loadfactor=3 # 权重3(处理3/5请求)
BalancerMember http://backend2.example.com loadfactor=2 # 权重2(处理2/5请求)
ProxySet lbmethod=byrequests
</Proxy>
权重越高,分配的请求数越多,适合服务器配置不均的场景。
四、验证与重启
000-default.conf或load_balancer.conf)。systemctl restart apache2,CentOS用systemctl restart httpd)。http://example.com,多次刷新页面,观察请求是否分发到不同后端服务器(可通过后端服务器日志确认)。curl命令快速测试:for i in {1..10}; do curl -s http://example.com; done
mod_status)。注意事项
balancer://mycluster中的http://改为https://,并配置SSL证书(如SSLCertificateFile和SSLCertificateKeyFile)。