haproxy原理及实验演示(实现服务器集群的负载均衡)

目录

haproxy介绍

haproxy工作原理

负载均衡

架构图

haproxy的配置实验

1,给haproxy主机配置环境(IP)

2,给RS1配置环境(IP)

通过route -n来查看网关和IP的配置是否正确

把可以直观看出实验的结果输入到默认访问的路径下

重启nginx服务

3,在haproxy主机上安装haproxy

haproxy的配置文件的信息

proxies:代理配置段

在/etc/haproxy/haproxy.cfg添加相关参数

最后重启服务

用curl测试

haproxy的算法

基于socat管理haproxy

实验配置

1,使用dnf或者yum在haproxy主机上安装socat

可以使用socat -h获取帮助

​编辑

2,修改haproxy的配置文件,并重启

查看当前haproxy主机的状态

查看RS的权重,此时的权重为2 

另一台的权重为1

修改权重,并查看

指定下线后端的服务器

指定上线后端的服务器

haproxy基于cookie的会话保持

在/etc/haproxy/haproxy.cfg修改参数,并重启

用curl -i 测试,也可以用浏览器

haproxy的状态页

配置

在haproxy的配置文件里添加,并重启

在浏览器测试

IP透传

在haproxy主机的配置,要启用option forwardfor,(默认就开的)

测试结果,在后端的服务器上查看

从结果可以看出,有一台地址为172.25.254.200的客户机来访问后端服务器、

haproxy的四层IP透传

在haproxy主机的/etc/haproxy/haproxy.cfg配置参数,并重启

在RS的/var/nginx/nginx.cof里修改配置文件

重启nginx服务

测试

ACL配置

匹配模式

书写格式

域名匹配

在haproxy的配置

因为有域名,所以要先在windows的文件里配置解析

路径为:C:\Windows\System32\drivers\etc,保存退出

浏览器类型的匹配

基于文件后缀名的动静分离的匹配

错误页面自定义

在haproxy上的配置

创建文件

复制503的页面

修改页面内容

在haproxy修改配置文件,并重启

在RS上下线nginx服务

之后再浏览器测试

错误页面重定向

下线后端的nginx服务

再haproxy的配置文件里修改,并重启

​编辑

再浏览器测试

​编辑此时你在输入172.25.254.100地址,则503页面就会自动跳转到百度

四层负载

对MySQL实现四层负载

在RS上使用yum或者dnf安装MySQL,两台都要安装

在/etc/my.cnf.d/mariadb-server.cnfl里添加id标识,从而可以直观看到实验结果

重启

账户密码,两台都要设置

在haproxy的配置文件里添加参数,并重启

安装MySQL,使其能使用MySQL的命令

测试

https加密访问

在haproxy创建目录,并制作证书

在haproxy的配置文件里,并重启

测试


haproxy介绍

HAProxy是一个使用C语言编写的自由及开放源代码软件,由法国人Willy Tarreau开发。它是一款高性能的TCP和HTTP负载均衡器,特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理(这是他和lvs功能上的不同,lvs不能处理七层)。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接,并且其运行模式可以很简单安全地整合进用户当前的架构中,同时保护用户的web服务器不被暴露到网络上

HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。

HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。

haproxy工作原理


‌HAProxy是一个使用‌C语言编写的自由及开放源代码软件,提供高可用性、负载均衡,以及基于‌TCP和‌HTTP的应用程序代理。 它特别适用于负载特大的web站点,这些站点通常需要会话保持或七层处理。‌

HAProxy的工作原理主要包括以下几个方面:

负载均衡:HAProxy支持L4(TCP)和L7(HTTP)两种负载均衡能力,支持多种负载均衡算法,如RR(轮询)、静态RR、LC、IP Hash、URI Hash等。‌
会话保持:通过Insert Cookie、Rewrite Cookie、Prefix Cookie等方式实现会话保持,适用于未实现会话共享的应用集群。
健康检查:支持TCP和HTTP两种健康检查模式,确保后端服务器的健康状态。
连接管理:HAProxy在客户端和服务器端完成一次连接请求后,会主动关闭此TCP连接,使HTTP传输处于HTTP close模式下。‌
在实际应用中,HAProxy被广泛应用于各种场景,如‌GitHub、‌Bitbucket、‌Stack Overflow、‌Reddit、‌Tumblr、‌Twitter等知名网站

负载均衡

服务器负载均衡:在数据中心等组网环境中,可以采用服务器负载均衡,将网络服务分担给多台服务器进行处理,提高数据中心的业务处理能力;

链路负载均衡:在有多个运营商出接口的组网环境中,可以采用出方向多链路动态负载均衡,实现链路的动态选择,提高服务的可靠性;

防火墙负载均衡:在防火墙处理能力成为瓶颈的组网环境中,可以采用防火墙负载均衡,将网络流量分担给多台防火墙设备,提高防火墙的处理能力;

架构图

haproxy的配置实验

1,给haproxy主机配置环境(IP)

[root@haproxy ~]# vim /etc/NetworkManager/system-connections/eth0.connection  


[connection]

id=eth0

type=ethernet

interface-name=eth0



[ipv4]

method=manual

address1=172.25.254.100/24,172.25.254.2

dns=114.114.114.114;

启用端口

[root@haproxy ~]# nmcli connection reload 
[root@haproxy ~]# nmcli connection up eth0

2,给RS1配置环境(IP)

[root@RS1 ~]# vim /etc/NetworkManager/system-connections/eth0.connection


[connection]

id=eth0

type=ethernet

interface-name=eth0



[ipv4]

method=manual

address1=172.25.254.10/24,172.25.254.100

dns=114.114.114.114;

 启用端口

[root@RS1 ~]# nmcli connection reload 
[root@RS1 ~]# nmcli connection up eth0

通过route -n来查看网关和IP的配置是否正确

[root@bb ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.100  0.0.0.0         UG    102    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     102    0        0 eth0

使用yum或者dnf安装nginx或者httpd

[root@bb ~]# dnf install nginx -y
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

上次元数据过期检查:0:26:01 前,执行于 2024年08月10日 星期六 23时24分37秒。
依赖关系解决。
============================================================
 软件包             架构   版本             仓库       大小
============================================================
安装:
 nginx              x86_64 1:1.20.1-13.el9  AppStream  43 k
安装依赖关系:
 nginx-core         x86_64 1:1.20.1-13.el9  AppStream 575 k
 nginx-filesystem   noarch 1:1.20.1-13.el9  AppStream  13 k
 redhat-logos-httpd noarch 90.4-1.el9       AppStream  18 k

事务概要
============================================================
安装  4 软件包

总计:650 k
安装大小:1.8 M
下载软件包:
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                                             1/1 
  运行脚本: nginx-filesystem-1:1.20.1-13.el9.noarch     1/4 
  安装    : nginx-filesystem-1:1.20.1-13.el9.noarch     1/4 
  安装    : nginx-core-1:1.20.1-13.el9.x86_64           2/4 
  安装    : redhat-logos-httpd-90.4-1.el9.noarch        3/4 
  安装    : nginx-1:1.20.1-13.el9.x86_64                4/4 
  运行脚本: nginx-1:1.20.1-13.el9.x86_64                4/4 
  验证    : nginx-1:1.20.1-13.el9.x86_64                1/4 
  验证    : nginx-core-1:1.20.1-13.el9.x86_64           2/4 
  验证    : nginx-filesystem-1:1.20.1-13.el9.noarch     3/4 
  验证    : redhat-logos-httpd-90.4-1.el9.noarch        4/4 
已更新安装的产品。

已安装:
  nginx-1:1.20.1-13.el9.x86_64                              
  nginx-core-1:1.20.1-13.el9.x86_64                         
  nginx-filesystem-1:1.20.1-13.el9.noarch                   
  redhat-logos-httpd-90.4-1.el9.noarch                      

完毕!

把可以直观看出实验的结果输入到默认访问的路径下

root@bb ~]# echo web1-10 > /usr/share/nginx/html/index.html

如果使httpd的,他的默认路径为/var/www/html

重启nginx服务

[root@bb ~]# systemctl restart nginx.service

RS2和RS1的环境配置一样,但IP不同

3,在haproxy主机上安装haproxy

[root@haproxy ~]# dnf install haproxy -y
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

AppStream                    135 MB/s | 6.1 MB     00:00    
BaseOS                       140 MB/s | 1.7 MB     00:00    
依赖关系解决。
=============================================================
 软件包      架构       版本             仓库           大小
=============================================================
安装:
 haproxy     x86_64     2.4.17-3.el9     AppStream     2.2 M

事务概要
=============================================================
安装  1 软件包

总计:2.2 M
安装大小:6.5 M
下载软件包:
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                                              1/1 
  运行脚本: haproxy-2.4.17-3.el9.x86_64                  1/1 
  安装    : haproxy-2.4.17-3.el9.x86_64                  1/1 
  运行脚本: haproxy-2.4.17-3.el9.x86_64                  1/1 
  验证    : haproxy-2.4.17-3.el9.x86_64                  1/1 
已更新安装的产品。

已安装:
  haproxy-2.4.17-3.el9.x86_64                                

完毕!

查看安装包版本的命令

[root@haproxy ~]# haproxy -v
HAProxy version 2.4.17-9f97155 2022/05/13 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.17.html
Running on: Linux 5.14.0-162.6.1.el9_1.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Sep 30 07:36:03 EDT 2022 x86_64

haproxy的配置文件的信息

global:全局配置段

进程及安全配置相关的参数

性能调整相关的参数

Debug参数

global
    # 定义了日志记录的地址和级别
    log 127.0.0.1 local0 info
    # 将进程的根目录更改为指定目录,提高安全性
    chroot /containers/loadbalancer/xxxx/
    # 定义了统计信息的Unix套接字位置。
    # 通过这个套接字,你可以访问 HAProxy 的统计数据,包括连接数、会话数、错误率等,还可以进行一些管理操作,如启用或禁用服务器、调整参数等
    stats socket /containers/loadbalancer/xxxx/stats.sock
    # 指定运行 HAProxy 的用户和用户组。
    user haproxy
    group haproxy
    # 设置最大连接数为 100,000
    maxconn 100000
    # 调整最大接受连接数
    tune.maxaccept 100000
    # 设置默认的 DH 参数长度
    tune.ssl.default-dh-param 2048
    # 使 HAProxy 在后台运行
    daemon
    # 指定默认的 SSL 加密套件
    ssl-default-bind-ciphers 

proxies:代理配置段

defaults:为frontend,backend,listen提供默认配置

frontend:前端,相当于nginx中的server{}

backend:后端,相当于nginx中的upstream {}

listen:同时拥有前端和后端配置,配置简单,推荐使用

defaults
    # 不记录健康检查日志
    option dontlognull
    # 失败后重试 3 次。
    retries 3
    # 允许重新调度到其他服务器。
    option redispatch
    # 设置默认最大连接数为 100,000。
    maxconn 100000
    # 设置客户端连接超时时间为 50 秒。
    timeout client 50s
    # 设置服务器连接超时时间为 50 秒。
    timeout server 50s
    # 设置连接超时时间为 5 秒。
    timeout connect 5s
    # 设置隧道连接超时时间为 1 小时。
    timeout tunnel 1h

在/etc/haproxy/haproxy.cfg添加相关参数

[root@bb ~]# vim /etc/haproxy/haproxy.cfg 



listen web
        bind *:80
        mode http
        balance roundrobin
        server web1 172.25.254.10:80
        server web2 172.25.254.20:80

这里添加参数,也可以使用frontend和backend,两个要一起用

‘如

frontend web
        bind *:80
        mode http
        use_backend web11
backend web11
        mode http
        server web1 172.25.254.10:80
        server web2 172.25.254.20:80

最后重启服务

[root@bb ~]# systemctl restart haproxy.service 

用curl测试

测试结果为成功

haproxy的算法

roundrobin(动态):‌这是一种基于权重的轮询调度算法,‌旨在保持服务器的处理时间均匀分布,‌从而实现最平衡和最公平的负载分配。‌该算法允许权重的运行时调整,‌意味着可以根据服务器的负载情况动态地调整权重,‌以确保负载的均衡分配。‌这是HAProxy的默认调度算法,‌适用于大多数需要高可用性和负载均衡的场景。‌


 

 static-rr(静态):‌这是一种静态的基于权重的轮询算法,‌与roundrobin类似,‌但它在运行时调整服务器权重不会生效。‌这意味着一旦配置完成,‌权重的调整需要手动重启HAProxy服务才能生效。‌这种算法适用于那些不需要频繁调整权重且对负载均衡要求不是特别高的场景。‌不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值,只能改为上线或者下线


 

 leastconn(动态):‌这是一种加权的最少连接的动态调度算法,‌它将新的连接请求派发到具有最少连接数的后端服务器。‌这种算法特别适合于长连接场景,‌如MySQL等,‌因为它能够有效地平衡不同服务器之间的连接数,‌避免某些服务器过载而其他服务器空闲的情况。‌

first(静态):根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置,此方式使用较少。不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无

source(默认静态):源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type支持的选项更改

这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景

源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash

map-based取模法:对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请求转发至对应的后端服务器。此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度。缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变,hash-type 指定的默认值为此算法。

一致性hash(动态):当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n ,该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动。

uri:基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后,根据最终结果
将请求转发到后端指定服务器,适用于后端是缓存服务器场景,默认是静态算法,也可以通过hash-type
指定map-based和consistent,来定义使用取模法还是一致性hash。

url_param:url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器
总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同
一个real server,如果无没key,将按roundrobin算法

hdr:针对用户每个http头部(header)请求中的指定信息做hash,此处由 name 指定的http首部将会被取出并
做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度

基于socat管理haproxy

socat可以与HAProxy进行通信,‌实现如查看状态、‌设置参数等操作。‌

此外,‌socat还支持对HAProxy的sock参数进行动态在线修改,‌并实现多种方式下线HAProxy后端服务器。‌这一功能对于需要灵活管理HAProxy的环境非常有用,‌可以实现快速响应和优化服务性能。‌

aproxy的socat参数主要用于通过Unix套接字命令(‌Unix Socket commands)‌进行haproxy的管理和监控。‌socat是一个多功能的网络工具,‌被称为Socket CAT,‌是netcat的增强版,‌能够处理文件、‌管道、‌设备、‌Unix套接字等多种数据通道。‌它支持TCP和UDP网络通信,‌并且能够处理SSL和SOCKS4代理等高级功能。‌通过socat,‌可以实现对haproxy的配置文件进行管理,‌包括获取状态信息、‌设置和维护后端服务器等操作。‌

使用socat管理haproxy时,‌可以通过发送特定的命令到haproxy的Unix套接字上来执行各种操作。‌例如,‌可以通过发送"show info"命令来获取haproxy的常用信息,‌或者发送"disable server"和"enable server"命令来将某个后端主机设置为维护状态或取消维护状态。‌这些操作对于监控和管理工作中的haproxy服务器非常有用。‌

此外,‌socat的使用还包括获取帮助信息、‌设置和取消后端服务器的维护状态等

实验配置

1,使用dnf或者yum在haproxy主机上安装socat

[root@bb ~]# dnf install socat -y


正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

上次元数据过期检查:0:59:22 前,执行于 2024年08月11日 星期日 00时05分39秒。
依赖关系解决。
============================================================
 软件包    架构       版本              仓库           大小
============================================================
安装:
 socat     x86_64     1.7.4.1-5.el9     AppStream     309 k

事务概要
============================================================
安装  1 软件包

总计:309 k
安装大小:1.1 M
下载软件包:
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                                             1/1 
  安装    : socat-1.7.4.1-5.el9.x86_64                  1/1 
  运行脚本: socat-1.7.4.1-5.el9.x86_64                  1/1 
  验证    : socat-1.7.4.1-5.el9.x86_64                  1/1 
已更新安装的产品。

已安装:
  socat-1.7.4.1-5.el9.x86_64                                

完毕!

可以使用socat -h获取帮助

2,修改haproxy的配置文件,并重启

 [root@bb ~]# vim /etc/haproxy/haproxy.cfg 


   # turn on stats unix socket
    stats socket /var/lib/haproxy/stats mode 600 level admin





[root@bb ~]# systemctl restart haproxy.service 

查看当前haproxy主机的状态

[root@bb ~]# echo "show info" | socat stdio /var/lib/haproxy/stats 


Name: HAProxy
Version: 2.4.17-9f97155
Release_date: 2022/05/13
Nbthread: 2
Nbproc: 1
Process_num: 1
Pid: 34086
Uptime: 0d 0h10m26s
Uptime_sec: 626
Memmax_MB: 0
PoolAlloc_MB: 0
PoolUsed_MB: 0
PoolFailed: 0
Ulimit-n: 8035
Maxsock: 8035
Maxconn: 4000
Hard_maxconn: 4000
CurrConns: 0
CumConns: 1566
CumReq: 1
MaxSslConns: 0
CurrSslConns: 0
CumSslConns: 0
Maxpipes: 0
PipesUsed: 0
PipesFree: 0
ConnRate: 0
ConnRateLimit: 0
MaxConnRate: 0
SessRate: 0
SessRateLimit: 0
MaxSessRate: 0
SslRate: 0
SslRateLimit: 0
MaxSslRate: 0
SslFrontendKeyRate: 0
SslFrontendMaxKeyRate: 0
SslFrontendSessionReuse_pct: 0
SslBackendKeyRate: 0
SslBackendMaxKeyRate: 0
SslCacheLookups: 0
SslCacheMisses: 0
CompressBpsIn: 0
CompressBpsOut: 0
CompressBpsRateLim: 0
Tasks: 18
Run_queue: 0
Idle_pct: 100
node: haproxy
Stopping: 0
Jobs: 5
Unstoppable Jobs: 1
Listeners: 4
ActivePeers: 0
ConnectedPeers: 0
DroppedLogs: 0
BusyPolling: 0
FailedResolutions: 0
TotalBytesOut: 0
TotalSplicdedBytesOut: 0
BytesOutRate: 0
DebugCommandsIssued: 0
CumRecvLogs: 0
Build info: 2.4.17-9f97155
Memmax_bytes: 0
PoolAlloc_bytes: 72160
PoolUsed_bytes: 72160
Start_time_sec: 1723309836
Tainted: 0

查看RS的权重,此时的权重为2 

[root@bb ~]# echo "get weight web/web1" | socat stdio /var/lib/haproxy/stats 
2 (initial 2)

另一台的权重为1

[root@bb ~]# echo "get weight web/web2" | socat stdio /var/lib/haproxy/stats 
1 (initial 1)

修改权重,并查看

[root@bb ~]# echo "set weight web/web1 1" | socat stdio /var/lib/haproxy/stats 

[root@bb ~]# echo "get weight web/web1" | socat stdio /var/lib/haproxy/stats 
1 (initial 2)

此时他权重变为1了

指定下线后端的服务器

[root@bb ~]# echo "disable server web/web1" | socat stdio /var/lib/haproxy/stats 

指定上线后端的服务器

[root@bb ~]# echo "enable server web/web1" | socat stdio /var/lib/haproxy/stats 

haproxy基于cookie的会话保持

在/etc/haproxy/haproxy.cfg修改参数,并重启


[root@bb ~]# vim /etc/haproxy/haproxy.cfg 


listen web
        bind *:80
        mode http
        balance roundrobin
        cookie mm insert nocache indirect
        server web1 172.25.254.10:80 cookie web11 weight 2
        server web2 172.25.254.20:80 cookie web22 weight 1




[root@bb ~]# systemctl restart haproxy.service 

用curl -i 测试,也可以用浏览器

haproxy的状态页

通过web界面来显示当前haproxy的状态

配置

在haproxy的配置文件里添加,并重启

[root@bb ~]# vim /etc/haproxy/haproxy.cfg 



listen stats:
        mode http
        bind *:999
        stats enable
        log global
        stats uri /status
        stats auth mm:mm




[root@bb ~]# systemctl restart haproxy.service 

在浏览器测试

IP透传


在haproxy主机的配置,要启用option forwardfor,(默认就开的)

测试结果,在后端的服务器上查看

从结果可以看出,有一台地址为172.25.254.200的客户机来访问后端服务器、

haproxy的四层IP透传

在haproxy主机的/etc/haproxy/haproxy.cfg配置参数,并重启

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 



listen web
        bind *:80
        mode tcp
        balance roundrobin
        server web1 172.25.254.10:80 send-proxy  weight 2
        server web2 172.25.254.20:80 send-proxy weight 1




[root@haproxy ~]# systemctl restart haproxy.service

在RS的/var/nginx/nginx.cof里修改配置文件

重启nginx服务

[root@RS1 ~]# systemctl restart nginx.service 

测试

从结果看出是有IP为172.25.254.200的主机进行了访问

ACL配置

访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,

基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。

匹配模式

ACL-flags    ACL匹配模式
	-i 不区分大小写
	-m 使用指定的pattern匹配方法
	-n 不做DNS解析
	-u 禁止acl重名,否则多个同名ACL匹配或关系

书写格式

acl   <aclname>    <criterion>   [flags]      [operator]     [<value>]
acl      名称      匹配规范      匹配模式     具体操作符     操作对象类型
------------------------------------------------
ACL-Name   调用名称
acl   Acl_Name hdr_dom(host)   -i   img.magedu.com
#ACL名称,可以使用大字母A-Z、小写字母a-z、数字0-9、冒号:、点.、中横线和下划线,并且严格区分大小写,比如Image_site和image_site就是两个完全不同的acl
ACL-criterion    定义ACL匹配规范,即:判断条件

	hdr string,提取在一个HTTP请求报文的首部
	hdr([<name> [,<occ>]])    :完全匹配字符串,header的指定信息,<occ> 表示在多值中使用的值的出现次数
	hdr_beg([<name> [,<occ>]]):前缀匹配,header中指定匹配内容的begin
	hdr_end([<name> [,<occ>]]):后缀匹配,header中指定匹配内容end
	hdr_dom([<name> [,<occ>]]):域匹配,header中的domain name
	hdr_dir([<name> [,<occ>]]):路径匹配,header的uri路径
	hdr_len([<name> [,<occ>]]):长度匹配,header的长度匹配
	hdr_reg([<name> [,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
	hdr_sub([<name> [,<occ>]]):子串匹配,header中的uri模糊匹配

域名匹配

在haproxy的配置

frontend web
        bind *:80
        mode http
        acl test hdr_dom(host) -i www.timinglee.org
        use_backend web-host if test
         default_backend web11-host


backend web-host
        mode http
        server web1 172.25.254.10:80 check inter 2 fall 2 rise 3
backend web11-host
        mode http
        server web2 172.25.254.20:80 check inter 2 fall 2 rise 3

因为有域名,所以要先在windows的文件里配置解析

路径为:C:\Windows\System32\drivers\etc,保存退出

base : string
#返回第一个主机头和请求的路径部分的连接,该请求从第一个斜杠开始,并在问号之前结束,对虚拟主机有用
<scheme>://<user>:<password>@#<host>:<port>/<path>;<params>#?<query>#<frag>
    base     : exact string match精确字符串匹配
    base_beg : prefix match
    base_dir : subdir match
    base_dom : domain match
    base_end : suffix match
    base_len : length match
    base_reg : regex match
    base_sub : substring match
	
path : string
#提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)
<scheme>://<user>:<password>@<host>:<port>#/<path>;<params>#?<query>#<frag>
    path     : exact string match精确字符串匹配
    path_beg : prefix match  #请求的URL开头,如/static、/images、/img、/css
    path_end : suffix match  #请求的URL中资源的结尾,如 .gif  .png  .css  .js  .jpg  .jpeg
    path_dom : domain match
    path_dir : subdir match
    path_len : length match
    path_reg : regex match
    path_sub : substring match

浏览器类型的匹配

配置

frontend web
        bind *:80
        mode http
       acl s hdr_sub(User-Agent) -i curl wget
        use_backend web-host if s
         default_backend web11-host


backend web-host
        mode http
        server web1 172.25.254.10:80 check inter 2 fall 2 rise 3
backend web11-host
        mode http
        server web2 172.25.254.20:80 check inter 2 fall 2 rise 3

基于文件后缀名的动静分离的匹配

frontend web
        bind *:80
        mode http

       acl st path_end -i .jpd .png .html
       acl php path_end -i .php
        use_backend web-host if st
         default_backend web11-host


backend web-host
        mode http
        server web1 172.25.254.10:80 check inter 2 fall 2 rise 3
backend web11-host
        mode http
        server web2 172.25.254.20:80 check inter 2 fall 2 rise 3

错误页面自定义

在haproxy上的配置

创建文件

[root@haproxy ~]# mkdir /haproxy/errorpages/ -p

复制503的页面

[root@haproxy ~]# cp /usr/share/haproxy/503.http  /haproxy/errorpages/503.http

修改页面内容

[root@haproxy ~]# vim /haproxy/errorpages/503.http 


HTTP/1.0 503 Service Unavailable^M
Cache-Control: no-cache^M
Connection: close^M
Content-Type: text/html^M
^M
<html><body><h1>haha</h1>
</body></html>

在haproxy修改配置文件,并重启

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 

[root@haproxy ~]# systemctl restart haproxy.service 

在RS上下线nginx服务

[root@RS1 ~]# systemctl stop nginx.service 

两台都要下线,使其后端的服务器都断开

之后再浏览器测试

测试结果为成功

错误页面重定向

下线后端的nginx服务

​
[root@RS1 ~]# systemctl stop nginx.service 

​

再haproxy的配置文件里修改,并重启

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 


[root@haproxy ~]# systemctl restart haproxy.service 

再浏览器测试



此时你在输入172.25.254.100地址,则503页面就会自动跳转到百度

四层负载

对MySQL实现四层负载

在RS上使用yum或者dnf安装MySQL,两台都要安装

[root@RS1 ~]# dnf install mariadb_server -y
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

上次元数据过期检查:0:42:19 前,执行于 2024年08月11日 星期日 14时06分44秒。
未找到匹配的参数: mariadb_server
错误:没有任何匹配: mariadb_server
[root@RS1 ~]# dnf install mariadb-server -y
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

上次元数据过期检查:0:42:32 前,执行于 2024年08月11日 星期日 14时06分44秒。
依赖关系解决。
==========================================================================================================================================
 软件包                                      架构                    版本                                仓库                        大小
==========================================================================================================================================
安装:
 mariadb-server                              x86_64                  3:10.5.16-2.el9_0                   AppStream                  9.4 M
安装依赖关系:
 mariadb                                     x86_64                  3:10.5.16-2.el9_0                   AppStream                  1.6 M
 mariadb-common                              x86_64                  3:10.5.16-2.el9_0                   AppStream                   39 k
 mariadb-connector-c                         x86_64                  3.2.6-1.el9_0                       AppStream                  203 k
 mariadb-connector-c-config                  noarch                  3.2.6-1.el9_0                       AppStream                   11 k
 mariadb-errmsg                              x86_64                  3:10.5.16-2.el9_0                   AppStream                  227 k
 mysql-selinux                               noarch                  1.0.5-1.el9_0                       AppStream                   37 k
 perl-DBD-MariaDB                            x86_64                  1.21-16.el9_0                       AppStream                  156 k
 perl-File-Copy                              noarch                  2.34-479.el9                        AppStream                   30 k
 perl-Sys-Hostname                           x86_64                  1.23-479.el9                        AppStream                   29 k
安装弱的依赖:
 mariadb-backup                              x86_64                  3:10.5.16-2.el9_0                   AppStream                  6.4 M
 mariadb-gssapi-server                       x86_64                  3:10.5.16-2.el9_0                   AppStream                   21 k
 mariadb-server-utils                        x86_64                  3:10.5.16-2.el9_0                   AppStream                  222 k

事务概要
==========================================================================================================================================
安装  13 软件包

总计:18 M
安装大小:108 M
下载软件包:
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                                                                                                                           1/1 
  安装    : mariadb-connector-c-config-3.2.6-1.el9_0.noarch                                                                          1/13 
  安装    : mariadb-common-3:10.5.16-2.el9_0.x86_64                                                                                  2/13 
  安装    : mariadb-connector-c-3.2.6-1.el9_0.x86_64                                                                                 3/13 
  安装    : perl-Sys-Hostname-1.23-479.el9.x86_64                                                                                    4/13 
  安装    : perl-DBD-MariaDB-1.21-16.el9_0.x86_64                                                                                    5/13 
  安装    : mariadb-errmsg-3:10.5.16-2.el9_0.x86_64                                                                                  6/13 
  安装    : perl-File-Copy-2.34-479.el9.noarch                                                                                       7/13 
  运行脚本: mysql-selinux-1.0.5-1.el9_0.noarch                                                                                       8/13 
  安装    : mysql-selinux-1.0.5-1.el9_0.noarch                                                                                       8/13 
  运行脚本: mysql-selinux-1.0.5-1.el9_0.noarch                                                                                       8/13 
libsemanage.semanage_direct_install_info: Overriding mysql module at lower priority 100 with module at priority 200.

  安装    : mariadb-backup-3:10.5.16-2.el9_0.x86_64                                                                                  9/13 
  安装    : mariadb-gssapi-server-3:10.5.16-2.el9_0.x86_64                                                                          10/13 
  安装    : mariadb-server-utils-3:10.5.16-2.el9_0.x86_64                                                                           11/13 
  运行脚本: mariadb-server-3:10.5.16-2.el9_0.x86_64                                                                                 12/13 
  安装    : mariadb-server-3:10.5.16-2.el9_0.x86_64                                                                                 12/13 
  运行脚本: mariadb-server-3:10.5.16-2.el9_0.x86_64                                                                                 12/13 
  安装    : mariadb-3:10.5.16-2.el9_0.x86_64                                                                                        13/13 
  运行脚本: mysql-selinux-1.0.5-1.el9_0.noarch                                                                                      13/13 
  运行脚本: mariadb-3:10.5.16-2.el9_0.x86_64                                                                                        13/13 
  验证    : mariadb-3:10.5.16-2.el9_0.x86_64                                                                                         1/13 
  验证    : mariadb-backup-3:10.5.16-2.el9_0.x86_64                                                                                  2/13 
  验证    : mariadb-common-3:10.5.16-2.el9_0.x86_64                                                                                  3/13 
  验证    : mariadb-connector-c-3.2.6-1.el9_0.x86_64                                                                                 4/13 
  验证    : mariadb-connector-c-config-3.2.6-1.el9_0.noarch                                                                          5/13 
  验证    : mariadb-errmsg-3:10.5.16-2.el9_0.x86_64                                                                                  6/13 
  验证    : mariadb-gssapi-server-3:10.5.16-2.el9_0.x86_64                                                                           7/13 
  验证    : mariadb-server-3:10.5.16-2.el9_0.x86_64                                                                                  8/13 
  验证    : mariadb-server-utils-3:10.5.16-2.el9_0.x86_64                                                                            9/13 
  验证    : mysql-selinux-1.0.5-1.el9_0.noarch                                                                                      10/13 
  验证    : perl-DBD-MariaDB-1.21-16.el9_0.x86_64                                                                                   11/13 
  验证    : perl-File-Copy-2.34-479.el9.noarch                                                                                      12/13 
  验证    : perl-Sys-Hostname-1.23-479.el9.x86_64                                                                                   13/13 
已更新安装的产品。

已安装:
  mariadb-3:10.5.16-2.el9_0.x86_64                                        mariadb-backup-3:10.5.16-2.el9_0.x86_64                         
  mariadb-common-3:10.5.16-2.el9_0.x86_64                                 mariadb-connector-c-3.2.6-1.el9_0.x86_64                        
  mariadb-connector-c-config-3.2.6-1.el9_0.noarch                         mariadb-errmsg-3:10.5.16-2.el9_0.x86_64                         
  mariadb-gssapi-server-3:10.5.16-2.el9_0.x86_64                          mariadb-server-3:10.5.16-2.el9_0.x86_64                         
  mariadb-server-utils-3:10.5.16-2.el9_0.x86_64                           mysql-selinux-1.0.5-1.el9_0.noarch                              
  perl-DBD-MariaDB-1.21-16.el9_0.x86_64                                   perl-File-Copy-2.34-479.el9.noarch                              
  perl-Sys-Hostname-1.23-479.el9.x86_64                                  

完毕!

在/etc/my.cnf.d/mariadb-server.cnfl里添加id标识,从而可以直观看到实验结果

[root@RS1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf 

重启

[root@RS1 ~]# systemctl start mariadb.service 



root@RS2 ~]# systemctl start mariadb.service 

账户密码,两台都要设置

[root@RS1 ~]#  mysql -e "grant all on *.* to mm@'%' identified by 'mm';"

在haproxy的配置文件里添加参数,并重启

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 


listen mydb
        bind *:3306
        mode tcp
        balance static-rr
        server db1 172.25.254.10:3306
        server db2 172.25.254.20:3306



[root@haproxy ~]# systemctl restart haproxy.service 

安装MySQL,使其能使用MySQL的命令

[root@haproxy ~]# dnf install mariadb-server -y

测试

https加密访问

在haproxy创建目录,并制作证书

[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 365 -out /etc/haproxy/certs/timinglee.org.crt

..+....+........+.........+......+....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
............+..+....+.........+..+...+.........+.............+..+.+..+...+....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+......+............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*............+.......+...+...+..+.......+......+.........+...+..+...+.............+..............+.+.....+.+...+...............+...........+......+.+......................................+.+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:vh
State or Province Name (full name) []:vv
Locality Name (eg, city) [Default City]:qz
Organization Name (eg, company) [Default Company Ltd]:tim
Organizational Unit Name (eg, section) []:fas
Common Name (eg, your name or your server's hostname) []:jifg
Email Address []:jg
[root@haproxy ~]# cat /etc/haproxy/certs/timinglee.org.key  /etc/haproxy/certs/timinglee.org.crt  > /etc/haproxy/certs/timinglee.org.pem

在haproxy的配置文件里,并重启

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 




listen web-https
        bind *:443 ssl crt /etc/haproxy/certs/timinglee.org.pem
        mode http
        balance roundrobin
        server web11 172.25.254.10:80
        server web22 172.25.254.20:80


[root@haproxy ~]# systemctl restart haproxy.service 

测试

此时就可以使用加密的方式来访问

如果要全栈加密

则需要加上这条,此时在浏览器访问时就不用手动输入https://就可以加密码访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值