haproxy详细介绍

目录

haproxy简介

负载均衡

负载均衡的特点:

四层负载均衡

七层负载均衡

四层负载与七层负载的区别

工作模式

环境配置

server配置

haproxy基本配置

IP配置与测试

listen块

多进程与线程

日志

haproxy-proxies常见的配置参数

proxies-frontend配置

server配置参数

backup --- sorryserver 的端囗

socat 工具

单线程

多线程

haproxy算法

静态算法

动态算法

其他算法

算法总结

状态页

haproxy的高级功能及配置

cookie

IP透传

七层

四层

ACL

自定义haproxy的错误界面

 haproxy的四层负载

haproxy中https实现

证书制作

https 配置示例


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
haproxy172.25.254.100
RS1172.25.254.10
RS2172.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/stats

root@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-------->tcp

first #使用较少
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 } ——全站加密

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值