haproxy的安装部署
- haproxy简介
- 安装haproxy并修改配置文件实现轮询
- haproxy的健康检查功能
- Backend后端配置
- 功能
- 常见的负载均衡调度算法
- 日志设备配置
- 限制IP访问+重定向
- 读写分离
haproxy简介
HAProxy是由 WillyTarreau开发的一款具备高可用性、负载均及基于 TCP和 HTTP的应用代理开源软件,基于HAProxy的负载均衡架构是最为常见的免费、快速且具备可靠性的集群负载均衡架构解决方案。此外,HAProxy特别适合应用于需要会话保持或七层处理的高负载 web站点,就当前常见硬件体系架构,基于HAProxy的负载均衡系统完全可以支撑数以万计的并发连接.同时,HAProxy的运行模式使其整合到用户当前的基础架构中是个非常简单且安全的过程。通过 HAProxy的代理,还可以避免用户的 Web服务器直接暴露到外部网络中。
Haproxy 并不是 web 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。简单说,就是他们能处理解析页面的。而Haproxy 仅仅是一款的用于均衡负载的应用代理。其自身并不能提供web服务。但其配置简单,拥有非常不错的服务器健康检查功能还有专门的系统状态监控页面,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。
安装haproxy并修改配置文件实现轮询
[root@vm4 ~]# yum install haproxy /安装
[root@vm4 ~]# cd /etc/haproxy/
[root@vm4 haproxy]# ls
[root@vm4 haproxy]# vim haproxy.cfg /修改配置文件
stats uri /status 设置haproxy 监控页面的访问地址为/status
注释掉这些前后端默认的配置,前端与后端是HAProxy配置中的关键部分,通常前端负责监听请求连接,后端负责负载均衡。
#roundrobin 轮询方式轮询方式
后端实例的名称是 app,采用 Round-Robin负载均衡算法。server行定义后端的真实服务器,服务器的名称为app1、app2、app3和 app4,这里的服务器名称并非真实的后端服务器主机名,而只是便于识别的自定义服务器名称,服务器的具体地址通过紧随其后的地址和端口号来确定。
[root@vm4 haproxy]# systemctl restart haproxy.service
重启服务实现轮询
通过浏览器访问到haproxy的监控页面
haproxy的健康检查功能
其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。
当我们注释掉一个后端时,将只会有一个后端响应,拥有非常好的高可用性。
[root@vm4 haproxy]# vim haproxy.cfg
[root@vm4 haproxy]# systemctl restart haproxy.service
[root@vm4 haproxy]# curl 192.168.1.4
HAProxy为每个监听代理提供了实时监控。
Backend后端配置
功能
后端配置主要实现两个主要功能:一是负载均衡调度算法的设置;二是设置最终响应请求的服务器池各个节点的IP地址和端口,并设置每个节点的健康检查方式。
常见的负载均衡调度算法
Round-Robin(roundrobin):与Keeplived的Round-Robin类似,使用这种算法服务请求会被轮询转发到服务器池中的每一个服务器上,而不去评估服务器的‰负载和处理能力,服务器池中的每个节点都被轮询转发请求。
Static Round-Robin(static-rr):与 Round-Robin一样轮询转发请求到每一个后端服务器,但是不允许对后端服务器进行动态加权设置,即服务器的权重是静态固定的,而由于权重静态固定,后端服务器池中的节点数目不受限。
Least-connection(leastconn):即最少连接数算法,与Keepalived的最少连接数算法类似,后端服务器活动连接数越多,则接收到的服务请求就越少,反之,则接收到的服务请求越多。
Source(source):该算法将请求中的源IP地址进行HASH后除以全部正常运行的后端服务器权重来决定接收服务请求的服务器,在这种算法中,同一个客户端(相同的源 IP地址)发出的请求会被固定转发给某一个固定的后端服务器。 但是,如果服务器权重大小发生改变或者服务器数目出现变动,则响应该客户端请求的后端服务器会改变,因为这时的 HASH/Wight值已经改变。
URL(url):该算法将请求URL字符串进行HASH并除以全部正常运行的后端服务器权重来决定接收服务请求的服务器,在这种算法中,指向同一目标站点的服务请求会被固定转发到相同的后端服务器上。URL也称为基于目标地址 的HASH负载均衡算法,主要用于Web Cache集群中,通过URL负载均衡算法,可以避免请求因为指向不同的cache服务器而导致缺页,而缺页会导致刷新 cache最终降低系统响应速率。
URL Parameter(uri_param):该算法通过查询源 HTTP请求报文中的某一字符串参数并将其进行 HASH后除以全部服务器权重来决定接收服务请求的服务器。如果HTTP报文中没有需要的参数,则默认使用Round_Robin算法
Header Name(hdr):该算法通过查询HTTP请求报文中的HEAD字段并将HASH后除以全部服务器权重来决定接收服务请求的服务器。如果报文中没有HEAD参数,则默认使用Round_Robin算法。
Round-Robin(roundrobin):与Keeplived的Round-Robin类似,使用这种算法服务请求会被轮询转发到服务器池中的每一个服务器上,而不去评估服务器的‰负载和处理能力,服务器池中的每个节点都被轮询转发请求。
Static Round-Robin(static-rr):与 Round-Robin一样轮询转发请求到每一个后端服务器,但是不允许对后端服务器进行动态加权设置,即服务器的权重是静态固定的,而由于权重静态固定,后端服务器池中的节点数目不受限。
Least-connection(leastconn):即最少连接数算法,与Keepalived的最少连接数算法类似,后端服务器活动连接数越多,则接收到的服务请求就越少,反之,则接收到的服务请求越多。
Source(source):该算法将请求中的源IP地址进行HASH后除以全部正常运行的后端服务器权重来决定接收服务请求的服务器,在这种算法中,同一个客户端(相同的源 IP地址)发出的请求会被固定转发给某一个固定的后端服务器但是,如果服务器权重大小发生改变或者服务器数目出现变动,则响应该客户端请求的后端服务器会改变,因为这时的 HASH/Wight值已经改变。
URL(url):该算法将请求URL字符串进行HASH并除以全部正常运行的后端服务器权重来决定接收服务请求的服务器,在这种算法中,指向同一目标站点的服务请求会被固定转发到相同的后端服务器上。URL也称为基于目标地址的HASH负载均衡算法,主要用于Web Cache集群中,通过URL负载均衡算法,可以避免请求因为指向不同的cache服务器而导致缺页,而缺页会导致刷新 cache最终降低系统响应速率。
URL Parameter(uri_param):该算法通过查询源 HTTP请求报文中的某一字符串参数并将其进行 HASH后除以全部服务器权重来决定接收服务请求的服务器。如果HTTP报文中没有需要的参数,则默认使用Round_Robin算法
Header Name(hdr):该算法通过查询HTTP请求报文中的HEAD字段并将HASH后除以全部服务器权重来决定接收服务请求的服务器。如果报文中没有HEAD参数,则默认使用Round_Robin算法。
举例如下:
source,同一个客户端(相同的源 IP地址)发出的请求会被固定转发给某一个固定的后端服务器
[root@vm4 haproxy]# vim haproxy.cfg
[root@vm4 haproxy]# systemctl restart haproxy.service
[root@vm4 haproxy]# curl 192.168.1.4
两个后端服务器都在正常运行,响应的只有vm5
日志设备配置
[root@vm4 haproxy]# vim /etc/rsyslog.conf
[root@vm4 haproxy]# cat /var/log/haproxy.log
[root@vm4 haproxy]# systemctl restart rsyslog.service
[root@vm4 haproxy]# cat /var/log/haproxy.log
[root@vm4 haproxy]# vim haproxy.cfg
[root@vm4 haproxy]# systemctl reload haproxy
[root@vm4 haproxy]# cat /var/log/haproxy.log
对于大规模集群,负载均衡器可能会由运行 HAProxy的多个节点组成,如果每个 HAProxy节点都将日志存放到本地,则日志监控和查看极为不便,因此通常会借助远程日志记录功能(如 rsyslog)将分散的节点日志集中到某台日志服务器上,这时就需要在每个 HAProxy的全局配置段中指定远程日志服务器的地址和对应的日志记录设备,同时在远程日志记录服务器上进行相应的设置。在云端日志服务器上开启 rsyslog的 HAProxy日志记录功能所需做的设置如下:
为HAProxy设置日志设备和输出文件,这里定义的日志设备要与haproxy·cfg全局配置段中log参故设置的匹配,在/etc/rsyslog.conf中添加如下语句:
#打开以下两行的注释,不打开收不到日志
恢复默认轮询算法
分别重启 rsyslog和 haproxy ,已生成成功。
[root@vm4 haproxy]# vim haproxy.cfg
[root@vm4 haproxy]# systemctl reload haproxy.service
60 stats uri /status
61 stats auth admin:westos #admin界面,验证成功后允许管理节点
62 #---------------------------------------------------------------------
63 # main frontend which proxys to the backends
64 #---------------------------------------------------------------------
65 frontend main *:80
#定义当请求的内容是静态内容时,将请求转交给static server的acl规则
66 acl url_static path_beg -i /static /images /javascript /stylesheets
67 acl url_static path_end -i .jpg .gif .png .css .js
68
69 use_backend static if url_static #引用acl匹配规则
70 default_backend app
71
72 #---------------------------------------------------------------------
73 # static backend for serving up images, stylesheets and such
74 #---------------------------------------------------------------------
75 backend static
76 balance roundrobin
77 server static 192.168.1.6:80 check
78
79 #---------------------------------------------------------------------
80 # round robin balancing between the various backends
81 #---------------------------------------------------------------------
82 backend app
83 balance roundrobin
84 # balance source
85 server app1 192.168.1.5:80 check
86 # server app2 192.168.1.6:80 check
87
在vm6中,
[root@vm6 ~]# systemctl start httpd
root@vm6 ~]# cd /var/www/html
[root@vm6 html]# mkdir images
[root@vm6 html]# cd images/
[root@vm6 images]# scp root@192.168.1.250:/home/westos/Documents/vim.jpg .
[root@vm6 images]# ls
vim.jpg
当访问/images时,显示的是静态页面
限制IP访问+重定向
[root@vm4 haproxy]# vim haproxy.cfg
[root@vm4 haproxy]# systemctl reload haproxy.service
71 acl blacklist src 192.168.1.250 //不允许该ip访问,访问时,显示403
72 block if blacklist
73 errorloc 403 http://www.baidu.com //发生403报错时,页面会跳转到百度访问页面
读写分离
62 #---------------------------------------------------------------------
63 # main frontend which proxys to the backends
64 #---------------------------------------------------------------------
65 frontend main *:80
66 acl url_static path_beg -i /static /images /javascript /stylesheets
67 acl url_static path_end -i .jpg .gif .png .css .js
68 acl blacklist src 192.168.1.250
69 acl write method POST
70 acl write method PUT
71 use_backend static if write
72 default_backend app
73
[root@vm5 ~]# cd /var/www/html/
[root@vm5 html]# yum install php -y
[root@vm5 html]# vim index.php
[root@vm5 html]# mkdir -m777 upload
[root@vm5 html]# vim upload_file.php
[root@vm5 html]# systemctl start httpd
在vm5和vm6中写入
index.php
1 <html>
2 <body>
3
4 <form action="upload_file.php" method="post"
5 enctype="multipart/form-data">
6 <label for="file">Filename:</label>
7 <input type="file" name="file" id="file" />
8 <br />
9 <input type="submit" name="submit" value="Submit" />
10 </form>
11
12 </body>
13 </html>
~
upload_file.php
1 <?php
2 if ((($_FILES["file"]["type"] == "image/gif")
3 || ($_FILES["file"]["type"] == "image/jpeg")
4 || ($_FILES["file"]["type"] == "image/pjpeg"))
5 && ($_FILES["file"]["size"] < 20000000))
6 {
7 if ($_FILES["file"]["error"] > 0)
8 {
9 echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
10 }
11 else
12 {
13 echo "Upload: " . $_FILES["file"]["name"] . "<br />";
14 echo "Type: " . $_FILES["file"]["type"] . "<br />";
15 echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
16 echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
17
18 if (file_exists("upload/" . $_FILES["file"]["name"]))
19 {
20 echo $_FILES["file"]["name"] . " already exists. ";
21 }
22 else
23 {
24 move_uploaded_file($_FILES["file"]["tmp_name"],
25 "upload/" . $_FILES["file"]["name"]);
26 echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
27 }
28 }
29 }
30 else
31 {
32 echo "Invalid file";
33 }
上传成功
vm5中读不到上传的图片
vm6中可以读到上传的图片