haproxy七层代理
实验环境搭建
[root@haproxy ~]# dnf install haproxy -y
[root@server1 ~]# dnf installl nginx -y #server主机使用nginx
[root@server1 ~]# echo " webserver 1 172.25.2550.10" > /usr/share/nginx/html/index.html
[root@server2 ~]# echo " webserver 2 172.25.2550.20" > /usr/share/nginx/html/index.html
在haproxy
#frontend webcluster
# bind *:80
# mode http
# use_backend webcluster-host
#backend webcluster-host
# balance roundrobin
# server web1 172.25.250.10:80
# server web2 172.25.250.20:80
listen webcluster #俩着都可以
bind *:80
mode http
balance roundrobin
server web1 172.25.250.10:80
server web2 172.25.250.20:80
要把frontend main全部注销
nbproc 2 #启用多进程
cpu-map 1 0 #进程和cpu核心绑定防止cpu抖动从而减少资源消耗
cpu-map 2 1 #表示第二个进程,1表示第二个cpu核心nbthread 2 #启用多线程
haproxy日志分离
定义全局的syslog 服务器;日志服务器需要开启UDP协议
[root@haproxy ~]# vi /etc/rsyslog.conf #日志配置文件
[root@haproxy ~]# systemctl restart rsyslog.service
[root@haproxy ~]# ll /var/log/hawkey.log
-rw-r--r--. 1 root root 1200 Aug 8 11:23 /var/log/hawkey.log
Proxles配置
#针对一个server配置
check #对指定rea]进行健康状态检査,如果不加此设置,默认不开启检査,只有check后面没有其它配置也可以启用检查功能
#默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定端口才能实现健康性检查addr<IP>
#可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num>#指定的健康状态监测端口
inter <num>
#健康状态检查间隔时间,默认2000ms
fall<num>
#后端服务器从线上转为线下的检查的连续失效次数,默认为3
rise <num>
#后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight>
#默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
backup #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似SorryServer
disabled #将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求
redirect prefix http://www.baidu.com/#将请求临时(302)重定向至其它URL,只适用于http模式
maxconn <maxconn>
#当前后端server的最大并发连接数
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.250.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.250.20:80 check inter 2 fall 3 rise 5 weight 1
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.250.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.250.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.250.100:8080 backup当其他俩server的http关掉时,本机的haproxy 下载http的并把配置文件改为8080
[root@haproxy ~]# vi /etc/httpd/conf/httpd.conf
[root@haproxy ~]# echo "soryy" > /var/www/html/index.html
[root@haproxy ~]# systemctl restart httpd
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.250.10:80 check inter 2 fall 3 rise 5 weight 2 disabled
server web2 172.25.250.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.250.100:8080 backup当俩台server主机都开着http服务时
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind *:80
mode http
balance roundrobin
redirect prefix http://www.baidu.com/
# server web1 172.25.250.10:80 check inter 2 fall 3 rise 5 weight 2 disabled
# server web2 172.25.250.20:80 check inter 2 fall 3 rise 5 weight 1
# server web_sorry 172.25.250.100:8080 backup访问haproxy的IP地址172.25.250.100:80 会直接跳转到百度
socat工具
对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPv6、Socket文件等
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats mode 600 level admin process 1
[root@haproxy ~]# echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
1 (initial 1) #查看权重[root@haproxy ~]# echo show servers state | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo disable server webcluster/web1 | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo enable server webcluster/web1 | socat stdio /var/lib/haproxy/stats
开启多进程
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats mode 600 level admin process 1
stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2nbproc 2
cpu-map 1 0
cpu-map 2 1
[root@haproxy ~]# systemctl restart haproxy
[root@haproxy ~]# ll /var/lib/haproxy/
total 4
-rw-r--r-- 1 root root 115 Aug 9 12:28 haproxy.sock
srw------- 1 root root 0 Aug 9 13:00 stats
srw------- 1 root root 0 Aug 9 13:00 stats2[root@haproxy ~]# echo disable server webcluster/web1 | socat stdio /var/lib/haproxy/stats
#禁掉
[root@haproxy ~]# echo disable server webcluster/web2 | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo disable server webcluster/web1 | socat stdio /var/lib/haproxy/stats2
测试
开启了双进程时,访问的时候就是会出去以上画面。因为haproxy多进程热处理,就不用重启服务,直接使用命令禁止,就会出现503
haproxy算法
HAProxy通过固定参数 balance 指明对后端服务器的调度算法
balance参数可以配置在listen或backend选项中。
HAProxy的调度算法分为静态和动态调度算法
有些算法可以根据参数在静态和动态算法中相互转换。
4.1 静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效.
4.1.1 static-rr:基于权重的轮询调度
不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
不支持端服务器慢启动
其后端主机数量没有限制,相当于LVS中的 wrr
Note
慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没问题后在给一部分
4.1.2 first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
.
其会忽略服务器的权重设置
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
4.2 动态算法
动态算法
基于后端服务器状态进行调度适当调整
.
新请求将优先调度至当前负载较低的服务器.权重可以在haproxy运行时动态调整无需重启
4.2.1 roundrobin
1.基于权重的轮询动态调度算法
2.支持权重的运行时调整,不同于Is中的rr轮训模式3.HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数)4.其每个后端backend中最多支持4095个real server,
5.支持对real server权重动态调整
6.roundrobin为默认调度算法,此算法使用广泛
4.2.2 leastconn
leastconn加权的最少连接的动态
支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)
比较适合长连接的场景使用,比如:MySQL等场景:
4.3 其他算法
其它算法即可作为静态算法,又可以通过选项成为动态算法
4.3.1 source
源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同-个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
Note
如果访问客户端时一个家庭,那么所有的家庭的访问流量都会被定向到一台服务器,这时source算法的缺陷
4.3.2 uri
基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后根据最终结果将请求转发到后端指定服务器
适用于后端是缓存服务器场景
默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash
③ Note
注意:此算法基于应用层,所以只支持 mode http,不支持 mode tcp
4.3.3 url param
url_param对用户请求的ur中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个realserver如果无没key,将按roundrobin算法
4.3.4 hdr
针对用户每个http头部(header)请求中的指定信息做hash,此处由 name 指定的http首部将会被取出并做hash计算,
然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。
stats uri/status #自定义stats page uri
stats auth lee:lee #认证,此行可以出现多次
总结
HAProxy是一款高性能的TCP/HTTP负载均衡器和代理服务器,
一、静态算法
静态算法在配置时就已经确定,不会随着负载的变化而改变调度策略。
- Round Robin(轮询)
- 将请求依次分配给每个后端服务器,每个服务器依次接收请求,实现负载均衡。
- 适用于后端服务器性能相近的情况。
- Static-Weight(静态权重)
- 手动设置每个后端服务器的权重值,根据权重值决定每个服务器获得请求的比例。
- 可以根据服务器性能、硬件配置等设置不同的权重,以实现负载均衡。
- Source IP Hash(源IP哈希)
- 根据客户端的IP地址计算哈希值,并将请求分发到对应的服务器。
- 这样,相同IP的请求总是被分发到同一个后端服务器上,适用于需要会话保持的场景。
- URI Hash(URI哈希)
- 根据请求的URI(URL)计算哈希值,并将请求分发到对应的服务器。
- 用于确保特定URI的请求总是发送到同一个后端服务器,适用于缓存服务器或CDN服务商等场景。
- URL Parameter(URL参数)
- 根据请求的URL参数来选择后端服务器。
- 例如,可以根据某个特定的URL参数值来分发请求,适用于需要追踪用户或保持会话连续性的场景。
二、动态算法
动态算法会根据后端服务器的状态和负载情况动态调整调度策略。
- Dynamic-Weight(动态权重)
- 虽然HAProxy的官方文档中未直接提及“Dynamic-Weight”作为单独的算法名称,但动态调整权重是HAProxy支持的一种功能。
- 可以在运行时动态调整服务器的权重,而无需重启HAProxy,以适应后端服务器性能的变化。
- Least Connections(最少连接数)
- 将请求分配给当前连接数最少的服务器。
- 适用于长连接或数据库等场景,可以确保后端服务器的负载更加均衡。
- Least Response(最小响应时间)
- 选择响应时间最短的服务器来处理请求。
- 它会测量后端服务器的响应时间,并将请求分发给响应时间最短的服务器,以确保请求能够尽快获得响应。
三、其他算法
- Random(随机)
- 随机选择一个后端服务器来处理请求。
- 适用于后端服务器性能差异不大,且对负载均衡要求不高的场景。
- hdr(name)
- 针对用户每个HTTP头部请求中的指定信息做哈希,此处由
<name>
指定的HTTP首部将会被去除并做哈希计算,然后由服务器总权重相除以后派发至某挑选出的服务器。- 如果无有效值,则会被轮询调度。
- rdp-cookie
- 对远程桌面的负载,使用cookie做会话保持。
- 适用于基于Windows主机RDP远程桌面协议的场景。
四、总结
HAProxy提供了多种负载均衡算法,包括静态算法和动态算法,以及基于特定请求信息的算法。这些算法可以根据后端服务器的性能、负载情况以及应用需求进行选择和配置,以实现高效的负载均衡和会话保持。在实际应用中,应根据具体场景和需求选择最合适的算法,以优化系统性能和用户体验。
五.高级功能及配置
5.1 基于cookie的会话保持
cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少,已经被session共享服务器代替
日 Note
注意:不支持 tcp mode,使用 http mode
name:
#cookie的key名称,用于实现持久连接
insert:#插入新的cookie,默认不插入cookie
indirect:#如果客户端已经有cookie,则不会再发送cookie信息
nocache:
#当c1ient和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,#因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器5.1.2
Tisten webserver_80
bind 172.25.254.100:80
option forwardfor
mode http
balance roundrobin
cookie WEBCOOKIE insert nocache indirectserver webserver1 192.168.0.101:80 cookie webl weight 1 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80cookie web2 weight 1 check inter 3s fall 3 rise 55.1.3 验证cookie信息
tcp四层穿透
下图用的是nginx的配置文件
optinon 一定要打开
七层穿透
下图修改的是配置文件
上图的mode tcp 修改没mode http
ACL
#acl test hdr_dom(host) -i .org
#acl test base_sub -m sub mis
#acl test path_sub -m sub mis
#acl domain hdr_dom(host) -i www.bwmis.org
#acl ctrl_ip src 172.25.250.1 172.25.250.20 192.168.0.0/24
#acl static path_end -i .html .jpg .png .css .js
# acl php path_end -i .php
acl static path_sub -m sub static
acl php path_sub -m sub php
简单示例
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend webcluster
bind *:80
mode http
acl test hdr(dom) -i www.bwmis.org
use_backend webcluster-host if test
default_backend default-host
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
同时在windos的hosts文件里面写上
172.25.250.100 www.bwmis.org www.bwmis.com bbs.bwmis.org
acl test hdr_dom(host) -i www.bwmis.org #匹配为www.bwmis.org
acl test hdr_dom(host) -i .org #匹配.org结尾
test base_sub -m sub mis #匹配字符串mis
test path_sub -m sub mis #匹配/mis目录为结尾的
[root@server1 ~]# echo webserver1 172.25.250.10 >/var/www/html/mis
基于域名访问
基于IP访问
禁止相关IP地址访问
禁止相关动作访问
基于动静分离的访问
[root@server1 ~]# dnf install php -y
[root@server1 ~]# cat /var/www/html/index.php
<?php
phpinfo();
?>
下图是以.php结尾
基于文件路径访问
[root@server1 ~]# mkdir /var/www/html/static
[root@server1 ~]# echo web > /var/www/html/static/index.html
root@server1 ~]# systemctl restart httpd
[root@server1 ~]# echo web > /var/www/html/static/index.html
理解
条件匹配:
- ACL规则基于一个或多个条件进行匹配。
- 条件可以是请求头、路径、方法、URL参数、源地址、目标地址等。
逻辑操作:
- 可以使用逻辑操作符(如
-m
表示匹配方法,-i
表示不区分大小写的匹配)来定义匹配条件。- 多个条件可以使用逻辑运算符(如
&&
表示逻辑与,||
表示逻辑或)组合起来。动作执行:
- 当ACL规则匹配时,可以执行一系列动作,如允许或拒绝请求、重定向、设置变量等。
- 使用
use_backend
指令可以将匹配的请求转发到特定的后端服务器或服务器组。优先级和顺序:
- ACL规则按照定义的顺序进行匹配。
- 如果有多个规则匹配,通常第一个匹配的规则会生效。
基于自定义的错误页面文件
[root@haproxy ~]# rpm -ql haproxy | grep http
[root@haproxy ~]# mkdir /haproxy/errorpages/ -p
[root@haproxy ~]# cp /usr/share/haproxy/503.http /haproxy/errorpages/503page.http
要把server主机的关掉
MYSQL服饰实现四层负载
在俩台服务器下载mysql 都是同样的操作
[root@server1 ~]# yum install mariadb-server -y
[root@server1 ~]# vi /etc/my.cnf
[mysqld]
server-id=1[root@server1 ~]# systemctl start mariadb
[root@server1 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"[root@server2 ~]# mysql -ulee -plee -h 172.25.250.100 -e "show variables like 'hostname'"
[root@server1 ~]# mysql -ulee -plee -h 172.25.250.100 -e "select @@server_id"
haproxy https 实现
证书制作
[root@haproxy ~]# mkdir /etc/haproxy/certs
[root@haproxy ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/bwmis.org.key -x509 -days 365 -out /etc/haproxy/certs/bwmis.org.crt
[root@haproxy ~]# cat /etc/haproxy/certs/bwmis.org.key /etc/haproxy/certs/bwmis.org.crt > /etc/haproxy/certs/bwmis.pem
[root@haproxy ~]# cat /etc/haproxy/certs/bwmis.pem
子配置文件
[root@haproxy ~]# vim /etc/haproxy/conf.d/webcluster.cfg
[root@haproxy conf.d]# cat webcluster.cfg
listen stats
mode http
bind *:9999
stats enable
stats refresh 3
stats uri /status
stats auth lee:lee