HAProxy进阶之路:负载均衡与高级配置

avatar
作者
猴君
阅读量:0

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下载服务
Haproxy172.25.254.100Haproxy
Server01.com172.25.254.10Apache
Server02.com172.25.254.20Nginx
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
  1. 基于权重的轮询动态调度算法,
  2. 支持权重的运行时调整,不同于lvs中的rr轮训模式,
  3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
  4. 其每个后端backend中最多支持4095个real server,
  5. 支持对real server权重动态调整,
  6. roundrobin为默认调度算法,此算法使用广泛

该算法在以上配置中有体现,故不在此赘述

  • leastconn
  1. leastconn加权的最少连接的动态
  2. 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)
  3. 比较适合长连接的场景使用,比如: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 

测试

在这里插入图片描述
在这里插入图片描述

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!