HAProxy(一)之常用配置介紹,ACL詳解

1、HAProxy簡介

HAProxy 是一款高性能TCP/HTTP 反向代理負(fù)載均衡服務(wù)器,具有如下功能:

  • 根據(jù)靜態(tài)分配的cookies完成HTTP請求轉(zhuǎn)發(fā)
  • 在多個服務(wù)器間實(shí)現(xiàn)負(fù)載均衡,并且根據(jù)HTTP cookies 實(shí)現(xiàn)會話粘性
  • 主備服務(wù)器切換
  • 接受訪問特定端口實(shí)現(xiàn)服務(wù)監(jiān)控
  • 實(shí)現(xiàn)平滑關(guān)閉服務(wù),不中斷已建立連接的請求響應(yīng),拒絕新的請求
  • 在請求或響應(yīng)HTTP報文中添加,修改,或刪除首部信息
  • 根據(jù)正則規(guī)則阻斷請求
  • 提供帶有用戶認(rèn)證機(jī)制的服務(wù)狀態(tài)報告頁面

HAProxy特別適用于那些負(fù)載特大的web站點(diǎn),這些站點(diǎn)通常又需要會話保持或七層處理。HAProxy運(yùn)行在時下的硬件上,完全可以支持?jǐn)?shù)以萬計的 并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。

HAProxy 實(shí)現(xiàn)了一種事件驅(qū)動、單一進(jìn)程模型,此模型支持非常大的并發(fā)連接數(shù)。多進(jìn)程或多線程模型受內(nèi)存限制 、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制,很少能處理數(shù)千并發(fā)連接。事件驅(qū)動模型因?yàn)樵谟懈玫馁Y源和時間管理的用戶端(User-Space) 實(shí)現(xiàn)所有這些任務(wù),所以沒有這些問題。此模型的弊端是,在多核系統(tǒng)上,這些程序通常擴(kuò)展性較差。這就是為什么他們必須進(jìn)行優(yōu)化以 使每個CPU時間片(Cycle)做更多的工作。

HAProxy實(shí)際工作中,它占用用戶空間時間要比內(nèi)核運(yùn)行時間少20倍,所以對系統(tǒng)參數(shù)調(diào)優(yōu)是十分必要的一項(xiàng)工作。

另外衡量一個負(fù)載均衡服務(wù)器主要考量三個指標(biāo):

1、session rate

此項(xiàng)指標(biāo)非常重要,它決定了一個load balancer 能不能分發(fā)所有接受的請求。這項(xiàng)指標(biāo)通常是由CPU性能決定。測量指標(biāo)的大小跟傳輸?shù)拿總€對象的大小有關(guān),通常用空對象來測試,Session rates 在 100,000 sessions/s 左右,使用 Xeon E5 在 2014測試。

2、session concurrency

該指標(biāo)與前一指標(biāo)相關(guān)聯(lián)。這一指標(biāo)與服務(wù)器內(nèi)存和系統(tǒng)可以處理的文件描述符數(shù)量有關(guān)。 通常每個session占用34KB,即大概3W個session占用1GB內(nèi)存空間,實(shí)際上,socket buffer也會占用內(nèi)存空間,2W個session socket占用1GB內(nèi)存。

3、data forwarding rate

這一指標(biāo)與 session rate 相對立,它的衡量單位通常是 Megabytes/s (MB/s), 或者 Gigabits/s (Gbps)。傳輸較大的對象有利于該指標(biāo)的提升,因?yàn)檩^大的對象傳輸可以減少session建立和關(guān)閉浪費(fèi)的時間。而測量session rate 則在傳輸小對象時有利于指標(biāo)提升。haproxy 在2014年使用 Xeon E5 測試成績?yōu)?0 Gbps。

2、HAProxy程序環(huán)境

本文環(huán)境:CentOS7, haproxy 1.5 通過yum 安裝

程序環(huán)境:
    配置文件:/etc/haproxy/haproxy.cfg
        Unit File: haproxy.service
        主程序:/usr/sbin/haproxy
        
配置文件:
    global:全局配置段
        進(jìn)程及安全配置相關(guān)的參數(shù)
        性能調(diào)整相關(guān)的參數(shù)
        Debug相關(guān)的參數(shù)
    proxies:代理配置段
        defaults:為frontend, backend以及l(fā)isten提供默認(rèn)配置;
        frontend:前端,相當(dāng)于Nginx中的server{ ... };
        backend:后端,相當(dāng)于nginx中的upstream { ...  };
        listen:前后端的直接組合;
    **關(guān)于前端與后端的關(guān)系:一個前端可以指向多個后端;同時一個后端可以被多個調(diào)用。

3、HAProxy配置詳解

3.1 global配置段

3.1.1 進(jìn)程相關(guān)配置

  • 定義日志系統(tǒng)相關(guān)屬性

      log <address> [len <length>] <facility> [max level [min level]]
    

harpoxy 將日志發(fā)送到指定的rsyslog服務(wù)器,在本地記錄也要開啟rsyslog服務(wù);
全局端最多可配置兩個log 服務(wù)器;
< address> :日志服務(wù)器地址
[ len ] 指定記錄的日志最大長度

  • 定義運(yùn)行用戶,所屬組
    1、username
    2、group groupname

  • 運(yùn)行方式
    1、意味著后臺守護(hù)進(jìn)程

3.1.2 參數(shù)調(diào)優(yōu)

maxconn <number>:設(shè)定單haproxy進(jìn)程的最大并發(fā)連接數(shù);
maxconnrate <number>:設(shè)定單haproxy進(jìn)程每秒接受的連接數(shù);
maxsslconn <number>:設(shè)定單haproxy進(jìn)程的ssl連接最大并發(fā)連接數(shù);
maxsslrate <number>:單haproxy進(jìn)程的ssl連接的創(chuàng)建速率上限;
spread-checks <0..50, in percent>:避免對于后端檢測同時并發(fā)造成
的問題,設(shè)置錯開時間比,范圍0到50,一般設(shè)置2-5較好。

3.1.3 用戶列表

用于對haproxy 狀態(tài)監(jiān)控頁面的用戶認(rèn)證。至少要定義一個用戶列表并且添加一個用戶
密碼可以加密或明文。

Example:

userlist L1
  group G1 users tiger,scott
  group G2 users xdb,scott

  user tiger password $6$k6y3o.eP$JlKqe4(...)xHSwRv6J.C0/D7cV91
  user scott insecure-password elgato
  user xdb insecure-password hello

userlist L2
  group G1
  group G2

  user tiger password $6$k6y3o.eP$JlKBx(...)xHSwRv6J.C0/D7cV91 groups G1
  user scott insecure-password elgato groups G1,G2
  user xdb insecure-password hello groups G2

3.2 proxy配置段

這部分配置在下列定義區(qū)域下使用

    - defaults  < name >
    - frontend < name >
    - backend  < name >
    - listen   < name >

“defaults” 區(qū)域定義了frontend,backend,listen 的默認(rèn)參數(shù)
“frontend" 區(qū)域描述了接收客戶端請求的監(jiān)聽配置
"backend" 區(qū)域描述接受請求處理的后端服務(wù)器配置
"listen" 區(qū)域描述一組前端和后端直接一對一綁定的組配置

HAProxy 配置的關(guān)鍵字與區(qū)域限制特性,即有些關(guān)鍵字在某個區(qū)域不可以使用

下面開始講解關(guān)鍵字的用法

3.2.1 常用配置指令

1. bind [<address>]:<port_range> [, ...] [param*]

僅在frontend和listen區(qū)域使用。定義服務(wù)監(jiān)聽端口地址等參數(shù)
[ param* ] 參數(shù)根據(jù)系統(tǒng)而定,一般不需要指定

example:

bind :80     #監(jiān)聽本機(jī)所有IP的80端口
bind *:80    #監(jiān)聽本機(jī)所有IP的80端口
bind 192.168.12.1:8080,10.1.0.12:8090
2. mode {tcp|http|health}

tcp:基于layer4實(shí)現(xiàn)代理,可代理大多數(shù)基于tcp的應(yīng)用層協(xié)議,例如ssh/mysql/pgsql等;
http:客戶端的http請求會被深度解析;
health:工作為健康狀態(tài)檢查響應(yīng)模式,當(dāng)請求到達(dá)時僅回應(yīng)“OK”即斷開連接;

3. balance <algorithm> [ <arguments> ]
   balance url_param <param> [check_post]

在backend區(qū)域定義調(diào)度算法:

< algorithm > 如下:

  • roundrobin:
帶有權(quán)重的輪詢調(diào)度算法;
server后面使用weight來定義權(quán)重;
動態(tài)算法:支持權(quán)重的運(yùn)行時調(diào)整,支持慢啟動(緩慢接收大量請求在剛啟動時);僅支持最大4095個后端活動主機(jī)
  • static-rr:
靜態(tài)的roundrobin算法;
不支持權(quán)重的運(yùn)行時調(diào)整及慢啟動;但后端主機(jī)數(shù)量無限制;
  • leastconn:
帶權(quán)重的最少連接分配動態(tài)算法;
適用長連接應(yīng)用協(xié)議,如ssh等
  • first:
第一優(yōu)先算法;
如果第一個服務(wù)端可接受請求則總是把連接分配給它,直到第一個服務(wù)端處于繁忙,分配給下一個,順序按服務(wù)端的數(shù)字ID從小到大排列
  • source
源IP hash 算法;
該算法保證在后端服務(wù)器組沒有減少或增加的情況下,能將來自同一客戶端IP的請求分配至同一個服務(wù)端;
該算法適合在無法使用cookie插入的TCP模式下使用
動態(tài)算法或靜態(tài)算法取決于hash-type;
  • uri
uri hash 算法;
該算法hash uri 的查詢標(biāo)記的左側(cè)部分,或者指定whole 參數(shù)時hash全部uri;
該算法保證訪問同一uri的請求分配至同一服務(wù)端,適用于后端為緩存服務(wù)器的情況,以提高緩存命中率;
動態(tài)算法或靜態(tài)算法取決于hash-type;
另外:該算法支持追加參數(shù)[ < arguments > ]:
(1) whole :hash完整uri 
(2) len number:hash指定uri的長度
(3) depth nubmer:hash指定目錄深度,每個"/"代表一個深度
  • uri_param
param hash 算法;
對用戶請求的url中的< param >部分中的指定的參數(shù)的值(uri中"="部分)作hash計算;
該算法適用于有用戶識別參數(shù)的uri ,它保證同一user id 的請求分配至同一服務(wù)端;
如果check_post 標(biāo)識啟用,則在uri中沒有找到"?"參數(shù)時,對HTTP Post 請求實(shí)體查找參數(shù)聲明;
動態(tài)算法或靜態(tài)算法取決于hash-type;

Example:

balance url_param userid
balance url_param session_id check_post 64
  • hdr(< name >)
    HTTP 首部字段hash算法;

指定的http首部將會被取出做hash計算。如果沒有值,則降至輪詢調(diào)度;
動態(tài)算法或靜態(tài)算法取決于hash-type;

4. hash_type < method >

在balance 指令中選定與hash 有關(guān)的算法,都會受此影響。
默認(rèn)采取的方法為map-based
< method > 如下:

  • map-based:取模法,hash數(shù)據(jù)結(jié)構(gòu)是靜態(tài)數(shù)組;
    該hash是靜態(tài)的,不支持在線調(diào)整權(quán)重,不支持慢啟動;

該算法調(diào)度平滑,后端服務(wù)器能夠均勻承受負(fù)載;
缺點(diǎn)也是明顯的:當(dāng)服務(wù)器的總權(quán)重發(fā)生變化時,即有服務(wù)器上線或下線,都會導(dǎo)致調(diào)度結(jié)果整體改變。如果想避免此種情況應(yīng)采用consistent 方法;

  • consistent:一致性哈希,哈希的數(shù)據(jù)結(jié)構(gòu)是“樹”;
    該hash是動態(tài)的,支持在線調(diào)整權(quán)重,支持慢啟動

每一個server 會在"樹"中出現(xiàn)多次, 在樹中查找hash key,并選擇最近的server;
該方法的優(yōu)點(diǎn)在于,當(dāng)服務(wù)器的總權(quán)重發(fā)生變化時,對調(diào)度結(jié)果影響是局部的,不會引起大的變動。所以十分適合緩存服務(wù)器;
缺點(diǎn):該算法不夠平滑,很容易導(dǎo)致后端服務(wù)器負(fù)載不均衡。所以很有必要對服務(wù)器的權(quán)重以或者服務(wù)器ID進(jìn)行調(diào)整;
為保持均勻負(fù)載,應(yīng)該保證所有服務(wù)器ID保持一致;

5. server <name> <address>[:[port]] [param*]

default-server [param*]
server用于在backend和listen中定義一個主機(jī);
default-server 用于設(shè)定server的默認(rèn)參數(shù);

[param*] 如下:

  • weight < weight >:當(dāng)前server的權(quán)重;
  • id < number > :設(shè)定server ID
  • cookie < value >:為當(dāng)前server指定其cookie值,此值會在收到請求報文時進(jìn)行檢測,其功能在于實(shí)現(xiàn)基于cookie會話保持;
  • check:對當(dāng)前server進(jìn)行健康狀態(tài)檢測;
    inter < delay >:時間間隔;
    rise < count >:判定為“健康”狀態(tài)需要檢測的次數(shù),默認(rèn)2;
    fall < count >:判定為“不健康”狀態(tài)需要檢測的次數(shù),默認(rèn)3;
    addr <ipv4|ipv6>:健康狀態(tài)檢測時使用的地址;
    port < port >:健康狀態(tài)檢測時使用的端口;
    注意:默認(rèn)為傳輸層檢測,即探測端口是否能響應(yīng);需要執(zhí)行應(yīng)用層檢測,則需要httpchk, smtpchk, mysql-check, pgsql-check, ssl-hello-chk;
  • maxconn <maxconn>:當(dāng)前server的最大并發(fā)連接數(shù);
  • maxqueue <maxqueue>:當(dāng)前server的等待隊(duì)列的最大長度;
  • disabled:將主機(jī)標(biāo)記為不可用;
  • redir <prefix>:將發(fā)往當(dāng)前server的所有請求GET和HEAD類的請求均重定向至指定的URL;

Examples :

server first  10.1.1.1:1080 id 3 cookie first  check inter 1000 maxconn 10000 maxqueue 2000
server second 10.1.1.2:1080 id 4 cookie second check inter 1000
6. option httpchk
   option httpchk <uri>
   option httpchk <method> <uri>
   option httpchk <method> <uri> <version>    

基于http協(xié)議作7層健康狀態(tài)檢測機(jī)制,默認(rèn)是基于tcp層進(jìn)行檢測;
TCP 模式也可以使用該檢測機(jī)制
< method > < uri > < version >:請求報文的超始行;
method 默認(rèn)方法為 OPTIONS;返回狀態(tài)碼2XX,3XX意味成功;

Examples :

# Relay HTTPS traffic to Apache instance and check service availability
# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
backend https_relay
    mode tcp
    option httpchk OPTIONS /index.html HTTP/1.1\r\nHost:\ www
    server apache1 192.168.1.1:443 check port 80

7. http-check expect [!] <match> <pattern>

定義檢測有效期望值;
! 表示認(rèn)定的錯誤值;< match > 可取值為:

  • status < string >
  • rstatus < regex > 正則方式
  • string < string >
  • rstring < regex >

Examples :

# only accept status 200 as valid
http-check expect status 200

# consider SQL errors as errors
http-check expect ! string SQL\ Error

# consider status 5xx only as errors
http-check expect ! rstatus ^5

# check that we have a correct hexadecimal tag before /html
http-check expect rstring <!--tag:[0-9a-f]*</html>

8. cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]

啟用基于cookie的會話黏性,要結(jié)合server指定的cookie參數(shù)一起實(shí)現(xiàn);
常用形式:cookie WEBSRV insert nocache indirect

Example:

backend websrvs
balance     roundrobin
cookie WEBSRV insert nocache indirect
server      web1 10.1.0.68:80 check weight 2 maxconn 5000 cookie web1
server      web2 10.1.0.69:80 check weight 1 maxconn 3000 cookie web2
9. default_backend <backend>

當(dāng)use_backend 的使用規(guī)則沒有被匹配時,由default_backend 指定默認(rèn)服務(wù)器組;
關(guān)于use_backend 使用后續(xù)會在acl 章節(jié)中講解;

3.2.2 log 相關(guān)

frontendbackend定義日志記錄機(jī)制;

log global  :使用全局定義的日志記錄方式
log <address> [len <length>] <facility> [<level> [<minlevel>]]:自定義
no log :不記錄
capture request header <name> len <length>
-->記錄請求報文中的指定的首部的值于日志中;len用于指定要記錄的信息的長度;
capture response header <name> len <length>
-->記錄響應(yīng)報文中的指定的首部的值于日志中;len用于指定要記錄的信息的長度;
示例:
    capture request header Referer len 30

3.2.3 自定義錯誤頁面

errorfile <code> <file>

< code > 指定HTTP返回的狀態(tài)碼。200, 400, 403, 408, 500, 502, 503, and 504 可使用;
< file > 指定一個文件代替HTTP響應(yīng);

Example:

errorfile 503 /etc/haproxy/errorfiles/503sorry.http
- errorloc <code> <url>
- errorloc302 <code> <url>

發(fā)生錯誤時由haproxy重定向至指定url,以上兩個命令等同,響應(yīng)狀態(tài)碼為302

Example:

errorloc 503 http://www.mydomain.com/index...
- errorloc303 <code> <url>

響應(yīng)狀態(tài)碼為303,表示以GET方法重新請求頁面

3.2.4 修改請求或響應(yīng)報文首部

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]

HAProxy把請求報文發(fā)往后端主機(jī)之前在請求報文添加“X-Forwared-For”首部
目的為使后端服務(wù)器可記錄發(fā)出請求客戶端的IP地址
[ except < network> ] :選擇排除的網(wǎng)絡(luò)地址
[ header < name> ] :不使用X-Forwared-For,自定義名稱
[ if-none ]:有時請求原來帶有該字段,此時不再更改

Example:option forwardfor if-none

reqadd  <string> [{if | unless} <cond>]
rspadd <string> [{if | unless} <cond>]

在HTTP請求或響應(yīng)首部內(nèi)容尾部添加值
Example:rspadd X-Via: HAProxy/1.5

reqdel  <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>]  (不區(qū)分大小寫)        

刪除HTTP請求中正則匹配的所有首部

rspdel  <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>]  (不區(qū)分大小寫)

刪除HTTP響應(yīng)中正則匹配的所有首部。屬于安全加強(qiáng)策略,刪除一些服務(wù)器版本信息,防止針對攻擊
Example:rspidel Server.*

3.2.5 超時時長設(shè)定

timeout client <timeout>

設(shè)定客戶端最大非活動時長, 默認(rèn)單位是ms;最好與timeout server一致

timeout server <timeout>

設(shè)定服務(wù)端最大非活動時長, 默認(rèn)單位是ms;

timeout connect <timeout>

設(shè)定最大與服務(wù)端建立連接的時長

timeout http-keep-alive <timeout>

設(shè)定最大等待新請求的空閑時長,默認(rèn)單位為ms;

timeout client-fin <timeout>

在客戶端側(cè)設(shè)定半關(guān)閉連接非活動超時

timeout server-fin <timeout>

在服務(wù)端側(cè)設(shè)定半關(guān)閉連接非活動超時

Example:

defaults http
timeout connect 5s
timeout client 30s
timeout server 30s
timeout client-fin 10s
timeout http-keep-alive 500

4、使用ACLs和獲取樣本

Haproxy 能夠從請求報文,響應(yīng)報文,從客戶端或者服務(wù)端信息,從表,環(huán)境信息等等中提取數(shù)據(jù)。提取這樣的數(shù)據(jù)的動作我們稱之為獲取樣本。進(jìn)行檢索時,這些樣本可以用來實(shí)現(xiàn)各種目的,比如作為粘滯表的鍵,最常用的用途是,根據(jù)預(yù)定義的模式來進(jìn)行匹配。
訪問控制列表(ACL)提供一個靈活方案進(jìn)行內(nèi)容切換,或者在從請求,響應(yīng),任何環(huán)境狀態(tài)中提取的數(shù)據(jù)基礎(chǔ)之上做出決策??刂屏斜淼脑瓌t很簡單:

  • 從數(shù)據(jù)流,表,環(huán)境中提取數(shù)據(jù)樣本
  • 對提取的樣本可選地應(yīng)用格式轉(zhuǎn)換
  • 對一個樣本應(yīng)用一個或多個模式匹配
  • 當(dāng)模式匹配樣本時才執(zhí)行動作

執(zhí)行的動作通常是阻斷請求,選擇一個后端服務(wù)器或者添加一個HTTP首部
需要提醒的是,獲取的樣本數(shù)據(jù)不光可以使用在acl中,也可以使用別處,例如記錄log中

定義ACL的語法為:

acl <aclname> <criterion> [flags] [operator] [<value>] ...

這樣一條語句建立了一個acl 測試;
這些測試應(yīng)用在請求或響應(yīng)中被"標(biāo)準(zhǔn)"< criterion > 部分所指定的內(nèi)容,而且可以指定[ flags] 進(jìn)行特性調(diào)整,有些< criterion > 支持操作符[operator] 進(jìn)行運(yùn)算,同時一些轉(zhuǎn)換格式的關(guān)鍵字可以跟在< criterion >后面,使用" , "隔開。而值[< value >] 要求被
< criterion > 所支持的數(shù)據(jù)形式,多個值使用空格分隔。
< criterion > 通常是指獲取樣本方法的名稱。使用一個獲取樣本方法,暗含著其輸出樣本的類型,類型是以下列出的一種:

  • boolean
  • integer (signed or unsigned)
  • IPv4 or IPv6 address
  • string
  • data block

ACL引擎匹配數(shù)據(jù)使用的模式類型如下:

  • boolean
  • integer or integer range
  • IP address / network
  • string (exact, substring, suffix, prefix, subdir, domain)
  • regular expression
  • hex block

ACL flags 可用列表如下:

  • -i : 忽略大小寫
  • -f filename : 從文件中載入模式
  • -m method : 指定模式匹配方法
  • -n : 禁止DNS解析
  • -M : -f 載入的文件作為映射文件使用
  • -u : 強(qiáng)制ACL的名稱唯一
  • -- : 強(qiáng)制結(jié)束flag結(jié)束,避免了字符串中含有的- 引起混淆
    其中flag中的 -m 選項(xiàng)可使用的模式匹配方法如下,需要說明的是有些方法已被默認(rèn)指定無需聲明,例如int,ip
  • "found" : 只是用來探測數(shù)據(jù)流中是否存在指定數(shù)據(jù),不進(jìn)行任何比較
  • "bool" : 檢查結(jié)果返回布爾值。匹配沒有模式,可以匹配布爾值或整數(shù),不匹配0和false,其他值可以匹配
  • "int" : 匹配整數(shù)類型數(shù)據(jù);可以處理整數(shù)和布爾值類型樣本,0代表false,1代表true
  • "ip" : 匹配IPv4,IPv6地址類型數(shù)據(jù)。該模式僅被IP地址兼容,不需要特別指定
  • "bin" : 匹配二進(jìn)制數(shù)據(jù)
  • "len" : 匹配樣本的長度的整數(shù)值
  • "str" : 精確匹配,根據(jù)字符串匹配文本
  • "sub" : 子串匹配,匹配文本是否包含子串
  • "reg" : 正則匹配,根據(jù)正則表達(dá)式列表匹配文本
  • "beg" : 前綴匹配,檢查文本是否以指定字符串開頭
  • "end" : 后綴匹配,檢查文本是否以指定字符串結(jié)尾
  • "dir" : 子目錄匹配,檢查部分文本中以" / "作為分隔符的內(nèi)容是否含有指定字符串
  • "dom" : 域匹配。檢查部分文本中以" . "作為分隔符的內(nèi)容是否含有指定字符串

如果獲取樣本值為整數(shù),數(shù)值比較符可使用,:

eq : true if the tested value equals at least one value
ge : true if the tested value is greater than or equal to at least one value
gt : true if the tested value is greater than at least one value
le : true if the tested value is less than or equal to at least one value
lt : true if the tested value is less than at least one value

想必前面一堆理論性的論述已經(jīng)把大家搞的暈頭轉(zhuǎn)向,下面結(jié)合獲取樣本方法和訪問控制動作指令具體闡述ACL使用方法

先介紹控制動作指令

  • layer 4 傳輸層控制指令

      tcp-request connection <action> [{if | unless} <condition>]
    

對tcp請求控制指令:
< condition > 即為ACL定義的訪問控制列表
< action > 常用值有 "accept", "reject"

  • layer 7 應(yīng)用層控制指令
#阻斷符合ACL的訪問請求
block { if | unless } <condition> 
#http請求的控制指令
http-request { allow | deny}  [ { if | unless } <condition> ]

  • 后端主機(jī)調(diào)用

      #根據(jù)條件來調(diào)用指定后端
      use_backend <backend> [{if | unless} <condition>]
    
  • 由ACL定義的多個< condition > 組成聯(lián)合條件,邏輯符為

  • and (默認(rèn)操作符,可省略)

  • or (或者使用 "||")

  • ! (取反)

4.1 獲取內(nèi)部狀態(tài)樣本

# 與后端建立會話速率,每秒鐘建立的新會話
be_sess_rate([<backend>]) : integer

Example :

# 某后端被請求過于繁忙,則重定向至錯誤頁
    mode http
    acl being_scanned be_sess_rate gt 100
    redirect location /denied.html if being_scanned

4.2 獲取layer 4 樣本

在傳輸層獲取樣本,通常是TCP/IP 協(xié)議的IP和端口,以及建立連接速率等等。而且此部分樣本通常用于"tcp-request connection"指令中的規(guī)則之中。

    dst : ip             #目標(biāo)地址
    dst_port : integer
    src : ip             #源地址
    src_port : integer

Example:

#阻斷來自非指定IP的訪問8080端口的請求
acl myhost src 10.1.0.200
acl myport dst_port 8080
tcp-request connection reject if !myhost myport        

4.3 獲取layer 7 樣本

/1

path : string

提取請求url的地址信息,從第一個"/"開始,不包含host,不包含參數(shù)
ACL 衍生,即包含了-m 選項(xiàng)中匹配模式方法 :
path : exact string match
path_beg : prefix match
path_dir : subdir match
path_dom : domain match
path_end : suffix match
path_len : length match
path_reg : regex match
path_sub : substring match

Example:

#請求資源為圖片,則調(diào)用圖片服務(wù)器后端
 acl picture path_end -i .jpg .png .gif
 use_backend server_pic if picture

/2

url : string

提取URL的全部內(nèi)容,包含host和參數(shù)
ACL 衍生類似,不再列舉

/3

req.hdr([<name>[,<occ>]]) : string

提取http請求的指定首部字段值,< occ >可指定出現(xiàn)的位置
ACL 衍生 :

  hdr([<name>[,<occ>]])     : exact string match
  hdr_beg([<name>[,<occ>]]) : prefix match
  hdr_dir([<name>[,<occ>]]) : subdir match
  hdr_dom([<name>[,<occ>]]) : domain match
  hdr_end([<name>[,<occ>]]) : suffix match
  hdr_len([<name>[,<occ>]]) : length match
  hdr_reg([<name>[,<occ>]]) : regex match
  hdr_sub([<name>[,<occ>]]) : substring match

Example:

#阻斷火狐瀏覽器發(fā)送的請求
acl firefox hdr_reg(User-Agent)     -i      .*firefox.*
block if firefox

/4

method : integer + string

提取請求報文中的請求方法

Example:


#拒絕GET HEAD 方式之外的HTTP請求
acl valid_method method GET HEAD
http-request deny if ! valid_method

4.4 內(nèi)建ACL

HAProxy有眾多內(nèi)建的ACLs,這些ACLs可直接調(diào)用,例如

  • LOCALHOST 匹配來自本地IP的連接,127.0.0.1/8
  • HTTP_1.1 匹配http版本1.1
  • METH_GET 匹配http請求GET或HEAD方法
  • TRUE
  • FALSE

Example:

#拒絕GET HEAD 方式之外的HTTP請求
http-request deny if ! METH_GET

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • 互聯(lián)網(wǎng)架構(gòu)基礎(chǔ)知識 一、網(wǎng)站常見架構(gòu) 負(fù)載層 頁面緩存層 web層 數(shù)據(jù)層 二、運(yùn)維法則 緩存為王 盡量在前端(緩...
    魏鎮(zhèn)坪閱讀 5,028評論 0 9
  • Haproxy是既可以工作在7層也能工作在4層的反代工具.Haproxy的功能: 路由HTTP請求到后端服務(wù)器,基...
    uangianlap閱讀 1,796評論 0 1
  • 目錄: HAProxy是什么 HAProxy的核心能力和關(guān)鍵特性 HAProxy的安裝和運(yùn)行 使用HAProxy搭...
    kelgon閱讀 80,516評論 9 159
  • 他坐在上首,是席間人人恭維的一方父母官。這是為他任命到期,離開邊城,升職京官而開的離別宴。 他修長的手指輕握著夜光...
    e8e28d21b918閱讀 101評論 0 0

友情鏈接更多精彩內(nèi)容