HAProxy理论+实验
目录
1、配置选项
2、配置示例
二、IP透传
1、layer4 与 layer7
(1)四层:IP+PORT转发
(2)七层:协议+内容交换
三、haproxy的ACL应用
1、ACL配置选项
(1)名称
(2)匹配规范
(3)匹配模式
(4)具体操作符
(5)操作对象
2、多个ACL的组合调用方式
(1)多个ACL的逻辑处理
(2)多个ACL调用方式
四、自定义HAProxy错误界面
五、基于HTTP重定向错误页面
六、HAProxy四层负载
七、HAPRoxy https实现
1、证书制作
2、https配置
一、基于cookie的会话保持
cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少,已经被session共享服务器代替
注意:不支持 tcp mode,使用 http mode
1、配置选项
cookie name [rewrite | insert l prefix ][ indirect ][ nocache ][ postonly ] [preserve ][httponly][secure ][ domain ]*[ maxidle <idle> ][ maxlife ]
name cookie的key名称,用于实现持久连接
insert 插入新的cookie,默认不插入cookie
indirect 如果客户端已经有cookie,则不会再发送cookie信息
nocache 当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器
2、配置示例
[root@haproxy ~]# dnf install haproxy -y
[root@webserver1 ~]# dnf install nginx -y
[root@webserver2 ~]# dnf install nginx -y[root@webserver1 ~]# echo webserver1 -- 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx[root@webserver2 ~]# echo webserver2 -- 172.25.254.20 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl enable --now nginx
3、验证cookie信息
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
curl访问时指定cookie
二、IP透传
web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析等场景。
IP透传需用到forwardfor参数
nginx可直接看到IP透传的效果,apache需添加参数才可看到
echo webserver1 - 172.25.254.10 > /var/www/html/index.html systemctl start httpd cat /etc/httpd/logs/access_log # 未添加参数时,看不到真实地址vim /etc/httpd/conf/httpd.conf # 主配置文件,添加 {X-Forwarded-For}
1、layer4 与 layer7
(1)四层:IP+PORT转发
mode tcp
在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据,而四层负载自身不参与建立连接,而和LVS不同,haproxy是伪四层负载均衡,因为haproxy需要分别和前端客户端及后端服务器建立连接
(2)七层:协议+内容交换
mode http
七层负载均衡服务器起了一个反向代理服务器的作用,服务器建立一-次TCP连接要三次握手,而client要访问Web Server要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的 Web Server,然后通过三次握手与此台Web Server建立TCP连接,然后Web Server把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用,七层代理需要和Client和后端服务器分别建立连接
三、haproxy的ACL应用
访问控制列表ACL,Access Control Lists
是一种基于包过滤的访问控制技术
它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。
1、ACL配置选项
#用ac1来定义或声明一个ac1
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 名称 匹配规范 匹配模式 具体操作符 操作对象类型
(1)名称
acl image_service hdr_dom(host) -i img.magedu.com
#ACL名称,可以使用大字母A-Z、小写字母a-z、数字0-9、冒号:、点·、中横线和下划线,并且严格区分大小写。
(2)匹配规范
定义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> [,<0CC>]]) 长度匹配,header的长度匹配
hdr_reg([<name> [,<occ>]]) 正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub([<name> [,<occ>]]) 子串匹配,header中的uri模糊匹配 模糊匹配#示例:
hdr(<string>) 用于测试请求头部首部指定内容
hdr_dom(host) 请求的host名称,如www.zx.org
hdr_beg(host) 请求的host开头,如www. img. video. download. ftp.
hdr_end(host) 请求的host结尾,如.com. net .cn
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
在Windows C:\Windows\System32\drivers\etc\hosts里添加解析
基于域名的访问(有域名解析)
base :string
#返回第一个主机头和请求的路径部分的连接,该请求从主机名开始,并在问号之前结束,对虚拟主机有用<scheme>://<user>:<password>@#<host>:<port>/<path>;<params>#?<query>#<frag>base :exact string match
base_beg:prefix match
base_dir:subdir match
base dom:domain match
base end:suffix match
base len:length match
base_reg:regex match
base sub:substring matchpathstring
#提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)
<scheme>://<user>:<password>@<host>:<port>#/<path>;<params>#?<query>#<frag>
path :exact string match
path_beg :prefix match #请求的URL开头,如/static、/images、/img、/css
path end :suffix match #请求的URL中资源的结尾,如gif.png.cssjs.jpg .jpeg
path_dom:domain match
path_dir:subdir match
path len:length match
path_reg:regex match
path_sub:substring matchurl :string
#提取请求中的整个URL。一个典型的应用是具有预取能力的缓存,以及需要从数据库聚合多个信息并将它们保存在缓存中的网页门户入口,推荐使用path
url:exact string match
url beg :prefix match
url_dir :subdir match
url_dom :domain match
url_end : suffix match
ur1_len :length match
url_reg :regex match
url_sub :substring matchdst #目标IP
dst_port #目标PORT
Src #源IP
src_port #源PORT
(3)匹配模式
-i 不区分大小写
-m 使用指定的正则表达式匹配方法
-n 不做DNS解析
-u 禁止ac1重名,否则多个同名ACL匹配或关系
(4)具体操作符
整数比较:eq、ge、gt、le、lt
字符比较:
-exact match (-m str):字符串必须完全匹配模式
-substring match (-m sub):在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配
- prefix match (-m beg):在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配
- suffix match (-m end):将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行匹配
- subdir match (-m dir):查看提取出来的用斜线分隔(“/")的字符串,如其中任一个匹配,则ACL进行匹配
-domain match (-m dom):查找提取的用点(“.")分隔字符串,如果其中任何一个匹配,则ACL进行匹配
(5)操作对象
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-->zx.org
exact #精确比较
substring #子串
suffix #后缀比较
prefix #前缀比较
subdir #路径,/wp-includes/js/jquery/jquery.js
domain #域名,www.timinglee.org
-regular expression #正则表达式
-hex block #16进制
2、多个ACL的组合调用方式
(1)多个ACL的逻辑处理
与:隐式(默认)使用
或:使用“or”或“|"表示
否定:使用"!”表示
(2)多个ACL调用方式
if valid_src valid_port #与关系,ACL中A和B都要满足为true,默认为与
if invalid_src || valid_port #或,ACL中A或者B满足一个为true
if !invalid src #非,取反,不满足ACL才为true
四、自定义HAProxy错误界面
关闭后端的RS主机然后用浏览器去访问172.25.254.100
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
五、基于HTTP重定向错误页面
浏览器访问172.25.254.100自动跳转到百度
六、HAProxy四层负载
如果使用frontend和backend,一定在 frontend 和 backend 段中都指定mode tcp
listen mysql—port
bind *:3306
mode tcp
balance leastconn
server web1 172.25.254.10:3306 check
server web2 172.25.254.20:3306 check backup或者使用frontend和backend实
frontend mysql_port
bind :3306
mode tcp
use_backend mysqi_rsbackend mysql_rs
mode tcp
balance leastconn
server web1 172.25.254.10:3306 check
server web2 172.25.254.20:3306 check
在后端服务器安装和配置mariadb服务
yum install mariadb-server
在另一台主机webserver2也做同样设置,将server-id设为2
[root@webserver1 ~]# mysql -e "grant all on *.* to zx@'%' identified by 'zx';"
[root@webserver2 ~]# mysql -e "grant all on *.* to zx@'%' identified by 'zx';"
[root@webserver1 ~]# mysql -uzx -pzx -h 172.25.254.100 -e "show variables like 'hostname'"
七、HAPRoxy https实现
haproxy可以实现https的证书安全,从用户到haproxy为https,从haproxy到后端服务器用http通信但基于性能考虑,生产中证书都是在后端服务器比如nginx上实现
1、证书制作
[root@haproxy ~]# mkdir -p /etc/haproxy/certs
[root@haproxy ~]# openssl req -newkey rsa:2048 --nodes -sha256 -keyout /etc/haproxy/certs/zx.org.key -x509 -days 365
2、https配置
frontend webserverbind *:80redirect scheme https if!{ssl_fc }mode httpuse backend webclusterfrontend webserver-httpsbind *:443 ssl crt/etc/haproxy/certs/zx.pemmode httpuse_backend webclusterbackend webclustermode httpbalance roundrobinserver webl 172.25.254.10:80 check inter 3s fall 3 rise 5server web2 172.25.254.20:80 check inter 3s fall 3 rise 5
[root@haproxy ~]# curl -IKL https://172.25.254.100
相关文章:

HAProxy理论+实验
目录 一、基于cookie的会话保持 1、配置选项 2、配置示例 3、验证cookie信息 二、IP透传 1、layer4 与 layer7 (1)四层:IPPORT转发 (2)七层:协议内容交换 三、haproxy的ACL应用 1、ACL配置选项 (1…...

Spring Boot ⽇志
1. ⽇志概述 为什么要学习⽇志 ⽇志对我们来说并不陌⽣, 从JavaSE部分, 我们就在使⽤ System.out.print 来打印⽇志了. 通过打 印⽇志来发现和定位问题, 或者根据⽇志来分析程序的运⾏过程. 在Spring的学习中, 也经常根据控制台 的⽇志来分析和定位问题. 随着项⽬的复杂…...

最详细!教你学习haproxy七层代理
一、工作原理 (1)包括 监听端口:HAProxy 会在指定的端口上监听客户端的请求。 例如,它可以监听常见的 HTTP 和 HTTPS 端口,等待客户端连接。请求接收:当客户端发起请求时,HAProxy 接收到请求。…...
ElementUI 事件回调函数传参技巧与自定义参数应用
ElementUI 事件回调函数传参技巧与自定义参数应用 在使用elementUI时,事件回调函数传递参数是一个常见的需求。根据搜索结果,我们可以了解到两种主要的方法来传递自定义参数: 使用回调函数:当elementUI组件触发事件时,…...

优化Next的webpack配置
众所周知,next的webpack打包实际上分成了两个部分,一个是服务器端、一个是客户端,我们这里的配置主要是针对客户端的配置。 目的在于降低_app.js包大小,合理划分基础包、工具包、常用方法包、拆分lodash按需引入效果。 拆分lodas…...

Q-Dir vs 传统文件管理器:为何开发者更偏爱这款神器?
前言 在这个信息爆炸的时代,我们每天都在与海量的文件和文件夹打交道;你是否曾经为了找一个文件而翻遍了整个硬盘?是否因为繁琐的文件夹操作而头疼不已?今天,就让我小江湖带你走进一个全新的世界——Q-Dir,…...
日常疑问小记录
1、在抢票过程中,有些人显示服务器崩溃而另一些人仍能访问,可能是由于以下几个原因: (1)负载均衡:服务器可能采用了负载均衡技术,将用户请求分配到多个服务器上。部分用户可能被引导到正常运行…...

Java Web —— 第四天(HTTP协议,Tomcat)
HTTP-概述 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则 特点: 1. 基于TCP协议:面向连接,安全 2.基于请求-响应模型的:一次请求对应一次响应 3. HTTP协议是无状态的协议: 对于事务处理没有…...

C++ list的基本使用
目录 1.list简要介绍 2. list的构造 3. list中迭代器的使用 (1). 双向迭代器与随机访问迭代器使用区别 4.判空、获取元素个数 5. list头、尾元素的访问 6. 插入与删除操作 (1). 头插头删,尾插尾删 (2). 插入,删除与清空 (3). 交换 7. list容器迭代…...
云中韧性:Spring Cloud服务调用重试机制深度解析
标题:云中韧性:Spring Cloud服务调用重试机制深度解析 在微服务架构中,服务间的调用可能会因为网络问题、服务不可达、资源竞争等原因失败。Spring Cloud作为微服务架构的主流实现框架,提供了一套完整的服务调用重试机制…...

83.SAP ABAP从前台找字段所在表的两种方法整理笔记
目录 方法1:F1查看技术信息 F1 技术信息 方法2:ST05开启跟踪 Activate Trace Input and save data Deactivate Trace Display Trace 分析你想要的表 方法1:F1查看技术信息 从前台找一个屏幕字段所在表,一般通过按F1来查找…...
docker为普通用户设置sudo权限
在 Linux 上使用 Docker 命令时,默认情况下需要 sudo 权限。这是因为 Docker 守护进程(Docker daemon)通常运行在 root 用户下,而访问和管理 Docker 守护进程的权限也默认被限制给 root 用户。 然而,为了方便日常使用…...
Nginx + PHP 8.0支持视频上传
在 Ubuntu 20.04 上配置 Nginx PHP 8.0 的架构以支持视频上传,需要从 Nginx 和 PHP 两个方面进行配置,以确保服务器能够处理大文件上传。以下是详细的步骤: 1. Nginx 配置 1.1 增加上传文件大小限制 默认情况下,Nginx 对上传文…...
MySQL基础详解(3)
文章目录 索引普通索引创建索引修改表结构(添加索引)创建表的时候直接指定删除索引的语法 唯一索引创建索引修改表结构创建表的时候直接指定 使用ALTER 命令添加和删除索引使用ALTER 命令添加和删除主键显示索引信息 约束非空约束:唯一约束:主键约束&…...

傅里叶变换结合数学形态学进行边缘增强和边缘提取
一、前言 傅里叶变换是图像变换的一种常用方法,傅里叶变换在图像处理中扮演着核心角色,它通过将图像从空间域转换到频率域,获取图像的频率成分,因为有些特征在空间域很难处理,但在频率域比较容易处理。这一转换有助于分…...

Haproxy的ACL介绍及应用实例
一、ACL介绍 访问控制列表ACL,Access Control Lists) 是一种基于包过滤的访问控制技术 它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过 滤,基于请求报文头部中的源地址、源端口、目标地址、目…...
final finally finalize 区别?
final: final 是一个修饰符,可以用于类、方法和变量。当final修饰类时,表示该类不能被继承。当final修饰方法时,表示该方法不能被子类覆盖(重写)。当final修饰变量时,表示该变量是一个常量,其值…...

C语言常用的内存函数
在上一篇博客中我为大家分享了一些常用的字符串函数,以及它们的用法和模拟实现。通过字符串函数中的strcpy,我们能够做到将一个字符串中的内容拷贝到另一个字符串上,可如果有一天我们想把一个整型数组中的内容拷贝到另一个整型数组中呢&#…...

MP4 H.264 MPEG-4 MPEG-2
MP4 视频编解码技术 H.264 MPEG-4 MPEG-2 MP4 (MPEG-4 Part 14): Format: A digital multimedia container format.Use: Often used to store video, audio, subtitles, and still images.Compression: Can use different codecs, such as H.264, for video compression. H.264…...

nvm 切换、安装 Node.js 版本
nvm下载路径 往下拉找到Assets 下载后,找到nvm-setup.exe双击,一直无脑下一步,即可安装成功。 配置环境变量(我的是window11) 打开任务栏设置–搜环境变量 配置好后,点确定一层一层关闭 windowR 打开控制…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...