1. 程式人生 > >haproxy之ACL規則

haproxy之ACL規則

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