目录
haproxy简介
HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。
负载均衡
负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展。
负载均衡的特点:
1. Web服务器的动态水平扩展-->对用户无感知
2.增加业务并发访问及处理能力-->解决单服务器瓶颈问题
3.节约公网IP地址-->降低IT支出成本
4.隐藏内部服务器IP-->提高内部服务器安全性
5.配置简单-->固定格式的配置文件
6.功能丰富-->支持四层和七层,支持动态下线主机
7.性能较强-->并发数万甚至数十万
四层负载均衡
1.通过ip+port决定负载均衡的去向。
2.对流量请求进行NAT处理,转发至后台服务器。
3.记录tcp、udp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。
4.支持四层的软件:
lvs:重量级四层负载均衡器。
ginx:轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块)
Haproxy:模拟四层转发。
七层负载均衡
1.通过虚拟ur|或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2.代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接,
3.支持7层代理的软件:
Nginx:基于http协议(nginx七层是通过proxy_pass)
Haproxy:七层代理,会话保持、标记、路径转移等。
四层负载与七层负载的区别
所谓的四层就是ISO参考模型中的第四层。四层负载均衡也称为四层交换机,它主要是通过分析 IP层及TCP/UDP层的流量实现的基于IP加端口的负载均衡。常见的基于四层的负载均衡器有 LVS、F5等。
以常见的TCP应用为例,负载均衡器在接收到第一个来自客户端的SYN 请求时,会通过设定的负载均衡算法选择一个最佳的后端服务器,同时将报文中目标 IP地址修改为后端服务器IP,然后直接转发给该后端服务器,这样一个负载均衡请求就完成了。 从这个过程来看,一个TCP连接是客户端和服务器直接建立的,而负载均衡器只不过完成了一个类似路由的转发动作。在某些负载均衡策略中,为保证后端服务器返回的报文可以正确传递给负载均衡器,在转发报文的同时可能还会对报文原来的源地址进行修改。
同理,七层负载均衡器也称为七层交换机,位于OSI的最高层(即应用层)此时负载均衡器支持多种应用协议,常见的有HTTP、FTP、SMIP等。七层负载均衡器可以根据报文内容,再配合负载均衡算法来选择后端服务器,因此也称为"内容交换器"。比如,对于Web服务器的负载均衡,七层负载均衡器不但可以根据"IP+端口"的方式进行负载分流。还可以根据网站的 URL、访问域名、浏览器类别、语言等决定负载均衡的策略。例如,有两台
Web服务器分别对应中英文两个网站,两个域名分别是A、B,要实现访问A域名时进入中文网站,访问B域名时进入英文网站,这在四层负载均衡器中几乎是无法实现的,而七层负载均衡可以根据客户端访问域名的不同选择对应的网页进行负载均衡处理。
常见的七层负载均衡器有HAproxy、Nginx等。
这里仍以常见的TCP应用为例,由于负载均衡器要获取到报文的内容,因此只能先代替后端服务器和客户端建立连接,接着才能收到客户端发送过来的报文内容,然后再根据该报文中特定字段加上负载均衡器中设置的负载均衡算法来决定最终选择的内部服务器。纵观整个过程,七层负载均衡器在这种情况下类似于一个代理服务器。
对比四层负载均衡和七层负载均衡运行的整个过程,可以看出,在七层负载均衡模式下, 负载均衡器与客户端及后端的服务器会分别建立一次 TCP连接,而在四层负载均衡模式下,仅建立一次TCP连接。由此可知,七层负载均衡对负载均衡设备的要求更高,而七层负载均衡的处理能力也必然低于四层模式的负载均衡。
工作模式
Haproxy的工作模式一般有两种:TCP模式和HTTP模式。
TCP模式:实例运行于TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查,只能以简单模式工作。通常为SSL、SSH、SMTP等应用使用。
HTTP模式:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝。适用于需要HTTP层处理的场景。
环境配置
dnf install haproxy -y ———— 安装软件包
功能 | IP |
haproxy | 172.25.254.100 |
RS1 | 172.25.254.10 |
RS2 | 172.25.254.20 |
server配置
[root@webserver2 ~]# vmset.sh eth0 172.25.254.20 webserver2.hyl.oeg
[root@webserver2 ~]# systemctlstop firewalld.service
[root@webserver2 ~]# yum install nginx -y
[root@webserver2 ~]# echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl restart nginx.service
[root@webserver ~]# vmset.sh eth0 172.25.254.10 webserver.hyl.oeg
[root@webserver ~]# systemctlstop firewalld.service
[root@webserver ~]# yum install nginx -y
[root@webserver ~]# echo webserver - 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver ~]# systemctl restart nginx.service
haproxy基本配置
haproxy的配置文件haproxy.cfg由两大部分组成:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段defaults:为frontend,backend,listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用
rpm -qc haproxy ————查询配置文件
rpm -qc haproxy
/etc/haproxy/haproxy.cfg ---- 配置文件
/etc/logrotate.d/haproxy ---- 记录日志的文件
/etc/sysconfig/haproxy --- 记录haproxy本身属性的文件
IP配置与测试
vmset.sh eth0 172.25.254.100 haproxy.hyl.org
systemctl stop firewalld.service[root@haproxy ~]# curl 172.25.254.10
webserver - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.20
webserver2 - 172.25.254.20
listen块
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
bind *:80
mode http
balance roundrobin
server webl 172.25.254.10:80
server web2 172.25.254.20:80
[root@haproxy ~]# systemctl restart haproxy.service[root@haproxy ~]# curl 172.25.254.100
webserver - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
多进程与线程
查看多线程
[root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(33040)---haproxy(33043)-+-{haproxy}(33044)
| |-{haproxy}(33045)
| `-{haproxy}(33046)[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
设置多线程
vim /etc/haproxy/haproxy.cf
systemctl restart haproxy.servic ————重启服务
再次查看多线程
root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(33058)-+-haproxy(33060)
| `-haproxy(33061)
再次打开多线程
vim /etc/haproxy/haproxy.cfg
systemctl restart haproxy.service————重启服务
[root@haproxy ~]# pstree -p | grep haproxy ————查看多进程
|-haproxy(33084)---haproxy(33086)-+-{haproxy}(33087)
| |-{haproxy}(33088)
| `-{haproxy}(33089)cat /proc/33142/status | grep -i thread————查看进程信息
注意:多线程和多进程的参数是互斥的
现将其注释掉就可以了
日志
vim /etc/haproxy/haproxy.cfg ——查看日志文件
编写文件
vim /etc/rsyslog.conf
haproxy-proxies常见的配置参数
proxies-defaults默认参数设置详解
mode http
# HAProxy 实例使用的连接协议
log global
# 指定日志地址和记录日志条目的
syslog/rsyslog 日志设备
#此处的 global 表示使用 global 配置段中设定的log 值。
option httplog
# 日志记录选项, httplog 表示记录与 HTTP会话相关的各种属性值
# 包括 HTTP 请求、会话状态、连接数、源地 址以及连接时间等
option dontlognull
#dontlognull 表示不记录空会话连接日志
option http-server-close
# 等待客户端完整 HTTP 请求的时间,此处为等待10s 。
option forwardfor except 127 .0.0.0/8
# 透传客户端真实 IP 至后端 web 服务器
# 在 apache 配置文件中加入 :<br>%{XForwarded-For}
# 后在 webserer 中看日志即可看到地址透传信息
option redispatch
# 当 server Id 对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option http-keep-alive
# 开启与客户端的会话保持
retries 3
# 连接后端服务器失败次数
timeout http-request 1000s
# 等待客户端请求完全被接收和处理的最长时间
timeout queue 60s
# 设置删除连接和客户端收到 503 或服务不可用等提示信息前的等待时间
timeout connect 120s
# 设置等待服务器连接成功的时间
timeout client 600s
# 设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间
timeout server 600s
# 设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间
timeout http-keep-alive 60s
#session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout check 10s
# 指定后端服务器健康检查的超时时间
maxconn 3000
default-server inter 1000 weight 3 指定后端服务器默认设置
proxies-frontend配置
bind [<address>]:<port_range>[,...][param*]
server配置参数
利用check、inter、fall、rise、weight进行后端健康检测
vim /etc/haproxy/haproxy.cfg
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
服务器 web1 的地址为 172.25.254.10:80,检查间隔为 2,故障阈值为 3,恢复阈值为 5,权重为 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1服务器 web2 的地址为 172.25.254.20:80,检查间隔、故障阈值、恢复阈值与 web1 相同,但其权重为 1。
[root@haproxy ~]# systemctl reload haproxy
root@haproxy ~]# systemctl restart haproxy.service
测试
[root@haproxy ~]# curl 172.25.254.100
webserver - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
backup --- sorryserver 的端囗
[root@haproxy ~]# yum install httpd -y ——haproxy安装httpd
root@haproxy ~]# vim /etc/httpd/conf/httpd.conf——修改端口
[root@haproxy ~]# echo sorry 下班了> /var/www/html/index.html
[root@haproxy ~]# systemctl enable --now httpd
编辑haproxy配置文件
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy
指定
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy
测试
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
网页重定向
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
测试
socat 工具
对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPv6、Socket文件等
范例:利用工具socat 对服务器动态权重调整
单线程
mode调整scoket的参数设置
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
systemctl restart haproxy.service
root@haproxy ~]# ll /var/lib/haproxy/stats
srw------- 1 root root 0 8月 9 11:14 /var/lib/haproxy/stats
[root@haproxy ~]# dnf install socat -y
[root@haproxy ~]# echo "help" | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats
更改权重
[root@haproxy ~]#echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
1 (initial 2)
[root@haproxy ~]# curl 172.25.254.100
webserver - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
echo "set weight webcluster/web1 2" | socat stdio /var/lib/haproxy/stats
echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
2 (initial 2)
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
查看状态
下线某台设备
echo 'disable server webcluster/web1' | socat stdio /var/lib/haproxy/stats
root@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
重启某台设备
echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/statsroot@haproxy ~]# for i in {1..10}; do curl 172.25.254.100; done
webserver2 - 172.25.254.20
webserver - 172.25.254.10
webserver - 172.25.254.10
webserver2 - 172.25.254.20
webserver - 172.25.254.10
webserver - 172.25.254.10
webserver - 172.25.254.10
webserver - 172.25.254.10
多线程
haproxy算法
静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速
度等,且无法实时修改权重( 只能为 0 和 1, 不支持其它值 ) ,只能靠重启 HAProxy 生效。
static-rr:基于权重的轮询调度
不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
不支持端服务器慢启动
其后端主机数量没有限制,相当于LVS中的 wrr
first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
动态算法
动态算法:
基于后端服务器状态进行调度适当调整,
新请求将优先调度至当前负载较低的服务器
权重可以在haproxy运行时动态调整无需重启
支持对deal server 权重的动态调整
roundrobin 为默认调度算法,此算法使用广泛、
roundrobin
动态调整权重
root@haproxy ~]# echo "set weight webserver_80/webserver1 2" | socat stdio
/var/lib/haproxy/haproxy.sock
lesatccon
其他算法
其它算法即可作为静态算法,又可以通过选项成为动态算法
Source Hash算法
源地址hash,基于用户源地址hash并将请求发送到后端服务器,后续同一个源地址请求将被转发到同一台后端服务器。此方式当后端服务器数量发生变化时,会导致很多用户的请求转发到新的后端服务器,默认为静止方式,但是可以通过hash-type支持选项更改这一算法
map-base 取模法
对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请求转发至对应的后端服务器。此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度。缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变,hash-type 指定的默认值为此算法。
一致性 hash
一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n ,该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
uri算法
基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后根据最终结果将请求转发到后端指定服务器 ,适用于后端是缓存服务器场景。默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash。
url-param算法
url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server 。如果无没key,将按roundrobin算法。
hrd
针对用户每个http头部(header)请求中的指定信息做hash,此处由 name 指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。
算法总结
static-rr--------->tcp/http 静态
first------------->tcp/http 静态
roundrobin-------->tcp/http 动态
leastconn--------->tcp/http 动态
random------------>tcp/http 动态
source------------>tcp/http
Uri--------------->http
url_param--------->http 取决于hash_type是否consistent
hdr--------------->http
rdp-cookie-------->tcpfirst #使用较少
static-rr #做了session共享的web集群
roundrobin
random
leastconn #数据库
source #基于客户端公网IP的会话保持
Uri--------------->http #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯
url_param--------->http
hdr #基于客户端请求报文头部做下一步处理
rdp-cookie #很少使用
状态页
状态页配置项
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 中的管理功能
启用状态页
listen stats
bind :9009
stats enable
#stats hide-version
stats uri /haproxy-status
stats realm HAPorxy\ Stats\ Page
stats auth haadmin:123456
stats auth admin:123456
#stats refresh 30s
#stats admin if TRUE
登录状态页
pid = 3698 (process #2, nbproc = 2, nbthread = 2)
#pid为当前pid号,process为当前进程号,nbproc和nbthread为一共多少进程和每个进程多少个线程
uptime = 0d 0h00m08s #启动了多长时间
system limits: memmax = unlimited; ulimit-n = 131124 #系统资源限制:内存/最大打开文件数/
maxsock = 131124; maxconn = 65536; maxpipes = 0 #最大socket连接数/单进程最大连接数/最大管道数maxpipes
current conns = 1; current pipes = 0/0;
conn rate = 1/sec #当前连接数/当前管道数/当前连接速率 (取决于访问量: 访问量越大,值越大)
Running tasks: 1/9;
idle = 100 % #运行的任务/当前空闲率
active UP:#在线服务器backup UP:#标记为backup的服务器
active UP, going down:#监测未通过正在进入down过程
backup UP, going down:#备份服务器正在进入down过程
active DOWN, going up:#down的服务器正在进入up过程
backup DOWN, going up:#备份服务器正在进入up过程
active or backup DOWN:#在线的服务器或者是backup的服务器已经转换成了down状态
not checked:#标记为不监测的服务器
active or backup DOWN for maintenance (MAINT) #active或者backup服务器 手动下线的
active or backup SOFT STOPPED for maintenance #active或者backup被认为软下线(人为将weight改成0)
vim /etc/haproxy/haproxy.cfg
浏览器访问测试
haproxy的高级功能及配置
cookie
cookie是用来让服务端辨识客户端的一种机制;而对于haproxy来讲,基于cookie来做会话保持的原理就是通过对后端服务器响应报文中的cookie信息中添加(或覆盖的方式)一个键值对,在客户端下次访问时,检查对应cookie首部的信息,从而让haproxy能够判断把该请求调度在那个后端服务器上;通常我们会在server上设置一个cookie的值,在listen或backend中设置一个cookie的键,明确说明以怎样的方式设置cookie的键;通过listen或backend中设置的cookie的键结合server后面的cookie的值组成的cookie信息,从而实现不同的cookie信息调度到不同的server上去
IP透传
七层
web 服务器中需要记录客户端的真实 IP 地址,用于做访问统计、安全防护、行为分析、区域排行等场景。
server
[root@webserver ~]# systemctl stop nginx.service
[root@webserver ~]# dnf install httppd
[root@webserver ~]# echo webserver - 172.25.254.10 > /var/www/html/index.html [root@webserver ~]# systemctl enable --now httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
测试
[root@haproxy ~]# curl 172.25.254.100 webserver - 172.25.254.10
编辑server1的日志文件
[root@webserver1 ~]# vim /etc/httpd/conf/httpd.conf
[root@webserver1 ~]# systemctl restart httpd
[root@webserver1 ~]# cat /etc/httpd/logs/access_log
172.25.254.100 - - [10/Aug/2024:14:11:50 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.76.1"
httpd编辑
[root@webserver ~]# systemctl restart httpd
测试
编辑nginx文件
[root@webserver2 ~]# vim /etc/nginx/nginx.conf
[root@webserver2 ~]# systemctl restart nginx.service
测试
[root@haproxy ~]# curl 172.25.254.100 webserver2 - 172.25.254.20
[root@haproxy ~]# curl 172.25.254.100 webserver - 172.25.254.10
四层
改为tcp四层、
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
修改nginx文件
[root@webserver2 ~]# vim /etc/nginx/nginx.conf
[root@webserver2 ~]# systemctl restart nginx.service
编辑server2的配置文件
[root@webserver2 ~]# vim /etc/nginx/nginx.conf
[root@webserver2 ~]# systemctl restart nginx.service
ACL
用acl来定义或声明一个acl
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 名称 匹配规范 匹配模式 具体操作符 操作对象类型
[root@haproxy conf.d]# vim /etc/haproxy/haproxy.cfg
[root@haproxy conf.d]# systemctl restart haproxy.service
以域名.com为结尾的访问控制
基于字符的访问控制
示例:
vim/etc/haproxy/haproxy.cfg
frontend webcluster
bind *:80
mode http
acl ctrl_ip src 172.25.254.1 172.25.254.20 192.168.0.0/24 -----符合条件的访问RS1
use_backend webcluster-host if ctrl_ip
default_backend default-host
backend webcluster-host
mode http
server web1 172.25.254.10:80 check inter 2 fall 2 rise 5
backend default-host
mode http
server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
测试:
[root@werserver2 ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl www.test.com
webserver2 - 172.25.254.20
frontend webcluster
bind *:80
mode http
acl ctrl_ip src 172.25.254.1 172.25.254.20 192.168.0.0/24
http-request deny if ctrl_ip ------ 符合条件的拒绝访问
default_backend default-host
backend webcluster-host
mode http
server web1 172.25.254.10:80 check inter 2 fall 2 rise 5
backend default-host
mode http
server web2 172.25.254.20:80 check inter 2 fall 2 rise 5测试:
[root@werserver2 ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@werserver2 ~]# curl 172.25.254.100
<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
</body></html>
基于浏览器的访问控制
示例:
vim/etc/haproxy/haproxy.cfg
frontend webcluster
bind *:80
mode http
acl badwebrowers hdr_sub(User-Agent) -i wget
http-request deny if badwebrowers
default_backend default-host
backend webcluster-host
mode http
server web1 172.25.254.10:80 check inter 2 fall 2 rise 5
backend default-host
mode http
server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
基于文件后缀名实现动静分离
RS主机上:
[root@webserver1 ~]# dnf install php -y
[root@webserver1 ~]# systemctl restart nginx.service
[root@webserver1 ~]#
[root@webserver1 ~]# vim /usr/share/nginx/html/index.php
<?php
phpinfo();
?>
查看是否能访问到php
自定义haproxy的错误界面
两台web服务器都挂掉
root@werserver1 ~]# systemctl stop nginx.service
[root@werserver2 ~]# systemctl stop nginx.service
重定向错误文件
haproxy的四层负载
[root@haproxy ~]#yum install mariadb-server -y
[root@webserver ~]# yum install mariadb-server -y
[root@webserver2 ~]# yum install mariadb-server -y
[root@webserver ~]# vim /etc/my.cnf.d/mariadb-server.cnf
登录MySQL
#在server1上添加可远程登录的用户
MariaDB [(none)]> CREATE USER zf@'%' identified by 'zf';
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> GRANT ALL ON *.* TO zf@'%';
Query OK, 0 rows affected (0.001 sec)
#在server2上添加可远程登录的用户
MariaDB [(none)]> CREATE USER zf@'%' identified by 'zf';
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> GRANT ALL ON *.* TO zf@'%';
Query OK, 0 rows affected (0.001 sec)
#测试
[root@haproxy ~]# mysql -uzf -p -h 172.25.254.10
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
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)]> quit
Bye
使用haproxy实现负载
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
测试
haproxy中https实现
haproxy 可以实现 https 的证书安全 , 从用户到 haproxy 为 https, 从 haproxy 到后端服务器用 http 通信,但基于性能考虑 , 生产中证书都是在后端服务器比如 nginx 上实现
#配置HAProxy支持https协议,支持ssl会话;
bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
#指令 crt 后证书文件为PEM格式,需要同时包含证书和所有私钥
cat demo.key demo.crt > demo.pem
#把80端口的请求重向定443
bind *:80
redirect scheme https if !{ ssl_fc }
证书制作
[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
[root@haproxy ~]# ls /etc/haproxy/certs/ timinglee.org.crt timinglee.org.key
[root@haproxy ~]# cat /etc/haproxy/certs/timinglee.org.key /etc/haproxy/certs/timinglee.org.crt > /etc/haproxy/certs/timinglee.pem
[root@haproxy ~]# cat /etc/haproxy/certs/timinglee.pem
https 配置示例
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
测试
redirect scheme https if !{ ssl_fc } ——全站加密