haproxy 7000字配图超详细教程 从小白到入门

news2024/11/15 19:59:04

简介:HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy的社区非常活跃,版本更新快速,HAProxy具备媲美商用负载均衡器的性能和稳定性。因为HAProxy的上述优点,它当前不仅仅是免费负载均衡软件的首选,更几乎成为了唯一选择。

下面我将从3个方面来讲解从而帮助大家快速上手玩转haproxy

1.了解haproxy

1.1.环境配置

主机名IP服务
client172.25.254.10客户端
haproxy

172.25.254.100

192.168.132.100

haproxy服务端
server1192.168.132.101web服务器 httpd
server2192.168.132.102web服务器 nginx

1.2 了解haproxy配置文件

yum install haproxy
cd /etc/haproxy
#查看我们的配置文件
vim   haproxy.cfg

 

1.2.1 global 全局配置

 

除去上面我们还可以有以下几种

nbproc N开启的haproxy worker 进程数,默认为1个
nbthread 1指定每个haproxy进程开启的线程数,默认一个进程一个线程
cpu-map A B绑定进程指定cpu,将A进程绑定到Bcpu上
log IP local2 info 定义全局的syslog服务器但日志服务器需要开启udp协议最多定义2个
maxss|conn N每个进程ssl最大连接数,用于hproxy配置了证书的场景下
maxconnrate N每个进程每秒创建的最大连接数量
spread-checks N后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认值0
pidfile指定pid文件路径

1.2.2 默认配置

所有“listen”和“backend”部分(如果在它们的块中没有指定)都将使用的常见默认值

1.2.3 配置文件区

pstree -p | grep haproxy
#查看我们的进程前提是服务开启

2. 基础配置

2.1 简单来一段基础配置

check 开机检测异常情况

inter    健康状态检查间隔时间,默认为2s

fall        后端服务器从线上转为线下的连续监测失败次数,默认为3次

rise        后端服务器从线下恢复上线的连续监测有效次数,默认为2次

weight       权重,权重越大使用越多

backup  后端服务器标记为备份状态,只有主非备份主机死亡时启用

disable  将后端服务器标记为不可用

redirect prefix/redir  将请求临时302重定向到其他URL只适用于http服务

2.2 采用listen"合体"写法  

 2.3 来尝试一下标红功能

首先我们在server1上下载一个nginx并写入内容外加改端口号避免和我们的httpd冲突

vim /etc/nginx/nginx.conf

由于web1 和web2都被打上了不可用标签所以当我们访问就会被带到百度

这个时候我们就会访问到我们101上的8080端口

3 算法

很多时候我们要处理的情况很复杂单靠上面的配置我们很难完成我们想要的效果,于是乎就出现了各种各样的算法

3.1 静态算法

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。

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

不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
不支持端服务器慢启动
其后端主机数量没有限制,相当于LVS中的 wrr

3.1.2 first

根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效

3.2 动态算法

基于后端服务器状态进行调度适当调整,
新请求将优先调度至当前负载较低的服务器
权重可以在haproxy运行时动态调整无需重启

3.2.1 roundrobin

1.基于权重的轮询动态调度算法
2.支持权重的运行时调整,不同于Ivs中的rr轮训模式

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

4.其每个后端backend中最多支持4095个real server,
5.支持对real server权重动态调整,
6.roundrobin为默认调度算法,此算法使用广泛

会被权重影响可以理解为static-rr的升级版

3.2.2 leastconn

leastconn加权的最少连接的动态
支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客
户端连接)
比较适合长连接的场景使用,比如:MySQL等场景:

balance leastconn

3.3 其他算法

3.3.1 source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同-个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash

3.3.1.1 map-base 取模法

map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请求转发至对应的后端服务器。
此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变,hash-type 指定的默认值为此算法

balance source

3.3.1.2 一致性hash

一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动
该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动

balance source

hash-type consistent

3.3.2 uri

基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后
根据最终结果将请求转发到后端指定服务器
适用于后端是缓存服务器场景
默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash
注意:此算法基于应用层,所以只支持 mode http,不支持 mode tcp

uri就类似一个独一无二的身份标识

url就是每次我们输入网址访问某个网站时,浏览器上输入的那一行内容。比如:http://baidu.com这是一个url,每个链接地址是一个url。

  • URI = Uniform Resource Identifier 统一资源标志符
  • URL = Uniform Resource Locator 统一资源定位符

具体关于url uri的关系本文不做详细解答

balance uri

3.3.3 url_param

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

balance uri

hash-type consistent

后续访问不在变换内容

3.3.4 hdr

3.3.4.1 hdr取模法

针对用户每个http头部(header)请求中的指定信息做hash,此处由 name 指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。

balance hdr(User-Agent)

3.3.4.2 hdr一致性hash

balance hdr(User-Agent)

hash-type consistent

curl -v 

curl -vA s手动更改user-agent

4  高级功能及配置

4.1 基于cookie的会话保持

cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少,已经被session共享服务器代替
注意:不支持 tcp mode,使用 http mode

cookie namerewrite insertprefixindirect i[ nocache i postonly]preserve ][httponly ][secure ][ domain ]*[ maxidle <idle> ][ maxlife ]
name:#cookie的key名称,用于实现持久连接

insert:#插入新的cookie,默认不插入cookie
indirect:#如果客户端已经有cookie,则不会再发送cookie信息

nocache:#当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,#因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器

4.2 haproxy状态页

通过web界面,显示当前HAProxy的运行状态

stats enable#基于默认的参数启用stats page
stats hide-version#将状态页中haproxy版本隐藏
stats refresh <delay>#设定自动刷新时间间隔,默认不自动刷新
stats uri <prefix>#自定义stats page uri,默认值:/haproxy?statsstats auth <user>:<passwd>#认证时的账号和密码,可定义多个用户,每行指定一个用户

#默认:no authentication
stats admin{ifunless }<cond> #启用stats page中的管理功能

 

4.3 ip 透传

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

4.3.1 layer7

七层:协议+内容交换

七层负载均衡服务器起了一个反向代理服务器的作用,服务器建立一次TCP连接要三次握手,而client要访问Web Server要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的 Web Server,然后通过三次握手与此台Web Server建立TCP连接,然后Web Server把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用,七层代理需要和Client和后端服务器分别建立连接

option forwardfor [except <network>][ header <name>][ if-none ]
[except<network>]:请求报请来自此处指定的网络时不予添加此首部,如haproxy自身所在网络
[header <name>]:使用自定义的首部名称,而非“x-Forwarded-For",示例:X-clien
[if-none ]如果没有首部才添加首部,如果有使用默认值

正常情况下的日志

在由haproxy发往后端主机的请求报文中添加"X-Forwarded-For"首部,其值为前端客户端的地址;用于向后端主发送真实的客户端IP

4.3.2 layer4

四层:IP+PORT转发
在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据,而四层负载自身不参与建立连接,而和LVS不同,haproxy是伪四层负载均衡,因为haproxy需要分别和前端客户端及后端服务器建立连接

4.4 ACL

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

4.4.1 acl的选项配置

acl  <aclname> <criterion>          [flags]        [operator]        [<value>]

acl       名称          匹配规范         匹配模式     具体操作符    操作对象类型

#ACL名称,可以使用大字母A-Z、小写字母a-z、数字0-9、冒号:、点.、中横线和下划线,并且严格区分大小写

 #定义ACL匹配规范,即:判断条件

hdr string,提取在一个HTTP请求报文的首部

hdr([<name>[,<occ>]]):完全匹配字符串,header的指定信息,<occ>表示在多值中使用的值的出现次数
hdr_beg([<name>[,<occ>]]):前缀匹配,header中指定匹配内容的begin

hdr_end([<name>[,<occ>]]):后缀匹配,header中指定匹配内容end

hdr_dom([<name>[,<oCC>]]):域匹配,header中的domainname(host)

hdr_dir([<name>[,<0CC>]]):路径匹配,header的uri路径
hdr_len([<name>[,<occ>]]):长度匹配,header的长度匹配
hdr_reg([<name>[,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub([<name>[,<occ>]]):子串匹配,header中的uri模糊匹配 模糊匹配c 洪湖报文中a/b/c
也会匹配

base 同理

base :string
#返回第一个主机头和请求的路径部分的连接,该请求从主机名开始,并在问号之前结束,对虚拟主机有用<scheme>://<user>:<password>@#<host>:<port>/<path>;<params>#?<query>#<frag>

path 同理

path :string
#提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)
<scheme>://<user>:<password>@<host>:<port>#/<path>;<params>#?<query>#<frag>

url 同理

url :string
#提取请求中的整个URL。一个典型的应用是具有预取能力的缓存,以及需要从数据库聚合多个信息并将它们保存在缓存中的网页门户入口,推荐使用path

 #ACL匹配模式
-i不区分大小写
-m 使用指定的正则表达式匹配方法
-n 不做DNS解析
-u禁止ac1重名,否则多个同名ACL匹配或关系

ACL 操作符
整数比较:eq、ge、gt、1e、1t
字符比较:
-exact match  (-m str):字符串必须完全匹配模式
-substring match(m sub):在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配

-prefix match   (-m beg):在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配

-suffix match    (-mend):将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行匹配
-subdir match   (-m dir):查看提取出来的用斜线分隔(“/")的字符串,如其中任一个匹配,则ACL进行匹配
domain match  (-m dom):查找提取的用点(“.")分隔字符串,如果其中任何一个匹配,则ACL进-行匹配

value的类型
The ACL engine can match these types against patterns of the following types :
-Boolean #布尔值
-integer or integer range #整数或整数范围,比如用于匹配端口范围
-IP address/network#IP地址或IP范围,192.168.0.1,192.168.0.1/24

-string-->www.timinglee.org
   exact#精确比较
   substring#子串
   suffix#后缀比较
   prefix#前缀比较
   subdir#路径,/wp-includes/js/jquery/jquery.js
   domain#域名,www.timinglee.org
-regular expression#正则表达式
-hex block#16进制 

多个ACL的逻辑处理
与:隐式(默认)使用
或:使用“or”或“||"表示
否定:使用"!”表示

if 

if !

4.4.2 acl 策略

acl 基于域名匹配

基于源Ip或子网调度访问

基于源地址访问控制

基于浏览器类型


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

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

总结


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于python理解最大似然MLE-(简单正态分布估计、高斯混合模型GMM)

最大似然法&#xff08;Maximum Likelihood Estimation&#xff0c;简称MLE&#xff09;是一种统计方法&#xff0c;用于估计概率模型的参数。其基本思想是寻找一组参数值&#xff0c;使得在这组参数下&#xff0c;观测数据出现的概率&#xff08;即似然性&#xff09;最大。这…

ARM64 在线仿真器

今天在晚上找到一个简单的ARM64在线仿真器&#xff0c;它非常适合学习ARM64的指令&#xff0c;在教学中应该很好用。网址ARM64 Online Simulatorhttp://163.238.35.161/~zhangs/arm64simulator/ 它是由康涅狄格州立大学的Shuqun Zhang教授开发的。软件基于Alexandro Sanchez开…

评价算法(topsis熵权法)

评价算法 熵权法 上面箭头的一步用到了带权重的距离公式。 上面是某种求权重的方法&#xff0c;合理就行。 但是在使用熵权法的时候&#xff0c;一定要注意用的是规范化矩阵再用熵权法求权重。 规范化之前一定要判断每一列的性质 #熵权法&#xff1a;import xlrd import num…

巴黎奥运会背后的8K国际公用信号制作

北京时间2024年8月12日凌晨3时&#xff0c;举世瞩目的巴黎奥运会闭幕式在法兰西体育场举行&#xff0c;闭幕式演出部分的主题为“记录”。BOSMA博冠首款8K 50P小型化广播级摄像机B1跟随中央广播电视总台“中国红”8K转播车&#xff0c;为田径比赛和闭幕式提供8K国际公用信号制作…

【Ajax使用说明】Ajax、Axios以及跨域

目录 一、原生Ajax 1.1 Ajax简介 1.2 XML简介 1.3 AJAX 的特点 1.3.1 AJAX的优点 1.3.2 AJAX 的缺点 1.4 AJAX 的使用 1.4.1AJAX的基本操作 1.4.2AJAX的传参 1.4.3 AJAX的post请求及设置请求体 1.4.4 AJAX响应json数据 1.4.5 AJAX请求超时与网络异常处理 1.4.5 AJ…

windows 使用Clion开发FreeSWITCH源码

1.准备环境 window安装clion可以编译freeswitch的docker镜像 2.clion配置ssh和Toolchain的配置 去这里看吧 3.makefile配置 Toolchain记得选ssh的 成功之后左下角有这个小锤子&#xff0c;这个小锤子就是生成makefile文件的&#xff0c;记得点击 同时就会出现这个东西 这样…

长文_ZATA

文章目录 环境配置问题miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 环境配置问题 miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 CSDN 原因&#xff1a;fbegmm.dll文件出现问题 解决方案&#xff1a; 使用依赖分析工具https:/…

SuccBI+低代码文档中心 —数据(数据连接、调度管理)

连接数据 数据加工和分析需要连接已存在的数据&#xff0c;通常是业务系统的数据或文件数据&#xff0c;业务系统数据一般存储在关系型数据库中。对于存储在json文件中的&#xff0c;也可以通过脚本数据加工的方式获取数据。 在数据模块下&#xff0c;点击新建&#xff0c;可以…

【Python机器学习】无监督学习——K-均值聚类算法

聚类是一种无监督的学习&#xff0c;它将相似的对象归到同一簇中&#xff0c;它有点像全自动分类。聚类方法几乎可以应用于所有的对象&#xff0c;簇内的对象越相似&#xff0c;聚类的效果越好。 K-均值聚类算法就是一种典型的聚类算法&#xff0c;之所以称之为K-均值是因为它…

【qt】QMainWindow下实现一个记事本

之前我们学过QWidget&#xff0c;QMainWindow会在ui界面多一个菜单 先实现ui界面 1.添加文本编辑&#xff0c;实现可以写多行 2.将文本编辑放大&#xff0c;拖动即可 3.编辑菜单栏 4.然后我们要实现对应子列表的功能&#xff0c;但是在这里不能转到槽&#xff0c;所以我们…

【Vue3】Pinia store 组合式写法

【Vue3】Pinia store 组合式写法 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗…

Java EE基础知识点

前言&#x1f440;~ 上一章我们介绍了性能测试工具LoadRunner&#xff0c;今天开启新的篇章Java EE进阶相关的内容 框架 Maven 项目构建 依赖管理 依赖传递 依赖排除 Maven概念 Maven仓库 Maven 设置国内源 创建Spring Boot项目 Web服务器 如果各位对文章的内容感兴…

Flutter 3.24 对普通开发者有哪些影响?

哈喽&#xff0c;我是老刘 Flutter 3.24刚刚发布了。突然觉得时间过得好快。六年前刚开始使用Flutter 1.0的场景还在眼前。 随着Flutter团队老成员的回归和新成员的加入。 前段时间Flutter团队裁员的影响似乎也逐步消退了。 新版本发布的功能逐步回到了该有的状态。 这里盘点…

解决域名加别名后再代理或者映射到fastadmin项目

如果遇到微应用不想再添加或者不方便添加单独的二级域名时&#xff0c;就需要用到代理或者映射来进入到我们的微应用项目中。 可以修改route.php路由文件的下面这个参数 __alias__ > [别名 > 模块/控制器] 如图 然后再修改config.php文件里面的view_replace_str参数…

C++入门基础知识11

C 关键字 下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。 &#xff01;&#xff01;&#xff01;完整关键字介绍 &#xff08;下一篇博文中将详细罗列介绍&#xff09;

内网穿透:打破网络边界的神奇钥匙

在数字化时代&#xff0c;我们每天都在使用各种网络设备&#xff0c;但你是否曾想过&#xff0c;家里的智能摄像头、私人服务器或是游戏主机&#xff0c;如何能够在远离家的地方也能轻松访问&#xff1f; 这就需要涉及到内网穿透技术了。今天&#xff0c;我们就用简单的例子来揭…

coze 工作流使用

什么是工作流 工作流就是将一系列的逻辑节点串起来的流程&#xff0c;例如我们做一个爬虫&#xff0c;第一步先爬取网页内容&#xff0c;第二步数据清洗&#xff0c;得到我们想要的数据&#xff0c;第三步存到数据库。这里每步就是一个逻辑节点&#xff0c;她们之间有先后或是…

如何用不到一分钟的时间将Excel电子表格转换为应用程序

我们大多数人对电子表格又爱又恨。当企业需要分析数据、为决策过程提供信息并可视化信息时&#xff0c;Excel和Google Sheets是首选。这些文档非常容易创建&#xff0c;它们帮助我们以直接的方式构建相关的想法和适用的数据。除此之外&#xff0c;事情可能会变得一团糟。 对于…

服务注册中心--Eureka

一.Eureka概述 Eureka是一个基于REST的服务&#xff0c;主要用于AWS(Amazon Web Services 亚马逊云计算服务)云中的定位服务&#xff0c;以实现中间层服务器的负载平衡和故障转移在 Spring Cloud 微服务架构中通常用作注册中心, 我们称这个服务为 Eureka Server&#xff0c;还…

springboot学生作业管理系统---附源码14916

摘 要 在信息化社会中&#xff0c;人们需要针对性的信息获取途径。然而&#xff0c;由于不同角度和偏好的存在&#xff0c;人们经常只能获得特定类型的信息&#xff0c;这也是技术攻克难题之一。为了解决学生作业管理系统等问题&#xff0c;本研究通过分析和研究&#xff0c;设…