3.2 Haproxy实验
3.2.1 实验架构
本节实验架构图如下:
客户端访问http://202.0.0.1时,要把请求分发到192.168.10.100、192.168.5.102,这两台服务器上。
我们首先配置好四台主机的ip地址,并将web1、web2两台服务器部署httpd服务,并分别创建页面www1.rzz.com和www2.rzz.com。
3.2.2 Haproxy服务器配置
首先,centos的系统光盘并不自带Haproxy的程序包,所以需要我们手动下载,在这里我下载的是1.5.18版,并使用winscp工具上传至Linux系统的/mnt/目录下。然后安装该软件包:
rpm -ivh /mnt/haproxy-1.5.18-8.el7.x86_64.rpm
Haproxy的配置文件是/etc/haproxy/haproxy.cfg其中共有五个主要配置模块,当然这些组件不是必选的,可以根据需要选择部分作为配置。
另外,在defaults区域中的一些设置项,都是对连接的时间、活动时间做设置的,最好配置较大些的时间参数,否则针对远距离客户容易产生掉线。
timeout server 300s
timeout connect 300s
timeout client 300s
timeout http-request 30s
timeout queue 300s
mode tcp 好了,下面我们来正式配置Haproxy做负载均衡。正如上面对配置文件中五个配置模块的介绍,我们有两种配置方式:listen式和frontend+backend式。
方式一:listen式
在/etc/haproxy/haproxy.cfg的配置文件的最后写入如下内容:
listen testWeb 202.0.0.1:80
---定义监听名,可自定义,指定监听的ip及端口
mode http ---指定监听模式
balance roundrobin ---指定算法
server web1 192.168.10.100:80 check weight 30
---指定内部服务器及权重,并检查其状态
server web2 192.168.10.101:80 check weight 30
保存后,启动服务
systemctl restart haproxy ---启动服务
netstat -ant | grep 80 ---可见抓取
如此,一个最简单的均衡集群就搭建完毕了,我们可以使用windows客户端,多次访问http://202.0.0.1,会发现轮流显示www1.rzz.com和www2.rzz.com的两个站点。
方式二:frontend+backend式 (常用)
我们先把配置文件中方式一的代码删除或注释掉,然后写入如下内容:
frontend testWeb ---设定前端节点,名字自定义
bind 202.0.0.1:80 ---指定监听ip及端口
mode http ---指定负载均衡模式为http模式
default_backend webServers ---指定与该frontend对应的后端节点
backend webServers ---设定后端节点,名字自定义
balance roundrobin ---设置算法
server web1 192.168.10.100:80 check weight 30 ---指定内部节点服务器及权重
server web2 192.168.10.101:80 check weight 30
然后重启服务
systemctl restart haproxy
再从windows客户端多次访问http://202.0.0.1,得到与方式一相同的效果。
另外,若要haproxy支持https的分流,需要在本方式中对443端口做绑定,配置如下:
frontend testWeb ---设定前端节点,名字自定义
bind 202.0.0.1:443 ---指定监听ip及端口
mode tcp --- 注:https分流必须使用tcp模式
default_backend webServers ---指定与该frontend对应的后端节点
backend WebServers
mode tcp
balance roundrobin
server web1 192.168.10.100:443 check weight 30
server web2 192.168.10.101:443 check weight 30
可见,后面backend中增加mode tcp 句,即指定使用tcp模式接收,且server中也要指定为443端口,其他都与上面配置一样。
3.2.3 多点虚拟主机分流
之前原理中我们讲过,haproxy支持的http模式下,可以针对站点内不同的URI做区分处理,下面我们就来演示一下配置过程:
同样编辑配置文件,基于上一个实验方式二的内容,改写为如下:
frontend testWeb
bind 202.0.0.1:80 #指定监听ip及端口
mode http
acl a1 hdr(Host) -i www.rzz1.com --- -i表示忽略大小写
acl a2 hdr(Host) -i www.rzz2.com
--- 设定acl(访问控制列表)规则,名字自定义,并设置前段监听的域名
use_backend webServers1 if a1
use_backend webServers2 if a2
--- 指定满足哪个acl时使用哪个backend
default_backend webServers ---未能满足acl的访问仍走默认的backend
backend webServers1
balance roundrobin
server web1 192.168.10.100:80 check weight 30
backend webServers2
balance roundrobin
server web2 192.168.10.101:80 check weight 30
backend webServers
balance roundrobin
server web3 192.168.10.102:80 check weight 30
注:1、此处的三个backend中都可以增加多个server做负载均衡
2、此处的backend webServers中指定的web3主机,本实验中并未创建虚拟机,读者可自行创建验证。
配置完成后,我们再次重启服务
systemctl restart haproxy
然后,为了配合域名的访问,我们还需要一台DNS服务器,解析www.rzz.com、www.rzz1.com、www.rzz2.com都到202.0.0.1主机上,这里请读者自定配置,不再演示。下图是用windows搭建的dns服务器,仅供参考:
最后,我们把windows客户端网卡设置正确的DNS指向,即可验证实验了。会发现访问www.rzz1.com时,显示的是www1.rzz.com,访问www.rzz2.com时,显示的是www2.rzz.com,这与配置文件中的设置指向完全吻合。
注:可以使用如下命令检查配置文件书写是否正确。
haproxy -f /etc/haproxy/haproxy.cfg -c