Haproxy:
haproxy是一个开源的高性能反向代理和负载均衡器,主要用于TCP和HTTP流量管理。
-
功能和特点:haproxy能够处理大量的并发连接,支持TCP和HTTP协议,具有高可用性和负载均衡功能。它特别适用于需要处理大量流量的网站,能够保护web服务器不被直接暴露在网络中,同时提供基于cookie的会话保持、健康检查、动态和静态负载均衡策略等功能。23
-
应用场景:haproxy被广泛应用于各种需要高性能网络流量管理的场景,包括网站、应用服务等。由于其高性能和可靠性,haproxy已经成为许多高流量网站的负载均衡解决方案。36
-
技术细节:haproxy采用事件驱动、单一进程模型,这种模型在处理大量并发连接时表现出色。此外,haproxy还支持多种负载均衡算法,如轮询、最少连接等,以及健康检查功能,能够在后端服务器出现问题时自动剔除,恢复后自动重新加入。24
总之,haproxy是一个功能强大且高效的工具,适用于需要高性能网络流量管理的各种环境。
1.haproxy七层代理
1.1负载均衡
Haproxy负载均衡是一种建立在现有网络结构之上,提供廉价有效透明的方法扩展网络设备和服务器的方法,通过数据流量分摊到多个服务器上执行,减轻每台服务器的压力,从而提高网络的灵活性和可用性。Haproxy特别适用于负载特大的web站点,这些站点通常需要会话保持或七层处理。Haproxy运行在时下的硬件上,可以支持数以万计的并发连接,并且它的运行模式使得它可以简单安全地整合进用户当前的架构中,同时保护web服务器不被暴露到网络上。Haproxy实现了一种事件驱动、单一进程模型,支持非常大的并发连接数,这种模型在用户空间实现所有任务,没有多进程或多线程模型所面临的内存限制、系统调度器限制以及锁限制等问题,从而能够处理高并发连接。此外,Haproxy还支持连接拒绝和全透明代理等特性,为网站提供了额外的安全保障。
1.2四层负载均衡
Haproxy的四层负载均衡是基于传输层(TCP/UDP)的负载均衡技术。它通过发布三层(网络层)的IP地址(VIP)加上四层(传输层)的端口号来决定哪些流量需要进行负载均衡。这种负载均衡架构不需要解析报文消息内容,因此在网络吞吐量与处理能力上相对较高。四层负载均衡主要基于IP地址和端口号进行流量分发,例如,通过VIP和特定的端口号(如HTTP的80端口)来辨别是否需要处理的流量,并进行NAT处理后转发至后台服务器。此外,四层负载均衡还记录下哪个服务器处理的TCP或UDP流量,确保后续该连接的所有流量都同样转发到同一台服务器处理,从而实现负载均衡。
Haproxy作为一款基于事件驱动、单进程模型设计的负载均衡器,能够实现在TCP/UDP层面以及HTTP(S)等应用层协议上的高效流量分发,包括四层和七层负载均衡。四层负载均衡在传输层及以下工作,主要依据IP地址和端口号进行流量分发,其优势在于性能较高,因为不需要解析应用层的报文内容,从而在网络吞吐量和处理能力上表现出色
支持四层的软件:nginx,haproxy,lvs
1.3七层负载均衡
Haproxy七层负载均衡是一种基于HTTP(第七层)应用的负载均衡技术,它可以根据用户请求的内容将请求转发到不同的后端服务器。这种负载均衡方法更加复杂,因为它允许负载均衡器根据HTTP请求的内容(如URL、请求头等信息)来决定如何路由请求到后端服务器,从而实现更精细的控制和优化。Haproxy七层负载均衡特别适合需要会话保持或七层处理的高负载web站点,能够提供快速、可靠的负载均衡解决方案。
Haproxy七层负载均衡的主要特点包括:
- 会话保持:能够根据会话信息(如cookie)将用户的请求路由到同一个后端服务器,保持会话的连续性。
- 灵活性:支持多种负载均衡算法,可以根据服务器的负载情况、响应时间等因素进行动态调整,实现负载的均衡分配。
- 高性能:Haproxy能够支撑数以万计的并发连接,处理大量请求,具有高性能的特点。
- 安全性:通过HAProxy的代理,可以避免Web服务器直接暴露给外部网络,增加安全性。
- 监控与管理:拥有强大的服务器状态监控页面,可以实时了解系统的运行状况,便于管理和维护。
Haproxy七层负载均衡通过这些特点,为高负载的web应用提供了可靠、高效的负载均衡解决方案,特别适用于需要会话保持或七层处理的应用场景。
支持七层的软件:nginx,haproxy
1.4区别
四层和七层负载均衡的主要区别在于它们在网络OSI模型中的操作层次、功能和处理能力。
-
操作层次和功能:
- 四层负载均衡 主要工作在OSI模型的传输层(第4层),基于IP地址和端口号进行负载均衡。它主要负责简单的数据包转发,不涉及应用层数据的解析或修改。12
- 七层负载均衡 则工作在应用层(第7层),能够根据应用层协议(如HTTP、FTP等)的信息进行负载均衡。它能够解析和应用层的数据,如URL、HTTP头部等,从而实现更复杂的负载均衡策略,如内容交换和代理。
-
应用场景:
- 四层负载均衡 适用于对性能要求较高,且不需要复杂应用层处理的场景,如简单的TCP应用。35
- 七层负载均衡 更适合需要智能处理的应用,如网站或内部信息平台等基于B/S开发的系统,因为它可以根据应用层信息优化流量分配,提高系统灵活性和安全性。
-
技术特点:
- 四层负载均衡处理速度快,但功能相对简单;七层负载均衡虽然处理开销较大,但提供了更强大的功能和灵活性。4
总结来说,选择四层还是七层负载均衡取决于具体的应用需求和技术要求。
2.Haproxy软件下载
LINUX中:dnf install haproxy -y
实验环境:三台主机,haproxy,web1,web2
分别对三台主机进行如下配置
haproxy ip配置
web1 ip配置
web2 ip配置
三台主机均关闭防火墙和SELINUX
下载安装包
#haproxy
dnf install haproxy -y
dnf install socat -y #可调整服务器动态权重和其它状态
#server1、server2
dnf install nginx
echo webserver1 -172.25.250.10 > /usr/share/nginx/html/index.html #server1的访问页面
echo webserver2 -172.25.250.20 > /usr/share/nginx/html/index.html #server2的访问页面
systemctl enable --now nginx
curl 172.25.250.10
curl 172.25.250.20 #测试web服务是否正常运行
rpm -qc haproxy #查询配置文件
vim /etc/haproxy/haproxy.cfg #修改配置文件
systemctl start haproxy.service #重启服务
cat /var/log/messages #查看错误日志
对配置文件/etc/haproxy/haproxy.cfg 进行配置并测试:
修改权限
echo "help" |socat stdio /var/lib/haproxy/stats #查看帮助
echo "show info" |socat stdio /var/lib/haproxy/stats #查看haproxy状态
echo "show server stats" |socat stdio /var/lib/haproxy/stats #查看服务器状态
echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats#查看集群中server1的权重
echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats#修改集群权重
echo "disable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats#关闭web1
echo "enable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats#开启web1
仅展示了部分命令,了解更多可以去haproxy网站查询
3.haproxy算法
HAProxy支持多种调度算法,包括静态和动态调度算法。 这些算法可以根据服务器的状态和负载情况进行动态调整,以提高系统的整体性能和稳定性。
以下是HAProxy中常见的几种调度算法及其特点:
-
Round Robin(轮询):这是最简单常用的一种算法,基于权重进行轮询调度。在服务器的处理时间保持均匀分布时,这是一种最平衡、最公平的算法。此算法是动态的,表示其权重可以在运行时进行调整。
-
Least Connections(最少连接数) :新的连接请求被派发至具有最少连接数目的后端服务器。在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP。
-
Source IP Hash:基于来源访问调度算法,用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度。这种方式可以使同一个客户端IP的请求始终被转发到某特定的后端服务器。
-
URI Hash:基于请求的URI将请求转发至同一个后端节点上。这种模式在缓存代理实现中,对于增加缓存命中率非常理想。
-
URL Parameter:基于请求的URL参数进行调度。
这些调度算法可以根据具体的应用场景和需求进行选择,以达到最佳的负载均衡效果。
3.1 静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。
3.1.1static-rr:基于权重的轮询调度
不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
不支持端服务器慢启动
其后端主机数量没有限制,相当于LVS中的 wrr
3.1.2 first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
3.2 动态算法
基于后端服务器状态进行调度适当调整, 新请求将优先调度至当前负载较低的服务器 权重可以在haproxy运行时动态调整无需重启
3.2.1 roundrobin
-
基于权重的轮询动态调度算法,
-
支持权重的运行时调整,不同于lvs中的rr轮训模式,
-
HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
-
其每个后端backend中最多支持4095个real server,
-
支持对real server权重动态调整,
-
roundrobin为默认调度算法,此算法使用广泛
3.2.2 leastconn
eastconn加权的最少连接的动态
支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户 端连接)
比较适合长连接的场景使用,比如:MySQL等场景
3.3 其他算法
其它算法即可作为静态算法,又可以通过选项成为动态算法
3.3.1 source
源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一 个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服 务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP
模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持
cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
4.Haproxy高级功能及配置、
4.1状态页
stats enable #基于默认的参数启用stats page
stats hide-version #将状态页中haproxy版本隐藏
stats refresh <delay> #设定自动刷新时间间隔,默认不自动刷新
stats uri <prefix> #自定义stats page uri,默认值:/haproxy?stats
stats auth <user>:<passwd> #认证时的账号和密码,可定义多个用户,每行指定一个用户
#默认:no authentication
stats admin { if | unless } #启用stats page中的管理功能
4.2、基于cookie的会话保持
在一个浏览器访问后,会记住选择,之后刷新一直是该后端主机,另一个浏览器访问则是另一个后端主机
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
balance roundrobin
cookie WEBCOOKIE insert nocache indirect
server web1 172.25.250.10:80 cookie aaa1 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.250.20:80 cookie aaa2 check inter 2 fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# curl -b WEBCOOKIE=aaa1 172.25.250.100
webserver1 - 172.25.250.10
[root@haproxy ~]# curl -b WEBCOOKIE=aaa2 172.25.250.100
webserver2 - 172.25.250.20
4.3 backend server信息
session rate(每秒的连接会话信息): Errors(错误统计信息):
cur:每秒的当前会话数量 : Req:错误请求量
max:每秒新的最大会话数量 conn:错误链接量
limit:每秒新的会话限制量 Resp:错误响应量
sessions(会话信息): Warnings(警告统计信息):
cur:当前会话量 Retr:重新尝试次数
max:最大会话量 Redis:再次发送次数
limit: 限制会话量
Total:总共会话量 Server(real server信息):
LBTot:选中一台服务器所用的总时间 Status:后端机的状态,包括UP和DOWN Last:和服务器的持续连接时间 LastChk:持续检查后端服务器的时间
Wght:权重
Bytes(流量统计): Act:活动链接数量
In:网络的字节输入总量 Bck:备份的服务器数量
Out:网络的字节输出总量 Chk:心跳检测时间
Dwn:后端服务器连接后都是DOWN的数量
Denied(拒绝统计信息): Dwntme:总的downtime时间
Req:拒绝请求量 Thrtle:server 状态
Resp:拒绝回复量
4.4ip透传
七层代理
七层代理 mode--->http
#webserver1
[root@webserver1 ~]# systemctl disable nginx
[root@webserver1 ~]# systemctl stop nginx
[root@webserver1 ~]# dnf install httpd -y
[root@webserver1 ~]# echo webserver1 - 172.25.250.10 > /var/www/html/index.html
[root@webserver1 ~]# vim /etc/httpd/conf/httpd.conf
如下图标注
%{X-Forwarded-For}i
[root@webserver1 ~]# systemctl enable --now httpd
#测试
[root@webserver1 ~]# tail -n 3 /etc/httpd/logs/access_log
[root@webserver2 ~]# tail -3 /var/log/nginx/access.log
四层代理
四层代理mode--->tcp
看不到IP地址
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
mode tcp
server web1 172.25.250.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.250.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service
#webserver2
[root@webserver2 ~]#
vim /etc/nginx/nginx.conf
http {
log_format main '$remote_addr - remote_user \[time_local] "request"'
' "proxy_protocol_addr"'
server {
listen 80 proxy_protocol;
[root@webserver2 ~]# systemctl restart nginx
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
server web1 172.25.250.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.250.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service
# 测试
[root@webserver2 ~]# tail -n 3 /var/log/nginx/access.log
[root@webserver1 ~]# tail -n 3 /etc/httpd/logs/access_log
4.5基于文件后缀名实现动静分离
[root@webserver1 ~]# dnf install php -y
[root@webserver1 ~]# systemctl restart httpd
[root@webserver1 ~]# vim /var/www/html/index.php
[root@webserver1 ~]# cat /var/www/html/index.php
<?php
phpinfo();
?>
#haproxy
frontend webcluster
bind *:80
mode http
acl static path_end -i .html .jpg .png .css .js
acl php path_end -i .php
use_backend webcluster-host if php
default_backend default-host
5.自定义HAProxy错误界面
基于自定义的错误页面文件
#webserver1\2主机上
system stop httpd
#haproxy主机上
[root@haproxy ~]# mkdir /etc/haproxy/errorpage -p
[root@haproxy ~]# vim /etc/haproxy/errorpage/503.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html;charset=UTF-8
<html><body><h1>什么动物生气最安静</h1>
大猩猩!!
</body></html>
[root@haproxy ~]# vim /etc/haproxy/haproxy.conf
defaults
errorfile 503 /etc/haproxy/errorpage/503.http
[root@haproxy ~]# systemctl restart haproxy.service
然后用浏览器去访问172.25.250.130
6、haproxy https实现
#证书制作
[root@haproxy ~]# mkdir -p /etc/haproxy/certs
[root@haproxy ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/timinglee.org.key -x509 -days 356 -out /etc/haproxy/certs/timinglee.org.crt
CD shannxi XIan timinglee webserver www.timinglee.org admin@timinglee.org
[root@haproxy ~]# ls /etc/haproxy/certs/
[root@haproxy ~]# cat /etc/haproxy/certs/timinglee.org.key /etc/haproxy/certs/timinglee.org.crt > /etc/haproxy/certs/timinglee.pem
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend webcluster
bind *:80
mode http
redirect scheme https if !{ ssl_fc } #全网站加密
backend webcluster-host
mode http
server web1 172.25.250.10:80 check inter 2 fall 2 rise 5
backend default-host
mode http
server web2 172.25.250.20:80 check inter 2 fall 2 rise 5
listen web-https
bind *:443 ssl crt /etc/haproxy/certs/timinglee.pem
mode http
balance roundrobin
server web1 172.25.250.10:3306 check inter 2 fall 2 rise 5
server web2 172.25.250.20:3306 check inter 2 fall 2 rise 5
[root@haproxy ~]# systemctl restart haproxy
[root@haproxy ~]# netsata -antup | grep 443
开启web1,web2服务
访问https://172.25.250.130
完成