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

**1.2.**为什么用负载均衡
Web服务器的动态水平扩展-->对用户无感知
增加业务并发访问及处理能力-->解决单服务器瓶颈问题
节约公网IP地址-->降低IT支出成本
隐藏内部服务器IP-->提高内部服务器安全性
配置简单-->固定格式的配置文件
功能丰富-->支持四层和七层,支持动态下线主机
性能较强-->并发数万甚至数十万
**1.3.**负载均衡类型
1.3.1****硬件
F5 美国F5网络公司 https://f5.com/zh
Netscaler 美国思杰公司 https://www.citrix.com.cn/products/citrix-adc/、
Array 华耀 https://www.arraynetworks.com.cn/
AD-1000 深信服 http://www.sangfor.com.cn/
**1.3.2.**四层负载均衡

1.通过ip+port决定负载均衡的去向。
2.对流量请求进行NAT处理,转发至后台服务器。
3.记录tcp、udp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。
4.支持四层的软件
lvs:重量级四层负载均衡器。
Nginx:轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块)
Haproxy:模拟四层转发。
**1.3.3.**七层负载均衡

1.通过虚拟ur|或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2.代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立
tcp连接,
3.支持7层代理的软件:
Nginx:基于http协议(nginx七层是通过proxy_pass)
Haproxy:七层代理,会话保持、标记、路径转移等。
1.3.4****四层和七层的区别
所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决 定怎么样转发流量。
四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负 载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪 台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比 如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的 URL、浏览器类别、语言来决定是否要进行负载均衡。
1.分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下
2.性能 :四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应用 层报文消息内容,识别URL、Cookie、HTTP header等信息。
3.原理 :四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等。
4.功能类比:四层负载均衡类似于路由器;七层类似于代理服务器。
5.安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击
二. haproxy简介
1、HAProxy的概念
HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器,它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡,还能应用于数据库、邮件服务器、缓存服务器等多种场景,支持高达数百万级别的并发连接,并具有极低的延迟
- 支持功能
- TCP 和 HTTP 反向代理
- SSL/TSL服务器
- 可以针对HTTP请求添加 cookie,进行路由后端服务器
- 可平衡负载至后端服务器,并支持持久连接
- 支持所有主服务器故障切换至备用服务器 keepalive
- 支持专用端口实现监控服务
- 支持停止接受新连接请求,而不影响现有连接
- 可以在双向添加,修改或删除HTTP报文首部字段
- 响应报文压缩
- 支持基于 pattern 实现连接请求的访问控制
- 通过特定的 URI(url)为授权用户提供详细的状态信息
2、HAProxy的主要特性
高性能负载均衡: HAProxy通过优化的事件驱动引擎,能够以最小的系统资源开销处理大量并发请求。它支持多种负载均衡算法,如轮询、最少连接、源IP哈希等,可根据实际业务需求灵活配置
健康检查与故障恢复: HAProxy具备完善的后端服务器健康检查机制,可以根据响应时间、错误率等因素自动剔除不健康的后端节点,并在节点恢复时重新将其加入到服务池中,确保服务连续性
会话保持与亲和性: 为了保证用户的会话一致性,HAProxy支持基于cookie或源IP地址的会话保持功能,确保同一客户端的请求被转发到同一台后端服务器进行处理
安全性与SSL卸载: HAProxy支持SSL/TLS加密传输,可对HTTPS流量进行解密并透明地分发至后端服务器,同时也能终止SSL连接以减轻服务器的加密计算压力
高级路由与策略: 根据HTTP请求头、URL路径、内容类型等条件,HAProxy可以执行复杂的路由规则和ACL策略,使得负载均衡更加智能化和精准化
日志记录与监控: HAProxy提供丰富的日志记录选项,可通过syslog、CSV格式输出等方式收集统计数据,便于运维人员实时监控系统状态和性能指标
3、HAProxy的优缺点
- 优点
- 高性能:HAProxy是一个高性能的负载均衡器,可以处理大量的并发连接
- 灵活性:HAProxy支持多种负载均衡算法,如轮询、加权轮询、最少连接等,可以根据实际需求选择合适的算法
- 高可用性:HAProxy可以检测服务器的健康状态,如果某个服务器出现故障,它可以自动将流量转移到其他健康的服务器,从而保证服务的高可用性
- 安全性:HAProxy可以作为反向代理,隐藏后端服务器的真实IP地址,提高系统的安全性。
- 缺点
- 单点故障:如果HAProxy本身出现故障,可能会导致整个系统的服务不可用
- 配置复杂:HAProxy的配置相对复杂,需要一定的学习成本
- 性能瓶颈:虽然HAProxy的性能很高,但在处理大量并发连接时,可能会成为系统的性能瓶颈
- 功能单一:只支持做负载均衡的调度服务器,不支持正则处理,不能实现动静分离,也不能做web服务器
支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
- 企业版网站:https://www.haproxy.com
- 社区版网站:http://www.haproxy.org
- github:https://github.com/haprox
三.环境部署
1.HAPORXY实验环境设定

haproxy主机
配IP(双网卡)

配置内核路由功能
root@haproxy xia# echo net.ipv4.ip_forward=1 > /etc/sysctl.conf
root@haproxy xia# sysctl -p
net.ipv4.ip_forward = 1
- 值为 1 时,表示开启 IP 转发(系统会充当路由器,转发不同网段的数据包);
- 值为 0 时(默认),关闭 IP 转发,系统仅处理发往本机的数据包。
- 永久开启 Linux 系统的 IP 转发功能。
webserver1
配IP

root@webserver1 xia# mount /dev/sr0 /mnt 挂载硬盘
mount: /mnt: WARNING: source write-protected, mounted read-only.
root@webserver1root@webserver1 \~# dnf install httpd -y

webserver2
配IP

root@webserver2 xia# mount /dev/sr0 /mnt 挂载硬盘
mount: /mnt: WARNING: source write-protected, mounted read-only.
root@webserver2 xia# dnf install httpd -y

验证

#表示网络连通了
2.Haproxy的安装及配置参数
2.1安装
root@haproxy xia# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
root@haproxy xia# dnf install haproxy.x86_64 -y
2.2harpoxy的参数详解实验
1设定vim中tab键的空格个数
root@haproxy xia# vim ./vimrc
set ts=4 ai
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
测试

#用listen方式书写负载均衡
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
测试

2.log
指定把日志发送到哪里
实验。指定日志发送到192.168.0.10
#在192.168.0.10 开启接受日志的端口
root@webserver1 xia# vim /etc/rsyslog.conf

root@webserver1 xia# systemctl restart rsyslog.service
#测试接受日志端口是否开启
root@webserver1 xia# netstat -antlupe | grep rsyslog
udp 0 0 0.0.0.0:514 0.0.0.0:* 0 64123 30797/rsyslogd
udp6 0 0 :::514 :::* 0 64124 30797/rsyslogd
#在haproxy主机中设定日志发送信息
root@haproxy haproxy# vim haproxy.cfg
log 192.168.0.10 local2
root@haproxy haproxy# systemctl restart haproxy.service
测试

root@webserver1 ~]# cat /var/log/messages 查看日志

3.实现haproxy的多进程
root@haproxy xia# pstree -p | grep haproxy
|-haproxy(30610)---haproxy(30612)-+-{haproxy}(30613)
| |-{haproxy}(30614)
| `-{haproxy}(30615)
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
root@haproxy xia# pstree -p | grep haproxy
|-haproxy(30685)-+-haproxy(30687)
| `-haproxy(30688)
#多进程cpu绑定
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
#为不同进程准备不同套接字
root@haproxy xia# vim /etc/haproxy/haproxy.cfg
root@haproxy xia# systemctl restart haproxy.service
root@haproxy xia# systemctl stop haproxy.service
root@haproxy xia# rm -fr /var/lib/haproxy/stats
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
#效果

4.haproxy实现多线程
注意多线程不能和多进程同时启用
#查看当前haproxy的进程信息
root@haproxy xia# pstree -p | grep haproxy
|-haproxy(30711)-+-haproxy(30713)
| `-haproxy(30714)
#查看haproxy子进程的线程信息
root@haproxy xia# cat /proc/30713/status | grep Threads
Threads: 1
#启用多线程
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
root@haproxy xia# pstree -p | grep haproxy
|-haproxy(30730)---haproxy(30732)---{haproxy}(30733)
效果
root@haproxy xia# cat /proc/30732/status | grep Threads
Threads: 2
四.socat热更新工具
热更新 在服务或软件不停止的情况下更新软件或服务的工作方式,完成对软件不停工更新,典型的热更新设备,usb,在使用usb进行插拔时,电脑系统时不需要停止工作的,这中设备叫热插拔设备。
1.安装socat
root@haproxy xia# mount /dev/sr0 /mnt
root@haproxy xia# dnf install socat -y
root@haproxy xia# socat -h 查看 socat 工具的帮助信息
2.利用socat查看haproxy信息
root@haproxy xia# echo "show servers state" | socat stdio /var/lib/haproxy/stats
查询所有后端服务器的底层运行状态
1
be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_port srv_check_addr srv_agent_addr srv_agent_port
3 static 1 static 127.0.0.1 0 0 1 1 897 8 2 0 6 0 0 0 - 4331 - 0 0 - - 0
4 app 1 app1 127.0.0.1 0 0 1 1 897 8 2 0 6 0 0 0 - 5001 - 0 0 - - 0
4 app 2 app2 127.0.0.1 0 0 1 1 897 8 2 0 6 0 0 0 - 5002 - 0 0 - - 0
4 app 3 app3 127.0.0.1 0 0 1 1 896 8 2 0 6 0 0 0 - 5003 - 0 0 - - 0
4 app 4 app4 127.0.0.1 0 0 1 1 896 8 2 0 6 0 0 0 - 5004 - 0 0 - - 0
5 webcluster 1 haha 192.168.0.10 2 0 1 1 897 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
5 webcluster 2 hehe 192.168.0.20 2 0 1 1 897 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
root@haproxy xia# echo "get weight webcluster/haha" | socat stdio /var/lib/haproxy/stats
查询指定后端服务器的当前权重值
1 (initial 1)
root@haproxy xia# echo "get weight webcluster/hehe" | socat stdio /var/lib/haproxy/stats
查询 webcluster/hehe 服务器的权重
1 (initial 1)
3.利用socat更改haproxy信息
#直接更改报错
root@haproxy xia# echo "set weight webcluster/haha 2" | socat stdio /var/lib/haproxy/stats
Permission denied
#对socket进行授权
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# rm -rf /var/lib/haproxy/*
root@haproxy xia# systemctl restart haproxy.service
root@haproxy xia# ll /var/lib/haproxy/
总用量 0
srw------- 1 root root 0 2月 11 10:21 stats
#对socket进行授权
root@haproxy xia# echo "get weight webcluster/hehe" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
root@haproxy xia# echo "set weight webcluster/hehe 4 " | socat stdio /var/lib/haproxy/stats
root@haproxy xia# echo "get weight webcluster/hehe" | socat stdio /var/lib/haproxy/stats
4 (initial 1)
测试

五.Haproxy算法实验
1.静态算法
1.1static-rr
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
测试

#检测是否支持热更新

1.2.first
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
测试
root@haproxy xia# while true; do curl 172.25.254.100; done
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
... .......
xia@haproxy \~$ while true; do curl 172.25.254.100; done
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
2.动态算法
2.1.roundrobin
root@haproxy xia# vim /etc/haproxy/haproxy.cfg

root@haproxy xia# systemctl restart haproxy.service
验证

#动态权重更新
root@haproxy xia# echo "get weight webcluster/haha" | socat stdio /var/lib/haproxy/stats
2 (initial 2)
root@haproxy xia# echo "set weight webcluster/haha 1 " | socat stdio /var/lib/haproxy/stats
root@haproxy xia# echo "get weight webcluster/haha" | socat stdio /var/lib/haproxy/stats
1 (initial 2)
验证

2.2 leastcon
验证

3.混合算法
3.1.source
#默认静态算法

验证

#source动态算法

验证

3.2.uri
#主备实验环境
webserver1

webserver2

#设定uri算法

测试

3.3.url_param
#主备实验环境
webserver1
webserver2

#设定url_param算法

测试

3.4hdr
测试

六.基于cookie的会话保持
如果在haprorxy中设定算法为source,在同一台客户端主机中,无论使用什么浏览器访问的最终服务器是同一个 可以使用cookie值进行优化,让同一台客户端中同一个浏览器中访问的是同一个服务器 不同浏览器访问的是不同的服务器
#配合基于cookie的会话保持方法
测试

七.HAProxy状态页

登录测试


开启自动刷新

八.IP透传
1.七层IP透传
#实验环境

测试

#在rs主机中默认是未开启透传功能的

#可以忽略不记

#在rs中设定采集透传IP

#记得systemctl restart httpd
测试

2.四层IP透传
#环境设置
#在RS中把apache停止

#部署nginx
root@webserver1 xia# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
root@webserver1 xia# dnf install nginx -y
root@webserver1 xia# echo RS2 - 192.168.0.10 > /usr/share/nginx/html/index.html
root@webserver1 xia# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
root@webserver2 xia# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
root@webserver2 xia# dnf install nginx -y
root@webserver2 xia# echo RS2 - 192.168.0.20 > /usr/share/nginx/html/index.html
root@webserver2 xia# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
测试
#启用nginx的四层访问控制
root@webserver1/2 xia# vim /etc/nginx/nginx.conf
server {
listen 80 proxy_protocol; #启用四层访问控制
listen :::80;
server_name _;
root /usr/share/nginx/html;
Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
root@webserver1/2 xia# systemctl restart nginx.service 记得重启服务
测试

出现上述报错标识nginx只支持四层访问
#设定haproxy访问4层

mode tcp #四层访问
测试

#设置4层ip透传
root@webserver1/2 xia# 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"';
root@webserver1/2 xia# systemctl restart nginx.service
测试


九.Harproxy的四层负载
#部署mariadb数据库
root@webserver1/2 xia# dnf install mariadb-server mariadb -y
root@webserver1/2 xia# vim /etc/my.cnf.d/mariadb-server.cnf
mysqld
server_id=10 #设定数据库所在主机的id标识,在20上设定id为20
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
#建立远程登录用户并授权
root@webserver1/2 xia# systemctl start mariadb.service
root@webserver1/2 xia# mysql

测试
root@webserver2 xia# mysql -ulee -plee -h 192.168.0.20 #测试10时修改ip即可

#四层负载操作

检测端口

验证

backup参数


关闭10的mariadb并等待1分钟
root@webserver1 xia# systemctl stop mariadb
Administrator.DESKTOP-VJ307M3 ➤ mysql -ulee -plee -h172.25.254.100 -P 6663
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 1 "Operation not permitted" #标识haproxy 没有完成故障转换,需要等待
Administrator.DESKTOP-VJ307M3 ➤ mysql -ulee -plee -h172.25.254.100 -P 6663
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.5.27-MariaDB MariaDB Server
Copyright (c) 2000, 2017, 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 |
+-------------+
| 20 |
+-------------+
1 row in set (0.00 sec)
MariaDB (none)>
#还原故障主机等待片刻
root@webserver1 xia# systemctl start mariadb
Administrator.DESKTOP-VJ307M3 ➤ mysql -ulee -plee -h172.25.254.100 -P 6663
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.5.27-MariaDB MariaDB Server
Copyright (c) 2000, 2017, 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 |
+-------------+
| 10 |
+-------------+
1 row in set (0.00 sec)
十.自定义HAProxy 错误界面
1.sorryserver的设定
正常的所有服务器如果出现宕机,那么客户将被定向到指定的主机中,这个当业务主机出问题时被临时访问的主机叫做sorryserver
#在新主机中安装apache(可以用haproxy主机代替)
root@haproxy xia# dnf install httpd -y
root@haproxy xia# vim /etc/httpd/conf/httpd.conf

root@haproxy xia# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
root@haproxy xia# echo "夏润宇勇往直前" > /var/www/html/index.html
#配置sorryserver上线

验证

root@webserver1/2 xia# systemctl stop httpd

2.自定义错误页面
当所有主机包括sorryserver都宕机了,那么haproxy会提供一个默认访问的错误页面,这个错误页面跟报错代码有关,这个页面可以通过定义来机型设置
#出现的错误页面
root@webserver1/2 xia# systemctl stop httpd
root@haproxy xia# systemctl stop httpd
注意vim /errorpage/html/503.http
脚本里面的tcp要改成http

#所有后端web服务都宕机

root@haproxy \~# mkdir /errorpage/html/ -p
root@haproxy \~# vim /errorpage/html/503.http
root@haproxy \~# cat /errorpage/html/503.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html;charset=UTF-8
<html><body><h1>什么动物生气最闹</h1>
猴子!!
</body></html>

测试

3.从定向错误到指定网站

在浏览器测试
记得刷新


十一.Haproxy ACL访问控制
1.实验素材
#在浏览器或者curl主机中设定本地解析
在windows中设定解析
1.在Windows里面找到更多,在更多里面找到记事本并以管理员运行
2.点开打开c盘/Windows/System32/drivers/etc/hosts(记得打开全部文档)

3.写入自己想要解析的网域和IP

4.验证 可以ping bbs.timinglee.org是否成功
2.设定基础的haproxy实验配置

3.基础acl示例
#在访问的网址中,所有以.com 结尾的访问10,其他访问20

提示:前面我们写过listen webcluster 所以我们要注释掉。不然会冲突,无法启动
测试

#基于访问头部

测试

#base参数acl


测试

#acl禁止列表黑名单

测试

#禁止列表白名单

测试


十二.Haproxy全站加密
1.制作证书

2.全站加密

测试
root@haproxy xia# curl -v -k -L http://172.25.254.100
* Trying 172.25.254.100:80...
* Connected to 172.25.254.100 (172.25.254.100) port 80 (#0)
> GET / HTTP/1.1
> Host: 172.25.254.100
> User-Agent: curl/7.76.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< content-length: 0
< location: https://172.25.254.100/
< cache-control: no-cache
<
* Connection #0 to host 172.25.254.100 left intact
* Clear auth, redirects to port from 80 to 443Issue another request to this URL: 'https://172.25.254.100/'
* Trying 172.25.254.100:443...
* Connected to 172.25.254.100 (172.25.254.100) port 443 (#1)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Unknown (23):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
* subject: C=CQ; ST=cq; L=spb; O=timinglee; OU=linux; CN=www.timinglee.org; emailAddress=admin@timinglee.org
* start date: Feb 12 03:40:57 2026 GMT
* expire date: Feb 12 03:40:57 2027 GMT
* issuer: C=CQ; ST=cq; L=spb; O=timinglee; OU=linux; CN=www.timinglee.org; emailAddress=admin@timinglee.org
* SSL certificate verify result: self-signed certificate (18), continuing anyway.
* TLSv1.2 (OUT), TLS header, Unknown (23):
> GET / HTTP/1.1
> Host: 172.25.254.100
> User-Agent: curl/7.76.1
> Accept: */*
>
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Unknown (23):
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< date: Thu, 12 Feb 2026 03:45:36 GMT
< server: Apache/2.4.62 (Red Hat Enterprise Linux)
< last-modified: Tue, 10 Feb 2026 02:49:39 GMT
< etag: "1a-64a6f4e8db1ec"
< accept-ranges: bytes
< content-length: 26
< content-type: text/html; charset=UTF-8
<
webserver1 - 192.168.0.10
* Connection #1 to host 172.25.254.100 left intact
root@haproxy xia# curl -v -k -L http://172.25.254.100
* Trying 172.25.254.100:80...
* Connected to 172.25.254.100 (172.25.254.100) port 80 (#0)
> GET / HTTP/1.1
> Host: 172.25.254.100
> User-Agent: curl/7.76.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< content-length: 0
< location: https://172.25.254.100/
< cache-control: no-cache
<
* Connection #0 to host 172.25.254.100 left intact
* Clear auth, redirects to port from 80 to 443Issue another request to this URL: 'https://172.25.254.100/'
* Trying 172.25.254.100:443...
* Connected to 172.25.254.100 (172.25.254.100) port 443 (#1)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Unknown (23):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
* subject: C=CQ; ST=cq; L=spb; O=timinglee; OU=linux; CN=www.timinglee.org; emailAddress=admin@timinglee.org
* start date: Feb 12 03:40:57 2026 GMT
* expire date: Feb 12 03:40:57 2027 GMT
* issuer: C=CQ; ST=cq; L=spb; O=timinglee; OU=linux; CN=www.timinglee.org; emailAddress=admin@timinglee.org
* SSL certificate verify result: self-signed certificate (18), continuing anyway.
* TLSv1.2 (OUT), TLS header, Unknown (23):
> GET / HTTP/1.1
> Host: 172.25.254.100
> User-Agent: curl/7.76.1
> Accept: */*
>
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.2 (IN), TLS header, Unknown (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Unknown (23):
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< date: Thu, 12 Feb 2026 03:46:11 GMT
< server: Apache/2.4.62 (Red Hat Enterprise Linux)
< last-modified: Tue, 10 Feb 2026 02:50:38 GMT
< etag: "1a-64a6f520df5d8"
< accept-ranges: bytes
< content-length: 26
< content-type: text/html; charset=UTF-8
<
webserver2 - 192.168.0.20
* Connection #1 to host 172.25.254.100 left intact