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

简介: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.rhkb.cn/news/399668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LVS中NAT模式和DR模式实战讲解

1DR模式 DR&#xff1a;Direct Routing&#xff0c;直接路由&#xff0c;LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发&#xff0c;源MAC是DIP所在的接口的MAC&#xff0c;目标MAC是某挑选出的RS的RIP所在接口的MAC地址&#xff1b;源 IP/PORT&#xf…

开源工具提升你的生产力

如果你想摆脱大科技公司的专有控制&#xff0c;有一些选择是很好的。 每一个阴都有一个阳&#xff1b;每一个动作都有一个反作用力&#xff1b;每一个专有软件都有一个开源替代品。大概就是这样的。 在过去的几年里&#xff0c;技术中的“开放性”问题在公众意识中从未如此突出…

【网络编程】字节序,IP地址、点分十进制、TCP与UDP的异同

记录学习&#xff0c;思维导图绘制 目录 1、字节序​编辑 2、IP地址 3、点分十进制 4、TCP与UDP的异同 1、字节序 2、IP地址 3、点分十进制 4、TCP与UDP的异同

鸿蒙(API 12 Beta3版)【播控特性简介】分布式媒体会话

使用媒体播控&#xff0c;可以简单高效地将音视频投放到其他HarmonyOS设备上播放&#xff0c;如在手机上播放的音视频&#xff0c;可以投到2in1设备上继续播放。 HarmonyOS提供了统一的应用内音视频投播功能设计&#xff0c;通过使用系统提供的投播组件和接口&#xff0c;应用…

嵌入式学习---DAY24:进程--二

一、exec函数族----启动一个新程序 用fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c; 子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的 用户空间代码和数据完全被…

什么是 Java?

探索 Java&#xff0c;一种多功能且功能强大的编程语言。释放其构建强大应用程序的潜力。 前言 简单来说&#xff0c;Java 是一种用于开发软件应用程序的面向对象设计的编程语言。截至 2019 年&#xff0c;它是世界上最受欢迎的编程语言&#xff0c;尤其是因为它是开源的&#…

QT 布局管理器之QHBoxLayout

文章目录 概述.ui来看看Cmain.cpp运行 小结 概述 QHBoxLayout&#xff0c;在QT中是一个布局文件&#xff0c;而且相对来说还是比较简单的。接下来看下。 .ui 先看下在qt design中是如何用的&#xff0c;如下图&#xff1a; 就是这个布局文件&#xff0c;是一个xml的文件&am…

动起来!Axure动画的实用技巧

前言 在数字产品的世界中&#xff0c;用户体验的每一个细节都至关重要。 动画&#xff0c;作为一种增强交互性和视觉吸引力的手段&#xff0c;已经成为现代界面设计中不可或缺的元素。 Axure&#xff0c;作为一款强大的原型设计工具&#xff0c;提供了丰富的动画功能&#x…

Windows下编译安装PETSc

本文记录在Windows下使用MinGW-w64编译安装PETSc的流程。 0、环境 操作系统Windows 11MSYS2msys2-x86_64-20240507 1、开发环境 首先&#xff0c;下载并安装MSYS2&#xff0c;然后编辑PATH环境变量&#xff0c;添加mingw64相关路径&#xff1a;C:\msys64\mingw64\bin。 然后…

【项目分享】使用python的ttkbootstrap模块构建一个炫酷的计时器

目录 前言 项目背景 项目展示&#xff08;图片&#xff09; 项目实现 1. 安装与设置 2. 创建主窗口 3. 初始化计时器功能 4. 实现计时功能 5. 实现隐藏边框与置顶功能 6. 运行应用 完整代码 结论 &#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f…

从零开始实现循环神经网络

本节我们通过使用MXnet&#xff0c;来从零开始的实现一个含有隐藏状态的循环神经网络。 前序工作 数据集预处理进行采样 实现循环神经网络 完成前序工作后&#xff0c;即可开始实现循环神经网络。本文首先构建一个具有隐状态的循环神经网络。其结构如图所示&#xff1a; 接…

Linux的常用操作-02

一&#xff1a;Linux的系统目录结构 /bin bin是ary的缩写&#xff0c;这个目录存放着最经常用的命令 /boot&#xff1a;这里存放的是启动Linux时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev&#xff1a;dev是Device(设备)的缩写,该目录下存放的是Lin…

Servlet——个人笔记

Servlet——个人笔记 文章目录 [toc]Servlet简介Servlet命名Servlet由来实现过程 Servlet 相对 CGI 的优势简要说说什么是CGI Servlet 在IDEA中开发流程Servlet注解方式配置WebServlet注解源码WebServlet注解使用 Servlet常见容器Servlet 生命周期简介测试 Servlet 方法init()…

MySQL(一)——初识数据库(概念、数据类型、基本表库操作)

文章目录 初识数据库数据库相关基本概念数据库的分类 MySQL数据库数据模型基本操作库操作查看数据库创建数据库删除数据库选中数据库 数据类型数值类型字符串类型日期类型 表操作查看所有表查看表结构创建表删除表 其他操作查看警告信息查看编码集 这是我们 MySQL 学习的第一程…

数据结构+图的基本应用

一、问题描述 求有向图的简单路径 编写一个程序,设计相关算法完成以下功能。 (1)输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有简单路径。 (2)输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有长度为 3 的简单路径。 (3)输出如图所示的有向图 G 从顶点 5 到顶点…

【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch

服务器更新后&#xff0c;输入nvidia-smi出现如下报错&#xff1a; 解决方法参考&#xff1a; 已解决【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch解决方法-腾讯云开发者社区-腾讯云 (tencent.com) 输入命令查看nvidia驱动的版本号&#xff1a…

python从入门到精通:判断语句

目录 前言 1、布尔类型和比较运算符 2、if语句的基本格式 3、if else语句 4、if elif else语句 5、判断语句的嵌套 6、实战演练 前言 逻辑判断是生活中常见的行为。同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能。 判断是程序最基础最核心的逻辑…

Hive3:识别内部表、外部表及相互转换

一、识别方法 查看内部表信息 desc formatted stu;查看外部表信息 desc formatted test_ext1;通过Table Type对应的值&#xff0c;我们可以区分外部表和内部表。 二、相互转换 内部表转外部表 alter table stu set tblproperties(EXTERNALTRUE);外部表转内部表 alter ta…

应急响应-主机安全之系统及进程排查相关命令(Linux操作系统-初级篇)

目录 概述lscpu-显示有关CPU架构的信息uname-查看系统信息lsmod-输出加载的所有模块lastb-输出最后登录失败的用户last-展示用户最近登录信息lastlog-展示所有用户最后的登录时间systemctl-系统服务&#xff0c;开机自启排查crontab-计划任务选项 history-查看历史命令选项常用…

正向代理 vs 反向代理:有什么区别?

在本文中&#xff0c;我们将讨论&#xff1a; 什么是常规代理&#xff08;正向代理&#xff09;&#xff1f;什么是反向代理&#xff1f;我应该为我的业务选择哪种代理&#xff1f;使用正向和反向代理的案例完成任务的代理替代方案 什么是常规代理&#xff08;正向代理&#…