目录
环境设置
三台主机,一台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
一下:
访问一下测试