Apache实现负载均衡需依赖mod_proxy(代理模块)、mod_proxy_balancer(负载均衡管理模块)及对应的协议模块(如mod_proxy_http用于HTTP协议)。以下以常见系统为例说明启用步骤:
a2enmod命令启用模块,执行sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests(lbmethod_byrequests为默认的轮询策略模块);LoadModule指令在配置文件中手动开启(如LoadModule proxy_module modules/mod_proxy.so)。sudo systemctl restart apache2(Ubuntu/Debian)或sudo systemctl restart httpd(CentOS/RHEL)。通过<Proxy>指令创建负载均衡集群(如命名为mycluster),并添加后端服务器地址(支持HTTP/HTTPS协议)。示例如下:
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com:8080 # 后端服务器1(IP/域名:端口)
BalancerMember http://backend2.example.com:8080 # 后端服务器2
# 可继续添加更多服务器,如BalancerMember http://backend3.example.com:8080
</Proxy>
使用ProxyPass和ProxyPassReverse指令将客户端请求转发至集群,并将后端服务器的响应头修改为负载均衡器的地址(避免客户端直接访问后端服务器)。示例如下:
<VirtualHost *:80>
ServerName yourdomain.com # 替换为你的域名或IP
ProxyPass / balancer://mycluster/ # 转发所有请求至集群
ProxyPassReverse / balancer://mycluster/ # 反向转发响应头
</VirtualHost>
Apache支持多种负载均衡算法,通过ProxySet指令设置(默认为轮询,即按顺序分配请求):
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com:8080
BalancerMember http://backend2.example.com:8080
ProxySet lbmethod=byrequests # 部分系统需改为bytraffic(按流量)或bybusyness(按繁忙程度)
</Proxy>
loadfactor参数为服务器分配权重(权重越高,处理的请求数越多):<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com:8080 loadfactor=3 # 权重3
BalancerMember http://backend2.example.com:8080 loadfactor=1 # 权重1
</Proxy>
若应用需要保持用户会话(如Java Web应用的JSESSIONID),需通过stickysession参数将同一用户的请求固定到同一后端服务器:
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com:8080 route=backend1 # route参数需唯一
BalancerMember http://backend2.example.com:8080 route=backend2
ProxySet lbmethod=byrequests
ProxySet stickysession=JSESSIONID # 根据JSESSIONID实现会话粘滞性
</Proxy>
通过healthcheck参数启用健康检查,自动剔除不可用的后端服务器(需Apache 2.4.2+版本):
<Proxy balancer://mycluster>
BalancerMember http://backend1.example.com:8080
BalancerMember http://backend2.example.com:8080
ProxySet lbmethod=byrequests
ProxySet healthcheck=on # 开启健康检查
</Proxy>
通过KeepAlive提升性能,减少TCP连接建立的开销:
在配置文件中添加以下指令(通常位于全局配置或虚拟主机中):
KeepAlive On # 开启KeepAlive
MaxKeepAliveRequests 100 # 单个连接最大请求数
KeepAliveTimeout 5 # 连接保持时间(秒)
修改后需重启Apache服务。
apache2ctl configtest(Ubuntu/Debian)或httpd -t(CentOS/RHEL)检查配置文件语法是否正确;http://yourdomain.com,或使用curl命令多次请求,观察请求是否被分发至不同后端服务器(可通过后端服务器日志确认):curl -I http://yourdomain.com # 查看响应头中的服务器信息
http://替换为https://,并配置SSL证书;ErrorLog和CustomLog),便于排查问题;