1、负载均衡需要的模块
Apache实现负载均衡也与Nginx一样,通过反向代理进行负载均衡,将请求从前端代理到后端定义的负载均衡服务器组。所以负载均衡也需要打开反向代理需要的模块,另外需要打开以下负载均衡需要的模块:
# 在Apache主配置文件httpd.conf中取消以下行的注释
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
2、Apache负载均衡算法
Apache支持以下三种负载均衡算法:
- byrequests:Apache默认负载均衡算法,基于请求数量计算权重
- bytraffic:基于I/O流量大小计算权重
- bybusyness:基于繁忙程度(挂起的请求,即排队暂未处理的请求)数量计算权重
3、设置后端负载均衡服务器组
使用如下配置设置一组负载均衡服务器:
<Proxy balancer://自定义组名>
BalancerMember 后端URL1 [loadfactor=n] [timeout=n]
BalancerMember 后端URL2 [loadfactor=n] [timeout=n]
...
BalancerMember 后端URLn [loadfactor=n] [timeout=n]
ProxySet lbmethod=负载均衡算法
</Proxy>
- loadfactor:定义后端服务器的权重,默认为1,可设置1到100之间的任何值,值越大权重越高。比如某台后端服务器该值设置为3,则前端访问四次会有三次请求转给该服务器
- timeout:定义等待后端节点返回数据的超时时间,单位为秒
4、通过反向代理指定后端负载均衡组
ProxyPass "URL路径" "balancer://自定义负载均衡组名"
5、Apache负载均衡状态页
Apache提供了负载均衡状态页,可以让我们很方便的通过网页来查看负载均衡服务器组的负载状态。使用以下配置打开状态页:
<Location "自定义URI">
SetHandler balancer-manager
[Require host|not host xxx]
[Require ip|not ip xxx.xxx.xxx.xxx]
</Location>
此时通过http://xxx/自定义URI即可访问负载均衡状态页。
6、一个例子
实验环境:
- 主机A:IP地址为192.168.0.88,为前端服务器,设置虚拟主机www.abc.com
- 主机B:IP地址为192.168.0.110,无虚拟主机设置,通过IP可直接访问
- 主机C:IP地址为192.168.0.106,无虚拟主机设置,通过IP可直接访问
- 主机D:IP地址为192.168.0.61,无虚拟主机设置,通过IP可直接访问
主机A做为前端服务器提供客户端访问,主机BCD为后端服务器,提供负载均衡功能;主机A设置域名www.abc.com。
在未配置负载均衡之前,我们首先访问各主机:
主机A,www.abc.com
主机B,http://192.168.0.110
主机C,http://192.168.0.106
主机D,http://192.168.0.61
在主机A的虚拟主机www.abc.com配置文件中添加如下内容(设置负载均衡并打开状态页):
<Proxy balancer://servers>
BalancerMember http://192.168.0.110
BalancerMember http://192.168.0.106
BalancerMember http://192.168.0.61
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass "/status" ! # 因为做了全站转发,所以必须排除掉状态页
ProxyPass "/" "balancer://servers/"
ProxyPassReverse "/" "balancer://servers/"
<Location /status>
SetHandler balancer-manager
Require all granted
</Location>
重启Apache后访问www.abc.com(使用的是byrequests且没有设置权重,所以将依次访问三台后端服务器):
负载均衡状态页www.abc.com/status: