Haproxy ACL规则实现智能负载均衡
  mJ3y71vHJ0RC 2023年11月12日 27 0


Haproxy ACL规则实现智能负载均衡_html

 

HAProxy的ACL 是什么?


由于HAProy可以工作在七层模型下,因此,要实现 HAProxy的强大功能,一定要使用强大灵活的ACL规则,通过ACL规则可以实现基于HAProy的智能负载均衡功能。HARroxy 通过ACL 规则完成两种主要的功能,分别是∶

1)通过设置的ACL规则检查客户端请求是否合法。如果符合ACL规则要求,那么就将放行,反正,如果不符合规则,则直接中断请求。

2)符合ACL 规则要求的请求将被提交到后端的backend 服务器集群,进而实现基于ACL 规则的负载均衡

 

ACL规则语法


HAProxy中的ACL规则经常使用在frontend 段中,使用方法如下∶

acl语法

#acl 参数
acl(关键字) 定义acl(名称) 方法(criterion) -i (flags) [匹配的路径或文件]
hdr_beg(host)
hdr_reg(host)
path_beg
path_end

acl∶是一个关键字,表示定义ACL规则的开始。后面需要跟上自定义的ACL名称

acl方法这个字段用来定义实现ACL的方法,HAproxy定义了很多ACL方法,经常使用的方法也就那么些,比如有 hdr_reg(host)、hr_dom(host)、hdr_beg(host)、url_sub、url_dir、path_beg、path_end等.

 

ACL常用方法


常用的方法:(-i∶表示忽略大小写,后面需要跟上匹配的路径或文件或正则表达式。) 

hdr_beg(host):精确匹配主机,表示以什么开头的域名

hdr_reg(host):正则匹配
例子:acl bbs hdr_reg(host) -i ^(bbs.test.com|shequ.test.com|forum)
例子:acl www_polilcy hdr_reg(host) -i ^(www.z.cn|z.cn)
path_beg: 用于测试请求的URL是否以指定的模式开头(匹配路径,表示以什么路径开头)
例子:acl url_static path_beg -i /static /iilannis /javascript /stylesheets
用于测试URL是否以/static、/iilannis、/javascript或/stylesheets开头。

path_end:用于测试请求的URL是否以指定的模式结尾(匹配路径结尾,表示以什么路径结尾)
例子:acl url_static path_end -i .jpg .gif .png .css .js
测试URL是否以.jpg、.gif、.png、.css或.js结尾。(这些都是静态资源,以静态资源结尾)
url_sub:表示请求url中包含什么字符串
url_dir:表示请求url中存在哪些字符串作为部分地址路径

url_sub 表示请求url中包含什么字符串
例如: acl file_req url_sub -i killall= 表示在请求url当中包含killall=,则此控制策略返回true

url_dir∶表示请求url中存在哪些字符串作为部分地址路径
例如: acl dir_eq url_dir -i allow,表示在请求url中存在allow作为部分地址路径。则此控制策略返回 true,否则返回false

以上这三种ACL规则可以满足企业当中绝大部分场景。 

与ACL 规则一起使用的HAProy参数还有use_backend,use_badend后面需要跟上一个 backend实例名,表示在满足 ACL规则后去请求哪个backend实例,与use_badend对应的还有default_backend参数,它表示在没有满足ACL条件的时候默认使用哪个后端 backend。

下面列举几个常见的ACL规则例子∶

#reg说明是可以使用正则,如果我们的域名是以www.z.cn或者以z.cn开头的就满足这样一个策略
acl www_polilcy hdr_reg(host) -i ^(www.z.cn|z.cn)

#精确匹配,只有域名为bbs.z.cn才满足这个ACL规则
acl bbs_policy hdr_dom(host) -i bbs.z.cn

#如果请求的URL当中有buy_sid=字符串的时候就满足该ACL规则
acl url_policy url_sub -i buy_sid=


#当满足ACL规则时候会使用use_backend来接上上面定义的ACL规则

#当ACL规则满足www_polioy会将请求转到server_www后端真实服务器上,如果都不满足请求转发到server_cache实例上
use_backend server_www if www_polioy
use_backend server_app if url_pollcy
use_backend endserver_bbs if bbs_policy

default backend server_cache



#上面的ACL规则从上到下依次执行
acl  html  url_reg  -i  \.html$  #访问控制列表名称html。规则要求访问以html结尾的url(可选)

use_backend httpservers if html
#如果满足acl html规则,则推送给后端服务器httpservers

default_backend httpservers
#默认使用的服务器组


backend httpservers #名字要与上面的名字必须一样

balance roundrobin #负载均衡的方式
server http1 192.168.13.133:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.13.137:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2

 

 

ACL规则举例说明


在你本地host里面配置本地域名解析规则,该IP地址为你的Haproxy物理地址,即192.168.179.101(这里没有配置keepalived,所以并没有VIP地址,这里是物理网卡地址) 

Haproxy ACL规则实现智能负载均衡_html_02

ACL规则放在fronted的字段 ,所有配置如下

[root@master ~]# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
pidfile /var/run/haproxy.pid
maxconn 4096
user haproxy
group haproxy
daemon
nbproc 1
defaults
mode http
log global
retries 3
option redispatch
maxconn 4000
timeout connect 5000
timeout client 5000
timeout server 5000
timeout check 5000

frontend web
mode http
bind *:80
option httplog
option forwardfor
option httpclose
log global

acl a-server base_dom -i www.test.com
use_backend httpservers1 if a-server

default_backend httpservers2

backend httpservers1
option redispatch
option abortonclose
cookie SERVERID insert indirect nocache
server http1 192.168.179.102:80 maxconn 2000 cookie server1 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.179.103:80 maxconn 2000 cookie server2 weight 1 check inter 1s rise 2 fall 2

backend httpservers2
option redispatch
option abortonclose
cookie SERVERID insert indirect nocache
server http3 192.168.179.102:8080 maxconn 2000 cookie server3 weight 1 check inter 1s rise 2 fall 2

listen stats
bind *:81
stats enable
stats uri /haproxy
stats auth lulei:123
log 127.0.0.1 local2 err
stats admin if TRUE
stats hide-version
stats refresh 30s

当访问的域名不一样,访问的后端服务器群组是不一样的,根据ACL规则如果访问域名为www.test.com则跳转到后端的 backend httpservers1 上面,对应Nginx服务器。其余的域名使用
backend httpservers2对应于后端的Tomcat服务器

满足ACL规则:

Haproxy ACL规则实现智能负载均衡_html_03

不满足ACL规则: 缺省 default_backend    httpservers2

一般后端一个节点做会话保持也没有太多的意义,因为请求只会放到这个节点如果有很多节点才做会话保持 ,所以这里只是演示一下

Haproxy ACL规则实现智能负载均衡_html_04

直接访问IP也不满足ACL规则 

Haproxy ACL规则实现智能负载均衡_redis_05

 

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  xqA0sOKuvLcb   2023年11月22日   17   0   0 redisDockerredisdocker
  qmj2xyt4e0cp   2023年11月12日   20   0   0 nginxhtml服务器服务器htmlnginx
  qmj2xyt4e0cp   2023年11月12日   26   0   0 html服务器
mJ3y71vHJ0RC
最新推荐 更多