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


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

测试

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

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值