当前位置: 首页 > news >正文

富婆和富公子都在看的负载均衡和Haproxy大全

.负载均衡

1.1:什么是负载均衡

负载均衡: Load Balance ,简称 LB ,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均 衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展

1.2.为什么用负载均衡

  • Web服务器的动态水平扩展-->对用户无感知
  • 增加业务并发访问及处理能力-->解决单服务器瓶颈问题
  • 节约公网IP地址-->降低IT支出成本
  • 隐藏内部服务器IP-->提高内部服务器安全性
  • 配置简单-->固定格式的配置文件
  • 功能丰富-->支持四层和七层,支持动态下线主机
  • 性能较强-->并发数万甚至数十万

1.3.负载均衡四层和七层的区别

所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决 定怎么样转发流量四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负 载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪 台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理 七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比 如同一个Web服务器的负载均衡,除了根据VIP80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。

1. 分层位置 : 四层负载均衡在传输层及以下,七层负载均衡在应用层及以下
2. 性能 : 四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高 : 七层可支持解析应用
层报文消息内容,识别 URL Cookie HTTP header 等信息。、
3. 原理 : 四层负载均衡是基于 ip+port; 七层是基于虚拟的 URL 或主机 IP 等。
4. 功能类比 : 四层负载均衡类似于路由器 ; 七层类似于代理服务器。
5. 安全性 : 四层负载均衡无法识别 DDoS 攻击 ; 七层可防御 SYN Cookie/Flood 攻击

.haproxy简介

HAProxy 是法国开发者 威利塔罗 (Willy Tarreau) 2000 年使用 C 语言开发的一个开源软件, 是一款具备高并发( 万级以上 ) 、高性能的 TCP HTTP 负载均衡器 ,支持基于cookie 的持久性,自动故障切换,支持正则表达式及 web 状态统计

.基础实验

3.1:安装haproxy软件(红帽9.2自带,可以直接安装)

yum install haproxy -y

3.2:配置/etc/haproxy/haproxy.cfg

frontend webclusterbind *:80mode httpuse_backend webcluster-hostbackend webcluster-hostbalance roundrobinserver web1 172.25.254.10:80server web2 172.25.254.20:80

3.3:webserver1上的操作

yum install nginx -y echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html

3.4:webserver2上的操作

yum install nginx -y echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html

3.5:在客户端测试是否成功

[root@Haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@Haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@Haproxy ~]# 

四:haproxy的基本配置信息

HAProxy 的配置文件 haproxy.cfg 由两大部分组成,分别是:
global :全局配置段
  • 进程及安全配置相关的参数
  • 性能调整相关参数
  • Debug参数
proxies :代理配置段
  • defaults:为frontend, backend, listen提供默认配置
  • frontend:前端,相当于nginx中的server {}
  • backend:后端,相当于nginx中的upstream {}
  • listen:同时拥有前端和后端配置,配置简单,生产推荐使用

五:haproxy的全局配置

5.1:多线程设定

5.2:查看多进程设置信息

[root@Haproxy ~]# pstree -p | grep haproxy|-haproxy(32937)-+-haproxy(32939)|                `-haproxy(32940)

5.3:多线程设定(记得把多进程设定注释掉,不会会影响导致失败)

5.4:查看多线程设定

[root@Haproxy ~]# pstree -p | grep haproxy|-haproxy(32977)---haproxy(32980)---{haproxy}(32981)

六:Haproxy代理参数

6.1:server 配置

#针对一个server配置
check #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没
有其它配置也可以启用检查功能
#默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定
端口才能实现健康性检查
addr <IP> #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num> #指定的健康状态监测端口
inter <num> #健康状态检查间隔时间,默认2000 ms
fall <num> #后端服务器从线上转为线下的检查的连续失效次数,默认为3
代码示例:
测试效果:
3.3.2.5 Proxies配置-listen 简化配置
使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用
listen配置示例:
rise <num> #后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight> #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
backup #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry
Server
disabled #将后端服务器标记为不可用状态,即维护状态,除了持久模式
#将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求
redirect prefix http://www.baidu.com/ #将请求临时(302)重定向至其它URL,只适用于http模
式
maxconn <maxconn> #当前后端server的最大并发连接数

6.2:小实验:

6.21在Haproxy主机上安装httpd服务

yum install httpd -y

6.22:输入信息到网站中

echo sorry 下班了> /var/www/html/index.html

6.23:关闭主机10和主机20的nginx服务并在网页端测试

systemctl stop nginx.service 

6.24:想要在客户端测试成功需要先添加端口并配置服务

vim /etc/httpd/conf/httpd.conf

vim /etc/haproxy/haproxy.cfg

6.25:然后在客户端测试(要是输入的内容为中文的话会乱码)

七:socat 工具

7.1:socat介绍

对服务器动态权重和其它状态可以利用 socat 工具进行调整, Socat Linux 下的一个多功能的网络工 具,名字来由是Socket CAT ,相当于 netCAT 的增强版 .Socat 的主要特点就是在两个数据流之间建立双向 通道,且支持众多协议和链接方式。如 IP TCP UDP IPv6 Socket 文件

7.2:利用工具socat 对服务器动态权重调整(热处理)

#修改配置文件
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats mode 600 level admin###安装socat软件
yum install socat -y#查看集群权重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio
/var/lib/haproxy/stats
2 (initial 2)
[root@haproxy ~]# echo get weight webcluster/web2 | socat stdio
/var/lib/haproxy/stats
1 (initial 1)
#设置权重
[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio
/var/lib/haproxy/stats
[root@haproxy ~]# echo "set weight webcluster/web1 2 " | 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

7.3:针对多进程处理方法

haproxy ~]# vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1
stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2
nbproc 2
cpu-map 1 0
cpu-map 2 1
这样每个进程就会有单独的 sock 文件来进行单独管理
[root@haproxy ~]# ll /var/lib/haproxy/
总用量 0
srw------- 1 root root 0 8月 10 13:43 stats
srw------- 1 root root 0 8月 10 13:46 stats1
srw------- 1 root root 0 8月 10 13:46 stats2

八:Haproxy的算法

8.1:静态算法

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重( 只能为 0 1, 不支持其它值 ) ,只能靠重启 HAProxy 生效。

8.11:static-rr:基于权重的轮询调度

  • 不支持运行时利用socat进行权重的动态调整(只支持01,不支持其它值)
  • 不支持端服务器慢启动
  • 其后端主机数量没有限制,相当于LVS中的 wrr

static-rr的小实验:

vim /etc/haproxy/haproxy.cfg 

测试一下:

[root@Haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@Haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@Haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20

8.12:first

  • 根据服务器在列表中的位置,自上而下进行调度
  • 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
  • 其会忽略服务器的权重设置
  • 不支持用socat进行动态修改权重,可以设置01,可以设置其它值但无效

first的小实验

vim /etc/haproxy/haproxy.cfg 

在多台主机中执行死循环来看测试效果

8.2:动态算法

动态算法
  • 基于后端服务器状态进行调度适当调整,
  • 新请求将优先调度至当前负载较低的服务器
  • 权重可以在haproxy运行时动态调整无需重启

8.21:roundrobin

1. 基于权重的轮询动态调度算法,
2. 支持权重的运行时调整,不同于 lvs 中的 rr 轮训模式,
3. HAProxy 中的 roundrobin 支持慢启动 ( 新加的服务器会逐渐增加转发数 )
4. 其每个后端 backend 中最多支持 4095 real server
5. 支持对 real server 权重动态调整,
6. roundrobin 为默认调度算法 , 此算法使用广泛

roundrobin的小实验:

vim /etc/haproxy/haproxy.cfg 

测试一下:

[root@Haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@Haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@Haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20

8.22:leastconn

  • leastconn加权的最少连接的动态
  • 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户 端连接)
  • 比较适合长连接的场景使用,比如:MySQL等场景

leastconn的小实验

vim /etc/haproxy/haproxy.cfg 

测试一下:

[root@Haproxy ~]# while true ; do curl 172.25.254.100; sleep 0.1;done
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
^C

8.3其他算法

想要了解更多其他算法请点击

https://blog.csdn.net/cwyxf123/article/details/118906712

九:高级功能及配置

9.1:基于cookie的会话保持

cookie value :为当前 server 指定 cookie 值,实现基于 cookie 的会话黏性,相对于基于 source 地址 hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy 负载,目前此模式使用较少, 已经被 session 共享服务器代替

9.2:配置选项

cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [

preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ]

name #cookie key 名称,用于实现持久连接
insert # 插入新的 cookie, 默认不插入 cookie
indirect # 如果客户端已经有 cookie, 则不会再发送 cookie 信息
nocache # client hapoxy 之间有缓存服务器(如: CDN )时,不允许中间缓存器缓 cookie
# 因为这会导致很多经过同一个 CDN 的请求都发送到同一台后端服务器

9.3:cookie小实验

vim /etc/haproxy/haproxy.cfg 

浏览器测试看网络的cookie

客户端测试:

[C:\~]$ curl -b WEBCOOKIE=chl1 172.25.254.100% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100    27  100    27    0     0  12000      0 --:--:-- --:--:-- --:--:-- 13500
webserver1 - 172.25.254.10[C:\~]$ curl -b WEBCOOKIE=chl2 172.25.254.100% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100    27  100    27    0     0   8164      0 --:--:-- --:--:-- --:--:--  9000
webserver2 - 172.25.254.20

9.4:HAProxy状态页

9.41:状态页配置项

stats enable                  # 基于默认的参数启用 stats page
stats hide-version         # 将状态页中 haproxy 版本隐藏
stats refresh <delay>    # 设定自动刷新时间间隔,默认不自动刷新
stats uri <prefix>           # 自定义 stats page uri ,默认值: /haproxy?stats
stats auth <user>:<passwd> # 认证时的账号和密码,可定义多个用户 , 每行指定一个用户
# 默认: no authentication
stats admin { if | unless } <cond> # 启用 stats page 中的管理功能

9.42:启用状态页

vim /etc/haproxy/haproxy.cfg

浏览器测试一下:

即可进入状态页查看信息

9.5:IP透传

web 服务器中需要记录客户端的真实 IP 地址,用于做访问统计、安全防护、行为分析、区域排行等场景。

9.51:四层IP透传

首先把模式改成四层tcp的

通过客户端curl 172.25.254.100测试到20发现ip地址没有透传

此时修改主机20nginx中的配置文件

vim /etc/nginx/nginx.conf

此时再通过客户端测试curl 172.25.254.100测试到主机20时候,再返回主机20查看日志

[root@webserver1 ~]# cat /var/log/nginx/access.log 
172.25.254.100 - - [11/Aug/2024:16:03:55 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/8.7.1" "-"
172.25.254.100 - - [11/Aug/2024:16:06:03 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/8.7.1" "172.25.254.1"

四层透传成功!!!!!!!

9.52:七层IP透传

haproxy工作在七层的时候,也可以透传客户端真实IP至后端服务器

9.521:HAProxy配置
在由 haproxy 发往后端主机的请求报文中添加 “X-Forwarded-For" 首部,其值为前端客户端的地址;用于 向后端主发送真实的客户端IP

在nginx中

首先修改配置文件

vim /etc/haproxy/haproxy.cfg

在客户端访问:
[C:\~]$ curl  172.25.254.100% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100    27  100    27    0     0   9588      0 --:--:-- --:--:-- --:--:-- 13500
webserver1 - 172.25.254.10

然后在主机10中看ip地址的传达

[root@webserver1 ~]# cat /var/log/nginx/access.log 
172.25.254.100 - - [11/Aug/2024:16:03:55 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/8.7.1" "-"

然后在配置文件中重新打开

vim /etc/haproxy/haproxy.cfg

然后再次在客户端curl 172.25.254.100,然后在主机10中即可看到ip的透传

[root@webserver1 ~]# cat /var/log/nginx/access.log 
172.25.254.100 - - [11/Aug/2024:16:03:55 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/8.7.1" "-"
172.25.254.100 - - [11/Aug/2024:16:06:03 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/8.7.1" "172.25.254.1"
9.521:web服务器日志格式配置
配置 web 服务器,记录负载均衡透传的客户端 IP 地址
首先在主机10中把nginx给停掉
####主机10
[root@webserver1 ~]# systemctl disable nginx
Removed "/etc/systemd/system/multi-user.target.wants/nginx.service".
[root@webserver1 ~]# systemctl stop nginx.service 

然后安装httpd服务并且输入信息到网站,并打开服务

yum install httpd -y [root@webserver1 ~]# echo webserver1 - 172.25.254.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl start httpd

然后在客户端curl 172.25.254.100到主机10,并在主机10中查看日志是否把ip透传过来

[root@webserver1 ~]# cat /etc/httpd/logs/access_log 
172.25.254.100 - - [11/Aug/2024:16:19:04 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/8.7.1"
[root@webserver

发现并没有传过来,这个时候在主机10中修改配置文件

vim /etc/httpd/conf/httpd.conf

重启httpd服务

再次在客户端测试并且在主机10中查看日志是否ip透传成功

[root@webserver1 ~]# cat /etc/httpd/logs/access_log 
172.25.254.100 - - [11/Aug/2024:16:19:04 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/8.7.1"
172.25.254.1 172.25.254.100 - - [11/Aug/2024:16:23:49 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/8.7.1"
[root@webserver1

透传成功!!!!!!!

十:ACL

访问控制列表 ACL Access Control Lists ) 是一种基于包过滤的访问控制技术 它可以根据设定的条件对经过服务器传输的数据包进行过滤( 条件匹配 ) 即对接收到的报文进行匹配和过 滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL 、文件后缀等信息内 容进行匹配并执行进一步操作,比如允许其通过或丢弃

10.1:标准写法

frontend webclusterbind *:80mode httpacl test hdr_dom(host) -i www.chl.orguse_backend webcluster-host if testdefault_backend default-hostbackend webcluster-hostmode httpserver web1 172.25.254.10:80 check inter 2 fall 2 rise 5backend default-hostmode httpserver web2 172.25.254.20:80 check inter 2 fall 2 rise 5

然后在本地windows添加解析

然后在客户端访问测试

[C:\~]$ curl  www.chl.org% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--100    27  100    27    0     0   1716      0 --:--:-- --:--:-- --:--:--  2700
webserver1 - 172.25.254.10

测试成功!!!!

10.2:ACL配置选项

# acl 来定义或声明一个 acl
acl        <aclname>          <criterion>         [flags]         [operator]      [<value>]
acl              名称                   匹配规范        匹配模式     具体操作符   操作对象类型

10.3:ACL-Name 名称

acl                        test              path_end             -m            sub               /a
#ACL 名称,可以使用大字母 A-Z 、小写字母 a-z 、数字 0-9 、冒号:、点 . 、中横线和下划线,并且严格区分大
小写,比如 :my_acl My_Acl 就是两个完全不同的 acl5.8.1.2 ACL-criterion

10.4: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中的dom(host)
hdr_dir([<name> [,<occ>]]):路径匹配,header的uri路径
hdr_len([<name> [,<occ>]]):长度匹配,header的长度匹配
hdr_reg([<name> [,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub([<name> [,<occ>]]):子串匹配,header中的uri模糊匹配 模糊匹配c 报文中a/b/c也会匹
配
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
5.4.1.3 ACL-flags 匹配模式
ACL匹配模式
path_reg : regex match
path_sub : substring match

ALC匹配规范小实验

记得先在本地windows做解析

hdr_end(host) 小实验:
vim /etc/haproxy/haproxy.cfg 

客户端测试:

[C:\~]$ curl  www.chl.org% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--100    27  100    27    0     0   1753      0 --:--:-- --:--:-- --:--:--  2700
webserver1 - 172.25.254.10

测试成功!!!!!


hdr_beg(host) 小实验
vim /etc/haproxy/haproxy.cfg 

测试:

[C:\~]$ curl  bbs.chl.org% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--100    27  100    27    0     0   2659      0 --:--:-- --:--:-- --:--:--  5400
webserver1 - 172.25.254.10
base_sub 小实验:
vim /etc/haproxy/haproxy.cfg 

在主机10上的操作

mkdir /var/www/html/lee -pecho 172.25.254.100 lee > /var/www/html/lee/index.html

然后测试:

[root@webserver1 ~]# curl 172.25.254.10/lee
172.25.254.10 lee

10.5:ACL-flags 匹配模式

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

10.6:ACL-operator 具体操作符

ACL 操作符
整数比较:eq、ge、gt、le、lt
字符比较:
- exact match (-m str) :字符串必须完全匹配模式
- substring match (-m sub) :在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配
- prefix match (-m beg) :在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配
- suffix match (-m end) :将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行
匹配
- subdir match (-m dir) :查看提取出来的用斜线分隔(“/")的字符串,如其中任一个匹配,则ACL
进行匹配
- domain match (-m dom) :查找提取的用点(“.")分隔字符串,如果其中任何一个匹配,则ACL进行
匹配

10.7:ACL-value 操作对象

value 的类型
The ACL engine can match these types against patterns of the following types :
- Boolean #布尔值
- integer or integer range #整数或整数范围,比如用于匹配端口范围
- IP address / network #IP地址或IP范围, 192.168.0.1 ,192.168.0.1/24
- string--> www.timinglee.org
exact #精确比较
substring #子串
suffix #后缀比较
prefix #前缀比较
subdir #路径, /wp-includes/js/jquery/jquery.js
domain #域名,www.timinglee.org
- regular expression #正则表达式
- hex block #16进制

10.8:多个ACL的组合调用方式

多个 ACL 的逻辑处理
与:隐式(默认)使用
或:使用“or" 或 “||"表示
否定:使用 "!" 表示
多个 ACL 调用方式:
#示例:
if valid_src valid_port #与关系,ACL中A和B都要满足为true,默认为与
if invalid_src || invalid_port #或,ACL中A或者B满足一个为true
if ! invalid_src #非,取反,不满足ACL才为true

10.9:基于域名访问小实验

首先在haproxy中配置文件

vim /etc/haproxy/haproxy.cfg

然后在客户端测试:

[C:\~]$ curl www.chl.org% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--100    27  100    27    0     0   2629      0 --:--:-- --:--:-- --:--:--  5400
webserver1 - 172.25.254.10[C:\~]$ curl www.test.com% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--100    27  100    27    0     0   1777      0 --:--:-- --:--:-- --:--:--  2700
webserver2 - 172.25.254.20

10.10:基于源IP或子网调度访问

首先在haproxy中配置文件

vim /etc/haproxy/haproxy.cfg

在指定的ip访问测试:

[C:\~]$ curl www.test.com% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--100    27  100    27    0     0   1740      0 --:--:-- --:--:-- --:--:--  2700
webserver1 - 172.25.254.10
[root@webserver2 ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@webserver2 ~]# 
[root@Haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@Haproxy ~]# 

10.10.1:拒绝IP或子网调度访问

首先在haproxy中配置文件

vim /etc/haproxy/haproxy.cfg

在指定的ip地址测试访问:


[C:\~]$ curl 172.25.254.100% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--100    93  100    93    0     0  55324      0 --:--:-- --:--:-- --:--:-- 93000
<html><body><h1>403 Forbidden</h1>Request forbidden by administrative rules.</body></html>
[root@webserver2 ~]# curl 172.25.254.100
<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
</body></html>

没指定拒绝的ip地址可以访问

[root@webserver1 ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@webserver1 ~]# 
 

10.11:匹配浏览器类型

匹配客户端浏览器,将不同类型的浏览器调动至不同的服务器组
10.11.1:基于浏览器访问,但是拒绝curlwget的访问

首先在haproxy中配置文件

vim /etc/haproxy/haproxy.cfg

客户端测试:

[C:\~]$ curl 172.25.254.100% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--100    93  100    93    0     0  51211      0 --:--:-- --:--:-- --:--:-- 93000
<html><body><h1>403 Forbidden</h1>Request forbidden by administrative rules.</body></html>

10.12:基于文件后缀名实现动静分离

首先在主机10中安装php服务

yum install php -y

然后开启httpd服务

systemctl start httpd

配置php服务

vim /var/www/html/index.php
<?phpphpinfo();
?>

然后再浏览器测试一下是否配置成功

想要实现动静分离的话,需要在haproxy中配置文件

vim /etc/haproxy/haproxy.cfg

然后在浏览器测试一下是否配置成功

10.13:匹配访问路径实现动静分离

首先处理静态页面:在主机20中:

mkdri /usr/share/nginx/html/static -p
echo static - 172.25.254.20 > /usr/share/nginx/html/static/index.html

测试一下:

[root@webserver2 html]# curl 172.25.254.20/static/index.html
static - 172.25.254.20

然后处理php页面,在主机10中

mkdir /var/www/html/php -p
cp /var/www/html/index.php /var/www/html/php/

测试一下:

正式开始在haproxy中实现动静分离:

vim /etc/haproxy/haproxy.cfg

然后再浏览器里面测试一下是否成功:

十一:自定义HAProxy 错误界面

  • 对指定的报错进行重定向,进行优雅的显示错误页面
  • 使用errorfileerrorloc指令的两种方法,可以实现自定义各种错误页面

11.1:基于自定义的错误页面文件

首先在主机10中关闭httpd服务

systemctl stop httpd

然后在主机20中关闭nginx服务

systemctl stop nginx

然后在浏览器访问172.25.254.100可以看到503页面

如何自定义错误页面:在haproxy中操作
 

[root@Haproxy ~]# mkdir /etc/haproxy/errorpage -p
[root@Haproxy ~]# vim /etc/haproxy/errorpage/503.httpcp /usr/share/haproxy/503.http /etc/haproxy/errorpage/503.http

然后在 /etc/haproxy/haproxy.cfg中配置

[root@Haproxy ~]# cat /etc/haproxy/errorpage/503.http 
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html<html>
<meta http-equiv=content-type content=text/html;charset=utf-8>
<body><h1>创建时间就是看,思考思考</h1>
No server is available to handle this request.
</body></html>

在浏览器测试一下:

11.2:基于http重定向错误页面

修改/etc/haproxy/haproxy.cfg中的文件即可

测试一下:

十二:HAProxy 四层负载

针对除HTTP以外的TCP协议应用服务访问的应用场景

  • MySQL
  • Redis
  • Memcache
  • RabbitMQ

用mysql来做一个小实验

首先在主机10和主机20都安装mariadb-server服务

yum install mariadb-server

然后修改mysql的名称好体现实验效果

修改主机10的

vim /etc/my.cnf.d/mariadb-server.cnf 

修改20的

开启主机10和主机20的mariadb-server服务

systemctl start mariadb.service 

设置10主机和20主机的mysql密码

[root@webserver1 ~]# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE USER chl@'%' identified by 'chl';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL ON *.* TO chl@'%';
Query OK, 0 rows affected (0.001 sec)

然后再haproxy中配置文件

然后在主机10和主机20中测试

主机20:

[root@webserver1 ~]# mysql -u chl -pchl
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SELECT @@server_id;
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> 
MariaDB [(none)]> SELECT @@server_id;
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+
1 row in set (0.000 sec)
 

主机10:

[root@Haproxy ~]# mysql -u chl -pchl
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.5.16-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SELECT @@server_id;
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> SELECT @@server_id;
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
1 row in set (0.000 sec)
 

十三:HAProxy https 实现

haproxy 可以实现 https 的证书安全 , 从用户到 haproxy https, haproxy 到后端服务器用 http 通信
但基于性能考虑 , 生产中证书都是在后端服务器比如 nginx 上实现

13.1:实现基础https加密:

证书制作:

[root@Haproxy ~]# openssl req -newkey rsa:2048  -nodes -sha256 -keyoutchl.org.crt
..+......+......................+..+.......+...+........+....+......+.+......+........+...+...+....+............+...+..+......+...+....+...+.........+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++......+..+.........+.........+.............+..+...+..................+....+...+.+..............+.......+...+..+.+.....+...++++++++++++++++++
...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+.....+...+.+.....................+...+..++++++++++++++++++++++++++.+...+.+......+.....+...+...+...+.+........+.+...............+....................+.....+......+.+...+...+...+...........+.+..+.+..+.......+....+....+...............+......+............+.....+...+...+....+......................+....+..+.+..+......+....+........+.......+..+.+...+.++++++++++++
-----
You are about to be asked to enter information that will be incorporat
into your certificate request.
What you are about to enter is what is called a Distinguished Name or 
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]:cq
State or Province Name (full name) []:CQ
Locality Name (eg, city) [Default City]:wuxi
Organization Name (eg, company) [Default Company Ltd]:wuxi
Organizational Unit Name (eg, section) []:wuxi
Common Name (eg, your name or your server's hostname) []:haproxy
Email Address []:123@admin
 

把文件重定向传送到 /etc/haproxy/certs/chl.pem中
[root@Haproxy ~]# cat /etc/haproxy/certs/chl.org.key /etc/haproxy/certs/chl.org.crt > /etc/haproxy/certs/chl.pem
 
查看/etc/haproxy/certs/chl.pem里面文件是否传输成功
[root@Haproxy ~]# cat /etc/haproxy/certs/chl.pem 
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDr0nCMosAA/Gnc
A3aHIiSZdG7s6Bj/Ii6clpw+bfSfemLYWr52n7x0O81XKHEIr6Zu4CnBmS6nMsA2
ESeTnxgitw+EmsKm6SjraJ7aUDfnVe9ZrJbNVHugAuMLyXvv4q5dU+K6b83lIXp+
VtfDZ/t/rfs9w5i9zeYEmVSVn05jFF/ddbTQdMsBXtRNGjPtCXr5QxEVlyljaXZH
PJtyZFdAcRoeHENd3lLsTvNLl5Noqt5lzaUAI0zDEkHiaAUHOMnfwqKB3pSjTEHo
Idc6QJKcqGuCltBtZotKXxW9edyF2xkiEW3/PNOBkiDZJ3u31aGgjKgFLwD84Law
nH1aHK61AgMBAAECggEAL6c6cZzYrkpTbO9xNezvFuhZmvtqw7GpWCCyKYZoIorl
awFpUAjG2PkVrTlhoAb4m5qmLXYyIHzHrRVJ2VGSm79AvkPUtkxS5cEiKoz/wvpR
T95pqcva4HJ85W6dYhP9NqRDIngB0/2wJlQPrS+3uW0Toj9CgAZZpw/B8Ss8OJZr
12am2QPwVH6gUWcGPs4X7C/2uBP3uMSyu0Qh65nfGBvis2OzYF8/ks8BfRpvxRa2
AksRUF7ocEI7bOuSa5dmvo/yJ64AEr6iUO1Ta4Z85IqO2fGWxsh7Humfz2RZaf7e
vO2gI8sDGqYEZrblhrrBJ/CJ+uky/k8V3KqMC8loAQKBgQD6tiXhD9lVGD6GRd1k
9IJbkO2XmvQ+Hj+Cko9jbK5L/GtT6Puy26EPdqWq3jAAKG+6YXRUQ9+/jYCy+mWs
2sKThfHZkHC0UF2g+t7gk7dIsFecHzDgJaeQh6qT/11HovSqRNRqIXpE3IWUWWDQ
bZvXWmHuxZ1Af29z71BnHawoAQKBgQDwy+NLpuvIQCm/IFE0SSnpNDYLdoPvmbom
CxjC03Xc1YAO+OZYYYUVJHOtoXBuWmZy8ta1/sCEmV1GaeCE2mvasgviUSCPAob+
/3zSq2PaD6mhqCiGneg+GI/j7WGtgIQwv8zrowzNnueFJOlgm8pmVgEqFP68ID+B
XK2op3RmtQKBgH3lphPkr5BpwkwPHWQq3KM6nfT5nRjse5wIGPUmiEgkE4lpf6uL
Ws+3Fu488QHDTIfdlFsUUnGQj0ZRM2mf2QHXy2EjhVUm3j2OfQltZCaeVwBRMWv9
vK15UxFKtP7aN96g/cHl2c5mprWeRF2mDRIRkwgiOBtBYyhmzotZfTABAoGAY6Ip
WUsm8kPCQkfv8a94PPsShamzK7ey8zzSMQLoGMjqZMeOH/Gx7C6aArTy3WZgT521
Q7a2F+eRVapHcREjYWkcS7d/vkywaOBz2IN8HGUwrifzJMg/qTnmh8vYB79OcxFZ
jAJ6MLZYW5oLSqMLm05oyu3G/TZmsHMVk9w96KUCgYBwXUKBMXyxFfvlBUbMxSAa
S83fbmXc/r9ySxnlK/v8FZ0FTKLCbaVO3l5H6MWjitxf7ybcKEs+6L7OhvhxPPdx
Bx88c77dX27kwjr+Q1XHVQWBecpjFJco3U7hooyuwNsjd9bQTju7DF73d5Ct0VDG
rCiSmrOIWWFVlKKlTV0pow==
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDxzCCAq+gAwIBAgIUA37S+agNmERV8e0vqJJIWkbrZMUwDQYJKoZIhvcNAQEL
BQAwczELMAkGA1UEBhMCY3ExCzAJBgNVBAgMAkNRMQ0wCwYDVQQHDAR3dXhpMQ0w
CwYDVQQKDAR3dXhpMQ0wCwYDVQQLDAR3dXhpMRAwDgYDVQQDDAdoYXByb3h5MRgw
FgYJKoZIhvcNAQkBFgkxMjNAYWRtaW4wHhcNMjQwODExMTQ1ODU5WhcNMjUwODEx
MTQ1ODU5WjBzMQswCQYDVQQGEwJjcTELMAkGA1UECAwCQ1ExDTALBgNVBAcMBHd1
eGkxDTALBgNVBAoMBHd1eGkxDTALBgNVBAsMBHd1eGkxEDAOBgNVBAMMB2hhcHJv
eHkxGDAWBgkqhkiG9w0BCQEWCTEyM0BhZG1pbjCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAOvScIyiwAD8adwDdociJJl0buzoGP8iLpyWnD5t9J96Ytha
vnafvHQ7zVcocQivpm7gKcGZLqcywDYRJ5OfGCK3D4SawqbpKOtontpQN+dV71ms
ls1Ue6AC4wvJe+/irl1T4rpvzeUhen5W18Nn+3+t+z3DmL3N5gSZVJWfTmMUX911
tNB0ywFe1E0aM+0JevlDERWXKWNpdkc8m3JkV0BxGh4cQ13eUuxO80uXk2iq3mXN
pQAjTMMSQeJoBQc4yd/CooHelKNMQegh1zpAkpyoa4KW0G1mi0pfFb153IXbGSIR
bf8804GSINkne7fVoaCMqAUvAPzgtrCcfVocrrUCAwEAAaNTMFEwHQYDVR0OBBYE
FEzSa1dhn1yUlUPAadd4ZZBXlw+gMB8GA1UdIwQYMBaAFEzSa1dhn1yUlUPAadd4
ZZBXlw+gMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAMbyF6Mh
9FaofALL7l1P1UdCb6/41bPZlDuw0znaSPdYKDnc+Tv3dCvwvvgNXz3uRQkt4yuh
Qcy/ws90wSaBVcoEl4/8MI3dfOSjroQW67BzJyZWwILSiGu+Y6QbIK4MIWlUBv5F
D+9VOHcS+wI5jPApIwmtRTB34HXHdwjuFwRvG0D9Qu8r044+6xYSphYsH7fQ6jDY
BwHXL/3BLPw+NHaDWxcpB/v1iuy38/vTsU+jQlVZPPbCRZnf7yYJ7CXnatqwtR/0
HOxGSnxIqR+06Yu08qgYo38hrtk9R+dsaRXIhI+CzdR4v65FVtnB/dvVGUJl9syY
IAfcQmy2Tygh+GY=
-----END CERTIFICATE-----
 
配置haproxy里面的文件
vim /etc/haproxy/haproxy.cfg

然后在浏览器里面测试看证书是否生成成功

实现全站加密方法:

vim /etc/haproxy/haproxy.cfg

测试一下:输入172.25.254.100自动会https加密

 通过172.25.254.100:9999/status查看状态页

[root@Haproxy ~]# cd /etc/haproxy/conf.d/
[root@Haproxy conf.d]# vim 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 chl:chl
[root@Haproxy conf.d]# systemctl restart haproxy.service 
 

浏览器测试一下:

测试成功!!!!!!!!!!!!!!!!!!!!!

博主耗费接近一天的时间书写本篇博客,如果看到这里的话,肯定是真爱粉!!!!!!!!!!!!!!!!!!!!!!!!!!那麻烦点个小关注和点赞!!!!!!!!!!!!!!!!谢谢真爱粉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!博主创作不易!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!over!!!!!!!!!!!!!!

相关文章:

富婆和富公子都在看的负载均衡和Haproxy大全

一.负载均衡 1.1&#xff1a;什么是负载均衡 负载均衡&#xff1a; Load Balance &#xff0c;简称 LB &#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均 衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或…...

VScode找python环境 (conda)

第一步 CtrlshiftP 第二步 框框里输入&#xff1a;Python:Select Interpreter...

C# Winform序列化和反序列化

在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化&#xff0c;为解决此问题&#xff0c;采用System.Text.Json进行序列化&#xff0c;注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …...

crc原理概述

CRC&#xff08;循环冗余校验&#xff09;是一种错误检测技术&#xff0c;用于确保数据在传输或存储过程中没有发生变化。它通过将数据视为一个多项式&#xff0c;利用二进制除法得到一个校验码&#xff08;CRC值&#xff09;。接收方使用相同的算法验证数据和CRC值是否匹配&am…...

C++要求或禁止在堆中产生对象

有时你想这样管理某些对象&#xff0c;要让某种类型的对象能够自我销毁&#xff0c;也就是能够“delete this”。很明显这种管理方式需要此类型对象被分配在堆中。而其它一些时候你想获得一种保障&#xff1a;“不在堆中分配对象&#xff0c;从而保证某种类型的类不会发生内存泄…...

为什么阿里开发手册推荐用静态工厂方法代替构造器?

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 技术交流&#xff1a;定期更新…...

前端写法建议【让项目更加易于维护】

背景 标题前提条件&#xff1a; 没有字典接口、或其他原因&#xff0c;需要前端手动维护的情况 示例环境&#xff1a;vue2&#xff0c;其他项目同理 示例 如果项目有某种类别&#xff0c;前端和后端约定好了&#xff0c;某些情况下&#xff0c;需要前端写死时。 比如有字段…...

EasyExcel 自定义转换器、自定义导出字典映射替换、满足条件内容增加样式,完整代码+详细注释说明

虽然最之前是在其他地方看到的&#xff0c;但最终因缘巧合下找到了原文&#xff0c;还是尊重一下原作者。 参考引用了这位佬的博客&#xff0c;确实方便使用。 https://blog.csdn.net/qq_45914616/article/details/137200688?spm1001.2014.3001.5502 这是一个基于Easyexcel通过…...

C语言学习笔记 Day10(指针--中)

Day10 内容梳理&#xff1a; 目录 Chapter 7 指针 7.4 指针 & 数组 &#xff08;1&#xff09;指针操作数组元素 &#xff08;2&#xff09;指针加减运算 1&#xff09;加法 2&#xff09;减法 &#xff08;3&#xff09;指针数组 7.5 多级指针 Chapter 7 指针 …...

网页显示打印 pdf

文件服务使用 minio&#xff0c;使用 nginx 反向代理。 将文件存放在 minio 上&#xff0c;如果是公开的文件&#xff0c;则统一放到一个桶&#xff0c;设置为公开只读。 如果是私有文件&#xff0c;则使用临时链接&#xff0c;给有权限的用户查看和打印。 要实现在 html 页…...

1948-2024.5金融许可信息明细数据

1948-2024.5金融许可信息明细数据 1、时间&#xff1a;1948-2024.5 2、指标&#xff1a;来源表、机构编码、机构名称、所属银行、机构类型、业务范围、机构住所、地理坐标、行政区划代码、所属区县、所属城市、所属省份、邮政编码、发证日期、批准日期、发证机关、流水号、是…...

【笔记】从零开始做一个精灵龙女-画贴图阶段(终)

这篇主要是细节&#xff0c;包括花纹和其它一些细化 皮肤 脖子 脖子一定要压暗&#xff0c;不然前后关系体现不出来 脸 1. 忘了有uv缝了&#xff0c;记得打开投影模式画 顺着头发轨迹长的方向画出发际线 背包手镯 1.先画出暗色花纹&#xff1a; 2.再加亮色&#xff0c;亮…...

从MySQL到Elasticsearch:创建酒店索引案例

在现代的数据管理中&#xff0c;Elasticsearch&#xff08;简称ES&#xff09;因其强大的搜索功能和灵活的索引结构而受到广泛欢迎。本篇博客将介绍如何根据MySQL数据库中的酒店表定义&#xff0c;创建一个相应的Elasticsearch索引。 MySQL与Elasticsearch的对比 在开始之前&…...

Webkit与Web Push API:提升用户体验的推送技术

Web Push API是一种允许网站向用户发送通知的Web技术&#xff0c;即使用户没有打开网站也能接收到信息。这项技术可以显著提升用户的参与度和满意度。Webkit&#xff0c;作为Safari和其他浏览器的内核&#xff0c;对Web Push API的支持情况如何&#xff1f;本文将深入探讨Web P…...

Java线程池的拒绝策略

在 Java 线程池中&#xff0c;常见的拒绝策略&#xff1a; AbortPolicy&#xff08;中止策略&#xff09; 特点&#xff1a;直接抛出 RejectedExecutionException 异常来拒绝新任务的提交。应用场景&#xff1a;适用于对系统的稳定性要求较高&#xff0c;不希望丢失任务&#…...

【C++进阶】继承

【C进阶】继承 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3 继承类模…...

立体相机镜面重建(一)镜面标定

无论是单目、双目或者是多屏幕镜面重建&#xff0c;都需要事先对屏幕和相机的相对位置进行标定&#xff0c;求得相机到屏幕之间的相对变换关系。如果求得屏幕和相机之间的变换关系呢&#xff1f;接下来是标定流程。 &#xff08;一&#xff09;准备&#xff1a; 1&#xff09…...

【如何有效解决前端Vue中的常见难题】

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼&#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前端-Vue框架专栏…...

CLAMP-1靶机渗透测试

一、靶机下载地址 https://www.vulnhub.com/entry/clamp-101,320/ 二、信息收集 1、主机发现 # 使用命令 nmap 192.168.145.0/24 -sn | grep -B 2 "00:0C:29:88:B4:BF" 2、端口扫描 # 使用命令 nmap 192.168.145.0/24 -p- -sV 3、指纹识别 # 使用命令 whatweb …...

JavaScript中的Truthy Falsy值以及等号判断

1.Falsy & Truthy Falsy的值false&#xff0c;0&#xff0c;-0&#xff0c; “”&#xff0c; null&#xff0c; undefined&#xff0c;NaNTruthy的值除了以上之外的其他值 2.等号判断 console.log(10 10); console.log(0 ); console.log(0 false); console.log( fa…...

uniapp——展开和收起

案例展示 代码 后台返回的数据格式如下&#xff1a; {1: "大富科技速度快放假手动阀",2: "第三方斯蒂芬斯蒂芬是的开发时间",4: "45345345",5: "电饭锅电饭锅地方" }<view class"tipTitle">温馨提示</view> &l…...

WebGL2学习(2): GLSL ES 3.0

更多精彩内容尽在 dt.sim3d.cn &#xff0c;关注公众号【sky的数孪技术】&#xff0c;技术交流、源码下载请添加VX&#xff1a;digital_twin123 WebGL 2.0 给 GLSL 带来了重大变化。WebGL 1.0 中使用的 GLSL 版本是 GLSL ES 1.0。 WebGL 2.0 中仍然可用。但是&#xff0c;通过编…...

[大模型实战] DAMODEL云算力平台部署LLama3.1大语言模型

[大模型实战] DAMODEL云算力平台部署LLama3.1大语言模型 目录 一、LLama3.1二、DAMODEL云算力平台2.1 提供的服务2.1.1 AI训练2.1.2 AI推理2.1.3 高性能计算2.1.4 图像&#xff0f;视频渲染2.1.5 定制化部署 2.2 支持的GPU 三、在DAMODEL部署LLama3.13.1 在DAMODEL创建实例&…...

驱动开发系列09 - Linux设备模型之设备,驱动和总线

一:概述 Linux 设备模型(LDM)是 Linux 内核中引入的一个概念。用于管理内核对象(那些需要引用计数的对象、例如文件、设备、总线甚至驱动程序),以及描述它们之间的层次结构,以及这些内核对象之间绑定关系。Linux 设备模型引入了对象生命周期管理、引用计数、以及面向对象…...

HTML实现弹出层

leopard/ˈlepərd/ 豹子&#xff0c;豹纹 弹出层指的是鼠标悬停于某个元素之上时显示的一个界面组件。 关注和理解特性&#xff1a;z-index属性和动态生成HTML元素。 HTML5新增&#xff1a; figure:媒体内容(图像&#xff0c;音频&#xff0c;视频)&#xff0c;用于包含一…...

Android控件详解

在Android应用程序中&#xff0c;界面由布局和组件组成。布局相当于框架&#xff0c;而控件则是框架里面的内容。了解过Android布局后&#xff0c;如果要设计ui界面&#xff0c;还需要了解和掌握各个控件的应用。 一个界面的设计&#xff0c;先从创建容器开始&#xff0c;再向…...

记忆化搜索专题篇

目录 斐波那契数 不同路径 最长递增子序列 猜数字大小II 矩阵中的最长递增路径 声明&#xff1a;下面将主要使用递归记忆化搜索来解决问题&#xff01;&#xff01;&#xff01; 斐波那契数 题目 思路 斐波那契数的特点就是除了第一个数是0&#xff0c;第二个数是1&…...

入网测评检查项大全(安全资料)

1. Linux操作系统 2. Windows操作系统 3. Tomcat中间件 4. Nginx中间件 5. Mysql数据库 6. Weblogic中间件 7. Oracle数据库 8. Redis数据库 9. 达梦数据库 10. 应用系统 11. 渗透测试 13 .AIX操作系统 14 .中创中间件 15 .IIS中间件 16 .Apache中间件 17 .Mari…...

uni-app 开发App时调用uni-push 实现在线系统消息推送通知 保姆教程

一、引言 在开发App时避免不了需要推送系统通知&#xff0c;以提高用户的使用体验。在自己的一个工具型的小app上全流程接入了uni-push2.0的推送能力&#xff0c;做个记录&#xff0c;以防后期需要用到。在阅读本教程前最好先看看官方文档&#xff0c;结合官方文档使用&#xf…...

13.StringRedisTemplete使用

上一篇说到改变了RedisTemplate的默认序列化器后&#xff0c;在redis中存入Java对象后&#xff0c;在redis中的呈现是&#xff1a;会记录类的字节码 这也是代码中可以强制装换为对应的java对象的原因&#xff1a; Test void testStudent() {redisTemplate.opsForValue().set(&q…...