HAProxy(二):HAProxy的ACL规则实现智能负载均衡详解与示例
一、HAProxy的ACL的功能
ACL(Access Control List)访问控制列表,HAProxy中的ACL的匹配条件和控制条件有许多种,功能很强大,可以通过源地址、源端口、目标地址、目标端口、请求的资源类型、请求的主机等。
acl格式:acl <aclname> <criterion> [flags] [operator] [<value>] aclname:自定义acl的名称,必填项,只能是大小写、数字、'-'、'_'、'.'、':' criterion:表示检查那些数据或内容,例如USERAGENT这个首部的值
四个最为常用的criterion为:
src:ip 源IP
src_port:integer 源端口
dst:ip 目标IP
dst_port:integer 目标端口
flags:定义控制条件,例如是否区分字符大小写等,flags的可选参数如下: -i 忽略字符大小写 -m 启用特定的匹配方式,一般不用 -n 禁止DNS反向解析 -u 不允许aclname重复,默认是可以重名的,当两个acl的名称相同时,运算为或机制。 operator:判断匹配条件,与<criterion>相比较的条件 若匹配整数值:eq,ge,gt,le,lt 若匹配字符串: value:访问控制的具体内容或值。value的类型如下: boolean:布尔值 integer or integer range:整数或整数范围 IP address/network:网络地址 string(exact, substring, suffix, prefix, subdir, domain):字符串 regular expression:正则表达式 hex block
上面的指令和参数都是为了设置或定义ACL的匹配条件的,即ACL仅仅只是将匹配条件进行分类归纳,而不进行处理。若要将定义好的ACL规则做处理,便需要下面的参数来设置:
1.当符合指定的条件时使用特定的backend,<backend>表示设置的backend名,if和unless为判断条件,<condition>为比较的对象,可以是ACL规则,要注意的是在if和unless后面可以接两个ACL,默认表示两个ACL同时满足时才use_backend执行。格式如下:
use_backend <backend> [{if | unless} <condition>] #Switch to a specific backend if/unless an ACL-based condition is matched.
2.阻塞一个七层请求满足/不满足某一ACL匹配条件。格式如下:
block { if | unless } <condition> #Block a layer 7 request if/unless a condition is matched
例:
acl invalid_src src 192.18.29.101 #acl匹配条件为源地址为192.18.29.,acl名为invalid_src
block if invalid_src #阻断满足名为invalid_src的acl匹配条件
errorfile /etc/fstab #并定义错误页
3.配置七层的请求访问控制,与block阻塞不同,http-request更灵活,可做黑白名单控制。只能用在mode http中。
http-request { allow | deny } [ { if | unless } <condition> ]
4.配置四层的请求访问控制。
tcp-request connection {accept|reject} [{if | unless} <condition>]
例:
listen ssh
bind :
balance leastconn
acl invalid_src src 172.16.200.2 #定义acl匹配规则
tcp-request connection reject if invalid_src #在四层拒绝满足名为invalid_src的acl匹配规则
mode tcp
server sshsrv1 172.16.100.6: check
server sshsrv2 172.16.100.7: check
二、ACL示例
要注意到的是acl关键字可用在frontend、listen、backend中,不能用在default中。
例1:设置HAProxy状态页,只允许指定IP访问,设置如下:
listen stats #定义名称
bind *:9099 #监听在9099端口
acl sta src 192.168.29.1 #匹配名为sta且源IP地址为192.168.29.1的ACL规则
block if ! sta #阻断不匹配sta规则的所有条件,!为非
stats enable #启用stats页
stats uri /myhaproxy?admin #自定义stats页面uri
stats realm "Hello World"
stats auth admin:admin #设置状态页登录账号和密码
访问成功如下图,其他IP的主机是不能成功访问的


例2:不适用block,使用http-request来达到例1的效果。
在没有设置访问规则限制时,用IP为192.168.29.104的主机访问stats主页:

提示错误401,只需输入账号密码即可访问,方法为:
curl --basic -u admin:admin http://192.168.29.101:9099/myhaproxy?admin
说明IP为29.104的主机可以访问,并无限制。
添加限制后:
listen stats #定义名称
bind *: #监听在9099端口
acl sta src 192.168.29.1 #匹配名为sta且源IP地址为192.168.29.1的ACL规则
http-request deny unless sta #拒绝除匹配sta规则以外的规则访问
stats enable #启用stats页
stats uri /myhaproxy?admin #自定义stats页面uri
stats realm "Hello World"
stats auth admin:admin #设置状态页登录账号和密码
再用IP为29.104的主机访问效果如下:

此时错误为403,而29.1的主机是可以访问的(图太大了就省略了),说明ACL控制生效了。
例3.七层规则匹配
七层ACL规则匹配中,常用的参数是path,它用来做URL规则匹配,path包括以下参数:
path : 精确匹配
path_beg : 匹配字符串开头的所有内容
path_dir : 子路径匹配
path_dom :
path_end : 匹配字符串结尾的所有内容
path_len : 字符串长度匹配
path_reg : 正则表达式匹配
path_sub : 域名子串匹配
下面来举一个使用path的具体例子,选两台主机,安装Nginx并用Nginx虚拟为4台主机,两台用来处理图片请求,两台用来处理文本请求,利用HAProxy负载均衡的ACL控制机制实现,结构图如下:

1.在192.168.29.102上添加监听8080端口的虚拟主机(安装的是Nginx),修改Nginx配置,在主配置中添加如下信息:
server {
listen default_server;
listen [::]: default_server;
server_name _;
root /usr/share/nginx/html/test; #路径要修改,尽量不使用默认,尽量模拟为两台不同物理机的效果
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
2.在80端口的主机root目录下创建文件static.txt,内容为static 1;在8080端口主机root目录下创建文件static.txt,内容为static 2。重启Nginx服务,并确保能正常访问,如下图


3.用同样的方法在192.168.29.103上创建分别监听在80和8080端口的虚拟主机,并在根目录下创建图片文件,确保能正常访问,如下图:


4.在主机192.168.29.101上配置HAProxy
frontend myweb
bind *:
acl image path_end .png #匹配以.png结尾的path规则
acl txt path_end .txt #匹配以.txt结尾的path规则
use_backend imagesv if image #将规则image负载均衡到服务器组imagesv
use_backend txtsv if txt #将规则txt负载均衡至服务器组txtsv
default_backend app #默认组,无匹配时负载均衡至此 backend imagesv
balance roundrobin
server image1 192.168.29.103: check
server image2 192.168.29.103: check backend txtsv
balance roundrobin
server txt1 192.168.29.102: check
server txt2 192.168.29.102: check backend app
balance leastconn
cookie server insert nocache
server app1 192.168.29.102: check cookie svr1
server app2 192.168.29.103: check cookie svr2
配置完成后重启HAProxy,分别访问192.168.29.101/image.png和192.168.29.101/static.txt,并刷新,会发现内容会不停变化,如下图:


这说明ACL规则培植成功,HAProxy会根据请求的结尾来判断负载均衡规则。
总结:上面举了3个很简单的HAProxy ACL访问控制的例子,虽然例子中的配置很粗糙,但也可以初步领略到HAProxy有着比较智能的负载均衡功能,在后面的博客中我会更深入的介绍HAProxy的细节配置与调优
HAProxy(二):HAProxy的ACL规则实现智能负载均衡详解与示例的更多相关文章
- 003.HAProxy ACL规则的智能负载均衡
一 简介 HAProxy可以工作在第七层模型,可通过ACL规则实现基于HAProxy的智能负载均衡系统,HAProxy通过ACL规则完成以下两种主要功能: 通过ACL规则检查客户端请求是否合法,如果符 ...
- haproxy 配置文件详解 之 ACL 智能负载均衡
由于HAProxy 可以工作在七层模型下, 因此,要实现 HAProxy 的强大功能,一定要使用强大灵活的ACL 规则,通过ACL 规则可以实现基于HAProxy 的智能负载均衡系统. HAProxy ...
- “全栈2019”Java第九十二章:外部类与内部类成员覆盖详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 2017.2.13 开涛shiro教程-第十二章-与Spring集成(一)配置文件详解
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(一)配置文件详解 1.pom.xml ...
- MySQL架构之keepalived+haproxy+mysql 实现MHA中slave集群负载均衡的高可用(原创)
MySQL的高可用方案一般有如下几种:keepalived+双主,MHA,PXC,MMM,Heartbeat+DRBD等,比较常用的是keepalived+双主,MHA和PXC. HAProxy是一款 ...
- Vue项目二、vue环境搭建以及Vue-cli使用及详解
一.Vue多页面应用的环境搭建 每一次页面跳转的时候,后台服务器都会给返回一个新的html文档,这种类型的网站也就是多页网站,也叫做多页应用. 环境的搭建如下,在页面中引入如下框架 <scrip ...
- C++ 智能指针auto_ptr详解
1. auto_ptr 的设计动机: 函数操作经常依照下列模式进行: 获取一些资源 执行一些动作 释放所获取的资源 那么面对这些资源的释放问题就会出现下面的两种情况: 一开始获得的资源被绑定于局部对象 ...
- c++ 智能指针用法详解
本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用. 为什么要使用智能 ...
- python接口自动化(四十二)- 项目结构设计之大结局(超详解)
简介 这一篇主要是将前边的所有知识做一个整合,把各种各样的砖块---模块(post请求,get请求,logging,参数关联,接口封装等等)垒起来,搭建一个房子.并且有很多小伙伴对于接口项目测试的框架 ...
随机推荐
- 第二次spring会议
今天所做之事: 我用C#用DelectText对行数进行了定义,刚开始写代码有点无从下手. 遇到的问题:刚开始用datagridView进行了文本的输入,但是它更适合EXCEL之类的数据计算不符合我们 ...
- 74.CocoaPods安装和使用教程
CocoaPods安装和使用教程 Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 第一: Coco ...
- Postgresql之VACUUM和VACUUM FULL对比
VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格: 无VACUUM VACUUM VACUUM FULL 删除大量数据之后 只是将删除数据的状态置为已删除, ...
- 10.18 nslookup:域名查询工具
功能说明 nslookup命令是常用的域名解析查询工具. 如果系统没有nslookup命令,则需要安装下面的软件包: yum-y inatall bind-otil9 语法格式 nslookup ...
- 第34章:MongoDB-索引--用户管理
①用户管理 在MongoDB里面默认情况下只要是进行连接都可以不使用用户名与密码,因为要想让其起作用,则必须具备以下两个条件: ·条件一:服务器启动的时候打开授权认证: ·条件二:需要配置用户名和密码 ...
- 27、通过visual s'tudio 验证 SOCKET编程:搭建一个TCP服务器
本文就是在windows下进行socket编程,搭建一个TCP客户端. 在visual studio下编程,首先在windows下进行初始化(这点在linux下是不需要的): /* 初始化 Winso ...
- RxSwift学习笔记9:amb/tabkeWhile/tabkeUntil/skipWhile/skipUntil
//amb基本介绍 //当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素. //并忽略掉其他的 Observable ...
- Go Code Review Comments 译文(截止2018年7月27日)
持续更新中- 原文最新链接 https://github.com/golang/go/wiki/CodeReviewComments/5a40ba36d388ff1b8b2dd4c1c3fe820b8 ...
- 833. Find And Replace in String
To some string S, we will perform some replacement operations that replace groups of letters with ne ...
- Android OOM 引发的思考
一.为何会出现OOM 因为Android系统的硬件资源是相当有限的,而且分配给一个应用的资源更为有限,尤其是内存.当应用突然申请的内存大于允许的最大值的时候,就会出现OOM. 如果想要获取App的内存 ...