HAproxy ACL书写规则

通过ACL控制列表,实现基于 HAproxy的只能负载均衡系统。

ACL主要完成功能:2种

1、通过设置的AC规则检查客户端请求是否合法,如果符合ACL规则要求,则进行放行
2、符合的ACL规则要求的请求将被提交到后端的backend服务器集群,进行实现基于ACL的动静分离负载均衡。

ACL规则配置位置

在 frontend 前端虚拟服务器中写入

haproxy acl 可以多个域名吗 haproxy acl规则_haproxy acl 可以多个域名吗

ACL规则写入方法

acl 自定义的acl名称 acl方法 -i [匹配的路径或文件]
-i 不区分大小写

匹配方法

注解

例子

hdr_reg(host)

多条完全合格域名检测

hdr_reg(host) -i www.shm.com I baidu.shm.com

hdr_dom(host)

单条完全合格域名检测

hdr_dom(host) -i www.shm.com

hdr_beg(host)

以某个域名开头

hdr_beg(host) img. ftp. video. www.

path_beg

url以什么开头进行检测

path_beg www. 一般很少用

path_end

url以什么结尾进行检测

path_end .gif .png .jpg .css .js .jsp .php

url_sub

url包含某段字符串进行检测

url_sub buy_sid= 一般很少用

url_dir

url包含部分地址路径进行检测

url_dir timetask

详细ACL规则写入:

一、根据域名匹配

1.hdr_reg(host)
acl www_prolicy hdr_reg(host) -i www.shm.com|web.shm.com
如果客户端以 www.shm.com /web.shm.com的域名发送请求,-i忽略大小。此处一般为FQDN

2.hdr_dom(host)
acl www_prolicy hdr_dom(host) -i lvs.shm.com
如果客户端请求的域名满足 lvs.shm.com -i 忽略大小

3.hdr_beg(host)
acl www_prolicy hdr_beg(host) -i img. video. download. ftp.
如果客户端以 img. video. ftp.为开头的域名发送请求 -i 忽略大小

4.url_sub
acl www_prolicy url_sub -i buy_sid=
如果客户端请求的url中包含 buy_sid ,则控制列表返回 true ,否则为 flase

5.url_dir
acl www_prolicy url_dir -i timetask
如果客户端请求的url 中包含 timetask ,则控制策略返回 true,否则为 flase

二、根据请求的页面格式进行匹配

1.path_end
acl url_static path_end .gif .png .jpg .css .js
如果客户端请求的URL中以 .gif .png 。。。结尾返回true

2.php / jsp 页面动静分离
acl url_php path_end .php
acl url_jsp path_end .jsp
如果客户端请求的URL中以 .php / .jsp 结尾 返回true

三、控制列表指向后端真实服务器群组

1、use_backend + backend实例名			表示满足ACL规则后去请求哪个backend实例
2、default_backend + backend实例名		表示没有满足ACL规则后 去默认请求哪个 backend实例
3、block if  + acl策略名				表示阻止该ACL列表的请求

use_backend 真实服务器群组名 if ACL规则列表名
use_backend server_bbs if bbs_policy
当用户发送的请求满足 bbs_policy 的ACL规则时,HAproxy就会把请求发往 server_bbs这个真实服务器群组进行匹配

default_backend 真实服务群组名

default_backend server_cache
当用户发送的请求不满足任何一个acl规则时,HAproxy就会把请求发往由default_backend选项指定的server_cache这个后端群组

案例:

frontend www
        bind  *:80
        mode http
        option httplog
        option forwardfor
        option httpclose
        log global
        
        #ACL
        acl   url_static   path_end   .gif   .png   .jpg   .css   .js
        acl   url_php    path_end   .php 
        acl   url_jsp     path_end    .jsp
        acl   baidu_prolicy   hdr_reg(host)   -i    ^(baidu.com)
        acl   google_prolicy   hdr_reg(host)  -i   ^(google.com)

	#use_backend
	use_backend    server_php    if   url_php
	use_backend    server_jsp   if  url_jsp
	use_backend    server_static   if  url_static
	use_backend    server_baidu   if  baidu_prolicy
	user_backend   server_google  if  goole_prolicy
	
	#default_backend
	default_backend    server_cache

#后端服务器真实群组:php群组
backend server_php
    	 mode   http
	 option   redispatch
    	 option   abortonclose
   	 balance source
   	 cookie  SERVERID   
  	 option  httpchk  GET /index.php 
  	#option  httpche   GET /index.jsp   如果是 .jsp格式文件此处参数修改为 Index.jsp
  	
  	 server  default  192.168.10.5:80  cookie  php1  weight  3  check inter 2000  rise 2  fall 3
  	 server  default  192.168.10.6:80  cookie  php2  weight  3  check  inter  2000 rese 2 fall3 
   	 server  default  192.168.10.7:80  cookie  php3  weight  3  check  inter  2000 rese 2 fall3
   	
 ...太多了省略了,如果细心看相信自己写个配置文件是没问题的