haproxy支持ACL规则
,用于定义三层到七层的规则来匹配一些特殊的请求,实现基于请求报文首部、相应报文内容或者是一些其他状态信息,从而根据需求进行不同的策略转发响应。
可以通过ACL规则完成以下两种主要功能:
1、通过设置ACL规则来检查客户端请求是否符合规则,将不符合规则要求的请求直接中断;
2、符合ACL规则的请求由backend指定的后端服务器池执行基于ACL规则的负载均衡,不符合的可以直接中断响应,也可以交由其它服务器池执行。
Haproxy中的ACL汇总设置在frontend部分
语法:
acl 名称 方法 -i [匹配的路径或文件]
说明:
acl:区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl。
-i:忽略大小写
-f:从指定的文件中加载模式;
方法:用来设定实现ACL的方法。
常用的方法:
1、hdr_beg(host):用于测试请求报文的指定首部的开头部分是否符合指定的模式
例子:
acl host_static hdr_beg(host) -i img. video. download. ftp.
测试请求是否为提供静态内容的主机img、video、download或ftp。
2、hdr_end(host):用于测试请求报文的指定首部的结尾部分是否符合指定的模式
例子:
acl host_static hdr_beg(host) -i .aa.com .bb.com
3、hdr_reg(host):正则匹配
例子:
acl bbs hdr_reg(host) -i ^(bbs.test.com|shequ.test.com|forum)
4、url_sub:表示请求url中包含什么字符串
5、url_dir:表示请求url中存在哪些字符串作为部分地址路径
6、path_beg: 用于测试请求的URL是否以指定的模式开头
例子:
acl url_static path_beg -i /static /iilannis /javascript /stylesheets
用于测试URL是否以/static、/iilannis、/javascript或/stylesheets开头。
7、path_end:用于测试请求的URL是否以指定的模式结尾
例子:
acl url_static path_end -i .jpg .gif .png .css .js
测试URL是否以.jpg、.gif、.png、.css或.js结尾。
也可以根据访问的地址和端口进行规制设置:
dst:目标地址
dst_port:目标端口
src:源地址
src_port:源端口
实现的结果:
当客户端访问haproxy时,请求的是静态文件内容时,请求转交给static server,请求的是php内容时,请求转交给php server,请求的是jsp内容时,请求转交给tomcat server,以实现动静分离。
先部署三台web服务器:
一台httpd支持php
一台部署nginx支持静态资源
一台tomcat支持jsp
yum install -y
pcre-devel
bzip2-devel
gcc
gcc-c++
make
tar xzvf haproxy-1.5.15.tar.gz -C /opt
cd /opt/haproxy-1.5.15
make TARGET=linux26 PREFIX=/usr/local/haproxy //标识64为系统
make install PREFIX=/usr/local/haproxy
mkdir /etc/haproxy
useradd -s /sbin/nologin -M haproxy
cp /opt/haproxy-1.5.15/examples/haproxy.cfg /etc/haproxy/
vi /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local3
maxconn 204800
chroot /usr/local/haproxy
user haproxy
group haproxy
daemon
nbproc 1
pidfile /var/run/haproxy.pid
stats socket /usr/local/haproxy/stats
description haproxy server
#---------------------------------------------------------------------
#common defaults that all the ‘listen’ and ‘backend’ sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults
log global
mode http
maxconn 10000
option httplog
option httpclose
option dontlognull
option forwardfor except 127.0.0.0/8
retries 3
option redispatch
option abortonclose
balance roundrobin
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
#---------------------------------------------------------------------
#use listen setting the haproxy status for site
#---------------------------------------------------------------------
listen admin_status #设置haproxy监控状态
bind *:8089
mode http
log 127.0.0.1 local3 err
stats refresh 5s
stats uri /status #监控状态页面访问url
stats realm www.skeryp.com
stats auth admin:admin
stats hide-version
stats admin if TRUE
#---------------------------------------------------------------------
#main listen which proxys to the backends
#---------------------------------------------------------------------
listen www
bind *:80
maxconn 5000
mode http
log global
option httplog
option httpclose
option forwardfor
log global
default_backend default #设置默认访问页面
#定义当请求的内容是静态内容时,将请求转交给static server的acl规则
acl url_static path_beg -i /static /images /img /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js .html
acl host_static hdr_beg(host) -i img. video. download. ftp. imags. videos.
#定义当请求的内容是php内容时,将请求转交给php server的acl规则
acl url_php path_end -i .php
#定义当请求的内容是.jsp或.do内容时,将请求转交给tomcat server的acl规则
acl url_jsp path_end -i .jsp .do
#引用acl匹配规则
use_backend static_pool if url_static or host_static
use_backend php_pool if url_php
use_backend tomcat_pool if url_jsp
#定义后端backend server
backend static_pool
option httpchk GET /index.html
server static1 192.168.80.101:80 cookie id1 check inter 2000 rise 2 fall 3
backend php_pool
option httpchk GET /info.php
server php1 192.168.80.102:80 cookie id1 check inter 2000 rise 2 fall 3
backend tomcat_pool
option httpchk GET /index.jsp
server tomcat1 192.168.80.103:8086 cookie id2 check inter 2000 rise 2 fall 3
#<----------------------default site for listen and frontend------------------------------------>
backend default
mode http
option httpchk GET /index.html
server default 192.168.80.104:80 cookie id1 check inter 2000 rise 2 fall 3 maxconn 5000