富婆和富公子都在看的负载均衡和Haproxy大全
一.负载均衡
1.1:什么是负载均衡

1.2.为什么用负载均衡
- Web服务器的动态水平扩展-->对用户无感知
- 增加业务并发访问及处理能力-->解决单服务器瓶颈问题
- 节约公网IP地址-->降低IT支出成本
- 隐藏内部服务器IP-->提高内部服务器安全性
- 配置简单-->固定格式的配置文件
- 功能丰富-->支持四层和七层,支持动态下线主机
- 性能较强-->并发数万甚至数十万
1.3.负载均衡四层和七层的区别
所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决 定怎么样转发流量四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负 载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪 台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理 七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比 如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。
二.haproxy简介
三.基础实验
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的基本配置信息
- 进程及安全配置相关的参数
- 性能调整相关参数
- Debug参数
- 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介绍
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
[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:静态算法
8.11:static-rr:基于权重的轮询调度
- 不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
- 不支持端服务器慢启动
- 其后端主机数量没有限制,相当于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进行动态修改权重,可以设置0和1,可以设置其它值但无效
first的小实验
vim /etc/haproxy/haproxy.cfg
在多台主机中执行死循环来看测试效果
8.2:动态算法
- 基于后端服务器状态进行调度适当调整,
- 新请求将优先调度至当前负载较低的服务器
- 权重可以在haproxy运行时动态调整无需重启
8.21: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的会话保持
9.2:配置选项
cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [
preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ]
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:状态页配置项
9.42:启用状态页
vim /etc/haproxy/haproxy.cfg
浏览器测试一下:
即可进入状态页查看信息
9.5: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配置
在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服务器日志格式配置
####主机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
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配置选项
10.3:ACL-Name 名称
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 匹配模式
-i 不区分大小写
-m 使用指定的正则表达式匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名ACL匹配或关系
10.6:ACL-operator 具体操作符
整数比较: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 操作对象
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的组合调用方式
与:隐式(默认)使用
或:使用“or" 或 “||"表示
否定:使用 "!" 表示
#示例:
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:基于浏览器访问,但是拒绝curl和wget的访问
首先在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 错误界面
- 对指定的报错进行重定向,进行优雅的显示错误页面
- 使用errorfile和errorloc指令的两种方法,可以实现自定义各种错误页面
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 ServerCopyright (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 ServerCopyright (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 ServerCopyright (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 实现
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
[root@Haproxy ~]# cat /etc/haproxy/certs/chl.org.key /etc/haproxy/certs/chl.org.crt > /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-----
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:什么是负载均衡 负载均衡: Load Balance ,简称 LB ,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均 衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或…...

VScode找python环境 (conda)
第一步 CtrlshiftP 第二步 框框里输入:Python:Select Interpreter...

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

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

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

为什么阿里开发手册推荐用静态工厂方法代替构造器?
🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 技术交流:定期更新…...

前端写法建议【让项目更加易于维护】
背景 标题前提条件: 没有字典接口、或其他原因,需要前端手动维护的情况 示例环境:vue2,其他项目同理 示例 如果项目有某种类别,前端和后端约定好了,某些情况下,需要前端写死时。 比如有字段…...

EasyExcel 自定义转换器、自定义导出字典映射替换、满足条件内容增加样式,完整代码+详细注释说明
虽然最之前是在其他地方看到的,但最终因缘巧合下找到了原文,还是尊重一下原作者。 参考引用了这位佬的博客,确实方便使用。 https://blog.csdn.net/qq_45914616/article/details/137200688?spm1001.2014.3001.5502 这是一个基于Easyexcel通过…...

C语言学习笔记 Day10(指针--中)
Day10 内容梳理: 目录 Chapter 7 指针 7.4 指针 & 数组 (1)指针操作数组元素 (2)指针加减运算 1)加法 2)减法 (3)指针数组 7.5 多级指针 Chapter 7 指针 …...

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

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

【笔记】从零开始做一个精灵龙女-画贴图阶段(终)
这篇主要是细节,包括花纹和其它一些细化 皮肤 脖子 脖子一定要压暗,不然前后关系体现不出来 脸 1. 忘了有uv缝了,记得打开投影模式画 顺着头发轨迹长的方向画出发际线 背包手镯 1.先画出暗色花纹: 2.再加亮色,亮…...

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

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

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

【C++进阶】继承
【C进阶】继承 🥕个人主页:开敲🍉 🔥所属专栏:C🥭 🌼文章目录🌼 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3 继承类模…...

立体相机镜面重建(一)镜面标定
无论是单目、双目或者是多屏幕镜面重建,都需要事先对屏幕和相机的相对位置进行标定,求得相机到屏幕之间的相对变换关系。如果求得屏幕和相机之间的变换关系呢?接下来是标定流程。 (一)准备: 1)…...

【如何有效解决前端Vue中的常见难题】
🐟作者简介:一名大三在校生,喜欢编程🪴 🐙个人主页🥇:Aic山鱼🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-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,0,-0, “”, null, undefined,NaNTruthy的值除了以上之外的其他值 2.等号判断 console.log(10 10); console.log(0 ); console.log(0 false); console.log( fa…...

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

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

[大模型实战] 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 图像/视频渲染2.1.5 定制化部署 2.2 支持的GPU 三、在DAMODEL部署LLama3.13.1 在DAMODEL创建实例&…...

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

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

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

记忆化搜索专题篇
目录 斐波那契数 不同路径 最长递增子序列 猜数字大小II 矩阵中的最长递增路径 声明:下面将主要使用递归记忆化搜索来解决问题!!! 斐波那契数 题目 思路 斐波那契数的特点就是除了第一个数是0,第二个数是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时避免不了需要推送系统通知,以提高用户的使用体验。在自己的一个工具型的小app上全流程接入了uni-push2.0的推送能力,做个记录,以防后期需要用到。在阅读本教程前最好先看看官方文档,结合官方文档使用…...

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