haproxy七层部署

目录

环境设置

如果10和20服务器出现维护或者断开

定向

maxconn指令

haproxy状态页

socat工具

静态算法

static-rr算法

first算法

动态算法

roundrobin算法

leastconn最小链接

其他算法

source算法

source 的map-base法 取模法 静态

hash环

url算法

url_param

hdr算法

各个算法的适用场景

基于cookie值的会话保持

ip透传

七层透传

四层透传

ACL访问定向

hdr_dom

hdr_end以什么结尾的

hdr_beg以什么开头

base

base_bge 正则表达式

path

ACL的组合调用方式

!使用

||使用

并且

acl高级配置

基于域名的访问

基于源ip或者网段

匹配浏览器类型

设置静态的和设置动态的

haproxy怎么去设定错误界面

haproxy四层负载,用于数据库

https实现

全站加密

可以不在/etc/haproxy/haproxy.cfg


环境设置

三台主机,一台haproxy主机172.25.254.100,两台server主机分别是172.25.254.10 172.25.254.20

yum install nginx -y

在两台server主机中下载nginx

echo server1 - 172.25.254.10 > /usr/share/nginx/html/index.html

echo server2 - 172.25.254.20 > /usr/share/bginx/html/index.html

查看是否写入

在haproxy中

dnf install haproxy -y

下载haproxy

vim  /etc/haproxy/haproxy.cfg

进入配置文件

开启两个进程

设置那个指定的进程用指定的cup

多线程设定,多线程和多进程是不可以同时使用的,会报错

重启服务

pstree -p | grep haproxy查看多进程

vim /etc/haproxy/haproxy.cfg

进入配置文件

后端调用的东西

bing设置监听的端口,所有的80端口

mode http 走哪个协议

balance roundrobin  使用的算法

写入两个server主机的地址

保存退出

测试成功

更改haproxy日志目录

在haproxy的配置文件中,我们看见他的日志类型是local2

vim /etc/haproxy 

进入配置文件

打开udp

设置日志输出到/var/log/haproxy.log

如果10和20服务器出现维护或者断开

我想让他在服务端显示sorry 下班啦

vim /etc/httpd/conf/httpd.conf

改端口号为8080,backup ----sorryserver的端口号

systemctl enable --now httpd

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

vim /etc/haproxy/haproxy.conf

sever web_sorry 172.25.254.100:8080 backup

重启100haproxy

systemctl restart haproxy

关闭10和20的server

systemctl stop nginx.service

然后再终端进行测试

在10和20开启nginx

 systemctl start  nginx.service

让10下线维护disable

重启服务

systemctl restart haproxy

进行测试,测试全是20

定向

你访问的80时将你重定向到百度上,下面几条注释掉

重启测试

systemctl restart haproxy

访问100会到百度

maxconn指令

能承受的最大并接数量,能够同时解决的连接数,企业中别设置仅供实验

测试在10和20都去进行访问,看看情况,就是让两个机子无限访问,达到最大连接并发,

超过最大链接直接sorry下班了

haproxy状态页

进入配置文件

vim /etc/haproxy/haproxy.cfg

状态页的配置

stats auth 123:123设置访问是的登录用户和密码

在网页输入172.25.254.100:8888/status

设置刷新的时间1s

一秒一次刷新

关掉10的服务试一下

变化如下

socat工具

解决改一处影响所有集群,不合适,所以有热修改

动态调整haproxy里的参数

把这条给权限的命令加上去

看一下权限srw

ll /var/lib/haproxy/stats

下载工具在100上

dnf install socat -y

查看帮助

echo "help"  |  socat stdio /var/lib/haproxy/stats

查看haproxy的状态

echo "show info" |  socat stdio /var/lib/haproxy/stats

查看server的状态

echo "show servers state"  | socat stdio /var/lib/haproxy/stat

查看权重

echo get weight webcluster-host/web1  | socat stdio /var/lib/haproxy/stats

更改权重,当前权重是1配置文件是2
echo "set weight webcluster-host/web1  2 " | socat stdio /var/lib/haproxy/stats

让一台server主机下线

echo "disable server webcluster-host/web1" | socat stdio /var/lib/haproxy/stats

测试

让一个server启动

echo "enable server webcluster-host/web1" | socat stdio /var/lib/haproxy/stats

测试

热处理多进程

需要生成两个进程文件

重启

systemctl restart haproxy

查看是否可以查看

设备重启热处理就全部消失

haproxy算法

HAProxy通过固定参数 balance 指明对后端服务器的调度算法balance参数可以配置在listen或backend选项中。

HAProxy的调度算法分为静态和动态调度法

有些算法可以根据参数在静态和动态算法中相互转换。

静态算法

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

不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)

不支持端服务器慢启动

慢启动:指的是服务端维护完后,先给主机一部分服务,然后再给一部分,不是一下全给他,小心刚维护完挂球啦

其后端主机数量没有限制,相当于LVS中的 wrr

static-rr算法

现将之前改的多进程关掉

重启

测试,不可以热修改

first算法

根据服务器在列表中的位置,自上而下进行调度

其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务

其会忽略服务器的权重设置

不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效

也不支持热修改

测试将他可经过的最大线程为1

死循环测试

发现10满啦才走20,10多20少

动态算法

基于后端服务器状态进行调度适当调整

新请求将优先调度至当前负载较低的服务器

权重可以在haproxy运行时动态调整无需重启

roundrobin算法

基于权重的轮询动态调度算法

支持权重的运行时调整,不同于lvs中的rr轮训模式

HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数)

其每个后端backend中最多支持4095个realserver支持对real server

权重动态调整,roundrobin为默认调度算法,此算法使用广泛

改配置

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

给10和20还有终端这条代码,看看测试效果

测试

轮询是往负载小的且权重高的,如果权重高的负载过大,会往负载小的上输入,谁闲得慌给谁

支持热修改

leastconn最小链接

leastconn加权的最少连接的动态

支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)

比较适合长连接的场景使用,比如:MySQL等场景

vim /etc/haproxy/haproxy.cfg

谁少先给谁不太去管权重

其他算法

其它算法即可作为静态算法,又可以通过选项成为动态算法

source算法

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。

此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器

默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash

改配置

vim /etc/haproxy/haproxy.cfg

测试,一直在一个server,走20都是20

要不就一直是10

source 的map-base法 取模法 静态

map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请求转发至对应的后端服务器。

此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度

缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变,hash-type 指定的默认值为此算法

算的多少就调用谁

如果更改权重可能会导致回话断开

所谓取模运算,就是计算两个数相除之后的余数,10%7=3,7%4=3map-based算法:

基于权重取模,hash(source_ip)%所有后端服务器相加的总权重

source hash一致性动态

一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动hash(o)mod n

该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动、

hash环

后端服务器的ip%2的32次方落到环上范围是0到2的32次方- 1

计算完之后落到hash环上例如3台服务器为红色圈

对客户端的ip%2的32次方落到环上

然后进行顺时针找最近的服务器

保证原来的链接就在一个服务器上

url算法

基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后根据最终结果将请求转发到后端指定服务器

适用于后端是缓存服务器场景

默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash

此算法基于应用层,所以只支持 mode http,不支持mode tcp

<scheme>://<user>:<password>@<host>:<prot>/<path>;<params>?<query> #<frag>

<scheme>是前面的协议

<user>:<password>用户和密码

<host>

<prot>

<path>

<params>

<query>

实例

在10中

[root@sever1 ~]# echo 172.25.254.10 - index1.html > /usr/share/nginx/html/index1.html 
[root@sever1 ~]# echo 172.25.254.10 - index2.html > /usr/share/nginx/html/index2.html 
[root@sever1 ~]# echo 172.25.254.10 - index3.html > /usr/share/nginx/html/index3.html 

在20中

[root@sever2 ~]# echo 172.25.254.20 - index1.html > /usr/share/nginx/html/index1.html
[root@sever2 ~]# echo 172.25.254.20 - index2.html > /usr/share/nginx/html/index2.html
[root@sever2 ~]# echo 172.25.254.20 - index3.html > /usr/share/nginx/html/index3.html

在100中

vim /etc/haproxy/haproxy.cfg

将算法更改为uri以及加上hash一致性

systemctl restart haproxy

测试效果只要后面不变,服务器就不变

url_param

url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个realserver

如果无没key,将按roundrobin算法

vim /etc/haproxy/haproxy.cfg

改为url_param,也就是对name和userid后的数字进行hash运算

systemctl restart haproxy

测试改变数字访问的主机也会变,权限也会影响

hdr算法

针对用户每个http头部(header)请求中的指定信息做hash

此处由 name 指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。

一致性hash

vim /etc/haproxy/haproxy.cfg

写入算法

-VA可以伪装成指定用什么浏览器

各个算法的适用场景

first

static-rr

#使用较少

#做了session共享的web集群

roundrobin   普遍使用

Teastconn

#数据库

source

#基于客户端公网IP的会话保持

UFi--------->htt!

#缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯

ur] param--------->http

#可以实现session保持

hdr

#基于客户端请求报文头部做下一步处理

基于cookie值的会话保持

cookie

cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载(因为每次都要验证cookie值,还要给客户发送cookie值)

目前此模式使用较少,已经被session共享服务器代替

进入配置文件

不支持tcp只支持http

开始配置

测试,验证一下下次的cookie值如果还是一样的接着让你走一个server

-b指定cookie值

ip透传

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

ip透传四层

这是透传的参数,先关掉看现象

回环接口不做透传

访问100,流量到20上

进入20的访问日志

cat /var/log/nginx/access.log

只能看到是100访问的,看不到客户端地址

七层透传

开始配置透传

我们在10主机去做Apache,下载http服务,关闭nginx服务

dnf install httpd -y

给一个默认测试页

启动httpd

systemctl enable --now httpd

去终端进行访问一下

到10Apache里面看日志

cat /etc/httpd/logs/access_log

并没有看到透传,所以apache里默认没有

我们来设定一下

要将这个加到apache的日志里面,主配置文件

vim /etc/httpd/conf/httpd.conf

找到日志行加进去

表示混合形式,就是错误日志以及访问日志都会在这里控制

重启

systemctl restart httpd

测试,透过来了

从这里看我们做的是7层透传

vim /etc/haproxy/haproxy.cfg

看看nginx

cat /var/log/nginx/access.log

也成功

四层透传

apache做不了四层穿透所以不管他

进入配置文件

vim /etc/haproxy/haproxy.cfg

加上代理后在测试就访问不了啦

所以要设置他们走代理

在nginx里面加

vim /etc/nginx/nginx.conf

这个加完依旧是透传不过来的

还需要在配置文件中添加,采集日志的内种模块里添加

重启

systemctl restart nginx

测试

看日志内容

cat /var/log/nginx/access.log

有啦透传过来啦

ACL访问定向

ACL

访问控制列表ACL,Access ControlLists)

是一种基于包过滤的访问控制技术

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

hdr指定信息

这条指令去看一看里面可以指定的信息

curl -v 172.25.254.100

实现一下

hdr_dom

只可以加到frontend和listen

vim /etc/haproxy/haproxy.cfg

注释掉之前的实验

添加acl规则,指定的是域名匹配

重启

systemctl restart haproxy

在windows中进行解析

C:\Windows\System32\drivers\etc\host

hdr_end以什么结尾的

我们以.org结尾

重启

systemctl restart haproxy

去win解析

测试,在测试之前将自己之间做的ip透传20的代理服务关掉

进入配置文件

vim /etc/nginx/nginx.conf

重启

systemctl restart nginx

.org结尾的访问的是10

别的结尾的访问的是20

hdr_beg以什么开头

设置以bbs开头

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

解析

测试

bbs开头的走10

不是bbs的走20

base

返回第一个主机头和请求的路径部分的连接,该请求从主机名开始,并在问号之前结束,对虚拟主机有用

就是这部分内容

base_sub

这一大溜子的域名只要匹配到bbs就算成功

在名字里或者在文件路径出现bbs就可以

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

测试

当访问解析过的地址中包含bbs的就可以走10

如果不包含bbs的就会走20

在10里创建一个目录看可以直接访问嘛

再去访问,只要有bbs就可以

base_bge 正则表达式

比如以什么开头以什么结尾

改配置,以lee结尾

重启

systemctl restart haproxy

以什么结尾的测试

不是以lee结尾

以lee结尾

path

提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

测试,就是说 他只看/后面的东西,别的不看

ACL的组合调用方式

与:隐式(默认)使用

或:使用“or”或“| |"表示

否定:使用"!”表示

!使用

重启

systemctl restart haproxy

我们在20中也写入

如果是就访问20

如果不是就访问10

不符合的

||使用

重启

systemctl restart haproxy

测试有bbs的是10有lee的也是10

既不是也不是

并且

中间啥都不写就表示并且

既要test也要domain

重启

systemctl restart haproxy

测试

头尾都是bbs

有一处不是就不行就走20

acl高级配置

基于域名的访问

必须要有解析

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

测试如果是指定的这个域名走10

如果不是走20

基于源ip或者网段

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

符合条件的10不符合的20

在ip为1的上面

在ip为20上的

在不符合条件的100上

也可以拒绝那些ip或者网段去访问

写配置文件

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

符合条件的都拒绝掉啦20

不符合条件的10

匹配浏览器类型

匹配浏览器类型

配置文件

重启

systemctl restart haproxy

允许的可以访问不允许的访问不了

不让访问

换个浏览器测试,直接访问,就可以

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

在10中

php是动态页面

dnf install php -y

在httpd主机重启一下就可以加载php

在配置文件中写的

vim /var/www/html/index.php

php的测试页

重启

systemctl restart httpd

去浏览器访问一下172.25.254.10试一下

可以访问

设置静态的和设置动态的

重启

systemctl restart haproxy

动态

静态会访问到20

就实现啦动静分离

基于访问路径实现动静分离

文件要提前建立好、

在Nginx

mkdir /usr/share/nginx/html/static -p

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

在httpd10,在浏览器输入172.25.254.10/php/就会访问到php

zai100

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

测试

20处理静态页面

完成基于路径的动态分离

haproxy怎么去设定错误界面

假设两台服务器都炸了,访问不到啦,我想让他看见啥

过滤一下出现503的页面在哪里

用到指令errorfile ,就是当你出现错误代码503的时候我带你去看下面这个路径

第一种直接复制人家的配置文件

cp /usr/share/haproxy/504.http /etc/haproxy/errorpage

第二种,自己创建并写入内容,文件内容要注意写错服务起不来

进入编辑

vim /etc/haproxy/errorpage

只能写到

重启

systemctl restart haproxy

测试

我访问不了啦,我可以将他重定向到别的地方

重定向到百度

vim /etc/haproxy/haproxy.cfg

重启

systemctl restart haproxy

会访问到百度

haproxy四层负载,用于数据库

数据库10和20都装数据库,记住不要在100装

dnf install mariadb-server -y

改文件

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

启动

systemctl start mariadb

进入数据库1

进入数据库2

启动

systemctl start mariadb

进入mysql

添加可以远程登录的用户

1

2

查看端口是否开启

100

可以远程登录

ha配置

重启

自动连接到20啦20设置的为1

就可以轮询啦

https实现

制作证书和密钥

首先建立目录秘钥放这里

mkdir -p /etc/haproxy/certs

生成秘钥

openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/qiqi.org.key -x509 -days 365 -out /etc/haproxy/certs/qiqi.org.crt

cat /etc/haproxy/certs/qiqi.org.key /etc/haproxy/certs/qiqi.org.crt > /etc/haproxy/certs/qiqi.pem

进入ha

重启

systemctl restart haproxy

看443开腊梅

全站加密

你测试的时候把http后的s删掉他也会自动加载

重启

systemctl restart haproxy

可以不在/etc/haproxy/haproxy.cfg

可以再他的子配置文件里写

进入这个文件查看他的子配置文件是啥

在子配置文件里面写一个就可以

把主配置文件里的东西都注释掉

在子配置文件里面写一个状态页

重启

打开过启动脚本的内个文件,就是查看子配置文件在那的文件就需要

systemctl daemon-reload

一下:

访问一下测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值