HAProxy进阶之路:负载均衡与高级配置
文章目录
一、什么是Haproxy
在服务器集群中,如果后端服务器有设备宕机或停止工作。调度器VS 还是会根据策略将流量调度到不工作的后端服务器上,为了解决这个问题就出现了后端检测的技术。
当前的企业中已经不适用lvs进行后端检测,haproxy主要的功能是作为负载均衡器,而不是专门用于后端检测。但是它具备一些与后端检测相关的特性和功能,如果后端服务器出现故障或不可用,HAProxy 可以自动将流量切换到其他健康的服务器上。
1.1 负载均衡
- 四层负载均衡
主要根据三层的IP加上四层的端口判断流量递送到哪台后端服务器上,并记录该服务器的地址,后续该连接的所有流量都在该服务器上处理。
- 七层负载均衡
七层的负载均衡是在四层的基础上 实现的,不同的是七层的负载均衡可以根据请求报文中的URL或者IP实现负载均衡,将流量递送到相应的后端服务器上。
1.2 代理
- 正向代理
**原理:**客户端将请求发送给正向代理服务器,然后由正向代理服务器代表客户端向目标服务器发送请求。正向代理服务器隐藏了客户端的真实IP地址和身份,目标服务器只能看到正向代理服务器的IP地址。
**优点:**①隐藏用户信息②访问被墙的网站③可以做缓存,加速访问资源④对客户端访问授权,上网进行认证。
**缺点:**①可能会引入额外的延迟;②如果正向代理服务器出现故障,可能会导致客户端无法访问目标服务器。
- 反向代理
**原理:**代表服务器接收请求并将其转发到后端服务器的代理服务器。客户端发送请求到反向代理服务器,然后反向代理服务器根据一定的规则将请求转发到后端服务器。反向代理服务器隐藏了后端服务器的真实IP地址和身份,客户端只能看到反向代理服务器的IP地址。
**优点:**①隐藏后端服务器的真实IP地址,提高了服务器的安全性;
②可以实现负载均衡,提高系统的性能和可靠性;
③缓存静态内容,减轻后端服务器的负载,提高响应速度;
⑤可以对请求进行过滤和修改,实现内容过滤、重定向和URL重写等功能。
缺点:如果反向代理服务器出现故障,可能会导致整个系统无法正常工作。
1.3 haproxy基本信息
- 配置文件路径:
/etc/haproxy/haproxy.cfg
global 全局配置段
chroot #锁定运行目录 deamon #以守护进程运行 user, group, uid, gid #运行haproxy的用户身份 stats socket #套接字文件 nbproc N #开启的haproxy worker 进程数,默认进程数是一个 nbthread 1 (和nbproc互斥) #指定每个haproxy进程开启的线程数,默认为每个进程一个线程 cpu-map 1 0 #绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU cpu-map 2 1 #绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1号CPU maxconn N #每个haproxy进程的最大并发连接数 maxsslconn N #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下 maxconnrate N #每个进程每秒创建的最大连接数量 spread-checks N #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0 pidfile #指定pid文件路径 log 127.0.0.1 local2 info #定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个
proxies 代理配置
default
:默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
mode http # HAProxy实例使用的连接协议 log global #指定日志地址和记录日志条目的syslog/rsyslog日志设备;此处的 global #表示使用 global配置段中设定的log值。 option httplog #日志记录选项,httplog表示记录与 HTTP会话相关的各种属性值,#包括 #HTTP请求、会话状态、连接数、源地址以及连接时间等 option dontlognull #dontlognull表示不记录空会话连接日志 option http-server-close #等待客户端完整HTTP请求的时间 option forwardfor except 127.0.0.0/8 #透传客户端真实IP至后端web服务器,在webserer中看日志即可看到地址透传 #信息 option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发 option http-keep-alive #开启与客户端的会话保持 retries 3 #连接后端服务器失败次数 timeout http-request 10s #等待客户端请求完全被接收和处理的最长时间 timeout queue 1m #设置删除连接和客户端收到503或服务不可用等提示信息前的等待时间 timeout connect 10s #设置等待服务器连接成功的时间 timeout client 1m #设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间 timeout server 1m #设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间 timeout http-keep-alive 10s #session 会话保持超时时间,此时间段内会转发到相同的后端服务器 timeout check 10s #指定后端服务器健康检查的超时时间 maxconn 3000 #最大能承受的连接并发量 default-server inter 1000 weight 3 #对后端检测的默认参数
frontend
:前端servername
bind #制定haproxy监听的端口 mode 指定负载协议类型
backend
:后端服务器组
balance #用于指定后端服务器的负载均衡算法。 option #配置选项 server #定义后端real server,必须指定IP和端口(详解见下小节)
listen
:相当于frontend + backend
将frontend和backend的内容写在一起就是listen的内容
global里设定的内容在default中也可以设定。在Haproxy程序运行中,程序先读取global中的内容然后再读取default部分的内容,而default会将global中的内容覆盖。
server 配置
check #对指定real进行健康状态检查,如果不加此设置,默认不开启检查 #只有check后面没有其它配置也可以启用检查功能 #默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查 #注意必须指定端口才能实现健康性检查 addr <IP> #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量 port <num> #指定的健康状态监测端口 inter <num> #健康状态检查间隔时间,默认2000 ms 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的最大并发连接数
1.4 基础环境搭建
- 虚拟机环境配置
主机名 | IP | 下载服务 |
---|---|---|
Haproxy | 172.25.254.100 | Haproxy |
Server01.com | 172.25.254.10 | Apache |
Server02.com | 172.25.254.20 | Nginx |
Client | 处于同一个网段即可 | 无 |
- Server服务器配置
################ 软件包下载 ################ ### Server01 [root@Server01 ~]# yum install httpd -y [root@Server01 ~]# systemctl enable httpd --now ####启动服务 ### Server02 [root@Server02 ~]# yum install nginx -y [root@Server02 ~]# systemctl enable nginx --now ####启动服务 ################ 网页内容 ################ ### Server01 [root@Server01 ~]# echo "Server01.com-172.25.254.10" > /var/www/html/index.html [root@Server01 ~]# curl 172.25.254.10 Server01.com-172.25.254.10 ### Server02 [root@Server02 ~]# echo "Server02.com-172.25.254.20" > /usr/share/nginx/html/index.html [root@Server02 ~]# curl 172.25.254.20 Server02.com-172.25.254.20
- haproxy主机配置
#下载haproxy软件包 [root@Haproxy ~]# yum install haproxy -y #编辑配置文件 [root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg ##### 写法一 将前后端分开 ##### frontend webcluster bind *:80 mode http use_backend webcluster-host backend webcluster-host balance roundrobin server web1 172.25.254.10:80 server web2 172.25.254.20:80 ##### 写法二 合并在一起写 ##### listen webcluster bind *:80 mode http balance roundrobin server web1 172.25.254.10:80 server web2 172.25.254.20:80 ##### 两种写法的效果如下 ##### [root@Client ~]# for i in {1..10};do curl 172.25.254.100 ;done Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10
1.5 基础配置搭建
Server配置实验
- haproxy配置如下
listen webcluster bind *:80 mode http balance roundrobin server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 #重启haproxy systemctl restart haproxy
- 测试
[root@Client ~]# for i in {1..10};do curl 172.25.254.100 ;done Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10 Server01.com-172.25.254.10
Backup(SorryServer)配置实验 —— 用于服务异常时
#下载httpd软件包 [root@Haproxy ~]# dnf install httpd -y #修改http的端口 ...... #Listen 12.34.56.78:80 Listen 8080 ...... #启动httpd服务 [root@Haproxy ~]# systemctl enable httpd --now [root@Haproxy ~]# echo "Sorry" > /var/www/html/index.html #修改配置文件 listen webcluster bind *:80 mode http balance roundrobin server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 server web3 172.25.254.100:8080 backup #重启haproxy systemctl restart haproxy #此时测试的效果如下,backup的配置并不会生效因为10和20的主机仍在工作 [root@Client ~]# for i in {1..10};do curl 172.25.254.100 ;done Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server02.com-172.25.254.20 #关闭任意一台后端服务器后再测试,流量会打在另一台工作的主机上,backup任然不生效 [root@Client ~]# for i in {1..10};do curl 172.25.254.100 ;done Server02.com-172.25.254.20 Server02.com-172.25.254.20 Server02.com-172.25.254.20 Server02.com-172.25.254.20 Server02.com-172.25.254.20 Server02.com-172.25.254.20 #关闭所有后端服务器后测试 [root@Client ~]# curl 172.25.254.100 Sorry
Disabled配置实验 —— 用于下线指定的后端服务器
#编辑haproxy配置文件 listen webcluster bind *:80 mode http balance roundrobin server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 disabled server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 server web3 172.25.254.100:8080 backup #重启haproxy systemctl restart haproxy #重启网络服务 [root@Server01 ~]# systemctl enable httpd --now [root@Server02 ~]# systemctl enable nginx.service --now #测试 [root@Client ~]# for i in {1..10};do curl 172.25.254.100 ;done Server02.com-172.25.254.20 Server02.com-172.25.254.20 Server02.com-172.25.254.20 Server02.com-172.25.254.20 Server02.com-172.25.254.20
二、Socat工具
对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。
- 修改socat的权限
#编辑haproxy配置文件,在stats socket /var/lib/haproxy/stats 后加上权限 stats socket /var/lib/haproxy/stats mode 600 level admin #重启haproxy systemctl restart haproxy #下载socat软件包 [root@Haproxy ~]# dnf install socat -y #用命令查看权重 [root@Haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats 2 (initial 2) #用命令查看修改 [root@Haproxy ~]# echo set weight webcluster/web1 1 | socat stdio /var/lib/haproxy/stats [root@Haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats 1 (initial 2) #测试结果如下,此时的配置文件中10主机的权限还是2,但是执行的是socat的配置 [root@Client ~]# for i in {1..10};do curl 172.25.254.100 ;done Server02.com-172.25.254.20 Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10 Server02.com-172.25.254.20
三、Haproxy的算法
3.1 静态算法
按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。
- static-rr:基于权重的轮询调度
- 不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
- 不支持端服务器慢启动
- 其后端主机数量没有限制,相当于LVS中的 wrr
#haproxy配置文件 listen webcluster bind *:80 mode http #balance roundrobin balance static-rr server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 server web3 172.25.254.100:8080 backup #重启haproxy systemctl restart haproxy #测试效果 [root@Client ~]# for i in {1..10};do curl 172.25.254.100 ;done Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server02.com-172.25.254.20
- first
- 根据服务器在列表中的位置,自上而下进行调度
- 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
- 其会忽略服务器的权重设置
- 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
#haproxy配置文件 listen webcluster bind *:80 mode http #balance roundrobin #balance static-rr balance first server web1 172.25.254.10:80 maxconn 1 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 #重启haproxy systemctl restart haproxy #效果如下 [root@Client ~]# while true;do curl 172.25.254.100;sleep 0.1;done Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server01.com-172.25.254.10 ...... Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10 ......
3.2 动态算法
基于后端服务器状态进行调度适当调整,新请求将优先调度至当前负载较低的服务器,权重可以在haproxy运行时动态调整无需重启。
- Roundrobin
- 基于权重的轮询动态调度算法,
- 支持权重的运行时调整,不同于lvs中的rr轮训模式,
- HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
- 其每个后端backend中最多支持4095个real server,
- 支持对real server权重动态调整,
- roundrobin为默认调度算法,此算法使用广泛
该算法在以上配置中有体现,故不在此赘述
- leastconn
- leastconn加权的最少连接的动态
- 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)
- 比较适合长连接的场景使用,比如:MySQL等场景。
#haproxy配置 listen webcluster bind *:80 mode http balance leastconn server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 #重启haproxy systemctl restart haproxy [root@Client ~]# for i in {1..5};do curl 172.25.254.100;done; Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10 Server02.com-172.25.254.20 Server01.com-172.25.254.10
3.3 其他算法
其它算法即可作为静态算法,又可以通过选项成为动态算法
- source:默认是静态算法,通过哈希hash-type可以定义成动态算法。
工作原理:
假设存在这样一个网络环境。在source算法的环境下,处理流量的主机(图中已忽略)会将请求的源地址哈希运算,假设客户机01、02、03的源地址分别哈希运算后的值为1111、222、3333,而后端服务器的权重都为1,那么此时流量的走向应取决于源地址哈希运算后的值与总权重(1+1+1=3)的值取余,即1112%3、2222%3、3333%。假设客户机01、02、03取余的值为b、c、a,则此时客户机的流量会发送到与取余的值相对应的后端服务器上,后续同一个源地址请求将被转发至同一个后端web服务器。
此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器因此会话丢失。
静态效果演示
#haproxy配置 listen webcluster bind *:80 mode http balance source server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 #重启haproxy systemctl restart haproxy #演示效果如下 [root@Client ~]# for i in {1..5};do curl 172.25.254.100;done; Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server01.com-172.25.254.10
- 一致性哈希
为了解决上述环境中由于后端服务器变动导致的权重变化,使用hash-type和一致性哈希可以改变。
将IP除以(232)的值落在哈希环上,同样也将客户端的某些值(例如IP)除以(232)落在哈希环上。这些值落在哈希环的各个地方,客户端会在哈希环上顺时针寻找比自己大的第一个服务器访问,这就是一致性哈希的运算原理。在次过程中如果其中一个服务器宕机或者不在工作,它影响的也只是与之访问的客户端,不会影响到整体的通信环境。
#haproxy配置 listen webcluster bind *:80 mode http balance source hash-type consistent server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 #重启haproxy systemctl restart haproxy #测试效果如下 [root@Client ~]# for i in {1..5};do curl 172.25.254.100;done; Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server01.com-172.25.254.10 Server01.com-172.25.254.10
- uri
**URI(Uniform Resource Identifier,统一资源标识符):**是一个更通用的概念,用于标识资源,它不一定需要提供资源的获取方式和位置信息。URI 包括 URL 和URN(统一资源名称)。URN 仅标识资源的名称,不包含如何获取资源的信息。
URL(Uniform Resource Locator,统一资源定位符):是一种具体的资源标识符,用于精确地定位互联网上的资源,包括资源所在的服务器地址、资源的路径、使用的协议以及可能的查询参数等。
#haproxy配置 listen webcluster bind *:80 mode http balance uri hash-type consistent server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 #重启haproxy systemctl restart haproxy ################ 网页内容 ################ ### Server01 [root@Server01 ~]# echo "Server01.com - page01" > /var/www/html/index1.html [root@Server01 ~]# echo "Server01.com - page02" > /var/www/html/index2.html [root@Server01 ~]# echo "Server01.com - page03" > /var/www/html/index3.html ### Server02 [root@Server02 ~]# echo "Server02.com - page01" > /usr/share/nginx/html/index1.html [root@Server02 ~]# echo "Server02.com - page02" > /usr/share/nginx/html/index2.html [root@Server02 ~]# echo "Server02.com - page03" > /usr/share/nginx/html/index3.html #测试效果如下 [root@Client ~]# curl 172.25.254.100/index.html Server01.com-172.25.254.10 [root@Client ~]# curl 172.25.254.100/index1.html Server01.com - page01 [root@Client ~]# curl 172.25.254.100/index2.html Server02.com - page02 [root@Client ~]# curl 172.25.254.100/index3.html Server01.com - page03
- url_param一致性hash配置
url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server如果无没key,将按roundrobin算法。
#haproxy配置 listen webcluster bind *:80 mode http balance url_param name,userid hash-type consistent server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 #重启haproxy systemctl restart haproxy #测试效果如下 [root@Client ~]# curl 172.25.254.100/index3.html?name=adm Server01.com - page03 [root@Client ~]# curl 172.25.254.100/index3.html?name=adm Server01.com - page03 [root@Client ~]# curl 172.25.254.100/index3.html?name=haha Server02.com - page03 [root@Client ~]# curl 172.25.254.100/index3.html?name=haha Server02.com - page03
四、 Haproxy状态页
#启用状态页,编辑haproxy配置文件 listen stats: mode http bind *:6666 stats enable stats uri /status stats auth user:123 #重启haproxy systemctl restart haproxy #在网页打开
五、高级功能和配置
5.1 基于cookie的会话保持
作用:不同地址访问haproxy主机时,该主机会根据内部的配置在每台访问地址上单独执行。
在haproxy的配置文件中添加以下配置 listen webcluster bind *:80 mode http balance roundrobin cookie WEBCOOKIE insert nocache indirect server web1 172.25.254.10:80 cookie lee1 inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 cookie lee2 inter 2 fall 3 rise 5 weight 1 #测试内容如下 [root@Client ~]# curl -b COOKIE web01 172.25.254.100 curl: (6) Could not resolve host: web01 Server01.com-172.25.254.10 [root@Client ~]# curl -b COOKIE web02 172.25.254.100 curl: (6) Could not resolve host: web02 Server02.com-172.25.254.20
5.2 IP透传
概念:是在网络通信中,允许一个网络设备将接收到的特定 IP 数据包不做修改地直接传递给另一个网络设备。
四层环境搭建
- 修改
haproxy
配置文件
vim /etc/haproxy/haproxy.cfg ...... # turn on stats unix socket stats socket /var/lib/haproxy/stats1 mode 600 level admin ...... ...... #nbproc 2 # cpu-map 1 0 # cpu-map 2 1 ...... ...... listen webcluster bind *:80 mode tcp balance roundrobin server web1 172.25.254.10:80 send-proxy check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1
- Nginx配置
#打开Nginx的配置文件 vim /etc/nginx/nginx.conf #修改配置内容如下 ...... http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' ' "$proxy_protocol_addr"' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ...... ...... server { listen 80 proxy_protocol; listen [::]:80; server_name _; root /usr/share/nginx/html; ...... #保存退出
使用 tail -n3 /var/log/nginx/access.log
命令查看日志中IP是否透传成功,显示内容如下:
- Apache配置
Apache 服务并不直接支持 IP 四层透传功能,在此不做功能演示。
七层环境搭建
haproxy
配置
#配置文件内容与四层基本一致,仅做以下修改 ...... listen webcluster bind *:80 mode http balance roundrobin server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1 ......
- nginx配置
同四层一样,故不做赘述
- apache配置
#修改http的配置文件 [root@Server01 ~]# vim /etc/httpd/conf/httpd.conf LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common
- 测试
[root@Server01 conf]# tail -n 3 /etc/httpd/logs/access_log 172.25.254.128 172.25.254.100 - - [12/Aug/2024:00:15:06 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.76.1" 172.25.254.128 172.25.254.100 - - [12/Aug/2024:00:15:07 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.76.1" 172.25.254.128 172.25.254.100 - - [12/Aug/2024:00:15:08 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.76.1" [root@Server02 ~]# tail -n3 /var/log/nginx/access.log 172.25.254.100 - - [12/Aug/2024:00:15:07 +0800] "GET / HTTP/1.1" 200 27 "-" "172.25.254.128""curl/7.76.1" "172.25.254.128" 172.25.254.100 - - [12/Aug/2024:00:15:08 +0800] "GET / HTTP/1.1" 200 27 "-" "172.25.254.128""curl/7.76.1" "172.25.254.128" 172.25.254.100 - - [12/Aug/2024:00:15:08 +0800] "GET / HTTP/1.1" 200 27 "-" "172.25.254.128""curl/7.76.1" "172.25.254.128"
5.3 ACL
原理:访问控制列表ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作。
基础实验
- ACL匹配模式
指令 | 含义 |
---|---|
-i | 不区分大小写 |
-m | 使用指定的正则表达式匹配方法 |
-n | 不做DNS解析 |
实验一:
#haproxy配置文件 frontend webcluster bind *:80 mode http acl test hdr_dom(host) -i www.haproxy01.com use_backend webcluster-host if test default_backend default-host backend webcluster-host mode http server web1 172.25.254.10:80 check inter 2 fall 2 rise 5 backend default-host mode http server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 #重启haproxy systemctl restart haproxy
实验二:
#haproxy配置文件 frontend webcluster bind *:80 mode http acl test base_sub -m sub 01 use_backend webcluster-host if test default_backend default-host #测试
动静分离
#Apache服务器下载php后重启 [root@Server01 ~]# yum install php -y [root@Server01 ~]# systemctl restart httpd.service #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件 #测试
mariadb的四层负载
#后端服务器,haproxy主机安装mariadb yum install mariadb-server -y #编辑配置文件 vim /etc/my.cnf.d/mariadb-server.cnf [mysqld] server-id=2 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mariadb/mariadb.log pid-file=/run/mariadb/mariadb.pid
#数据库中添加内容 MariaDB [(none)]> CREATE USER haha@'%' identified by 'haha'; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> GRANT ALL ON *.* TO haha@'%'; Query OK, 0 rows affected (0.001 sec)
远程登录验证
修改haproxy配置文件
listen dbserver bind *:3306 mode tcp balance roundrobin server db1 172.25.254.10:3306 check inter 3 fall 2 rise 5 server db2 172.25.254.20:3306 check inter 3 fall 2 rise 5
测试