標籤:haproxy
一、常用的acl規則
haproxy的ACL用於實現基於請求報文的首部、響應報文的內容或其它的環境狀態資訊來做出轉寄決策,這大大增強了其配置彈性。其配置法則通常分為兩步,首先去定義ACL,即定義一個測試條件,而後在條件得到滿足時執行某特定的動作,如阻止請求或轉寄至某特定的後端。定義ACL的文法格式如下。
acl <aclname> <criterion> [flags] [operator] <value> ...
<aclname>:ACL名稱,區分字元大小寫,且其只能包含大小寫字母、數字、-(連接線)、_(底線)、.(點號)和:(冒號);haproxy中,acl可以重名,這可以把多個測試條件定義為一個共同的acl;
<criterion>:測試標準,即對什麼資訊發起測試;測試方式可以由[flags]指定的標誌進行調整;而有些測試標準也可以需要為其在<value>之前指定一個操作符[operator];
[flags]:目前haproxy的acl支援的標誌位有3個:
-i:不區分<value>中模式字元的大小寫;
-f:從指定的檔案中載入模式;
--:標誌符的強制結束標記,在模式中的字串像標記符時使用;
<value>:acl測試條件支援的值有以下四類:
整數或整數範圍:如1024:65535表示從1024至65535;僅支援使用正整數(如果出現類似小數的標識,其為通常為版本測試),且支援使用的操作符有5個,分別為eq、ge、gt、le和lt;
字串:支援使用“-i”以忽略字元大小寫,支援使用“\”進行轉義;如果在模式首部出現了-i,可以在其之前使用“--”標誌位;
regular expressions:Regex:其機制類同字串匹配;
IP addresses and networks:IP地址及網路地址;
同一個acl中可以指定多個測試條件,這些測試條件需要由邏輯操作符指定其關係。條件間的組合測試關係有三種:“與”(預設即為與操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。
常用的測試標準(criteria):
1. be_sess_rate(backend) <integer>
用於測試指定的backend上會話建立的速率(即每秒建立的會話數)是否滿足指定的條件;常用於在指定backend上的會話速率過高時將使用者請求轉寄至另外的backend,或用於阻止攻擊行為。例如:
backend dynamic
mode http
acl being_scanned be_sess_rate gt 50
redirect location /error_pages/denied.html if being_scanned
2. fe_sess_rate(frontend) <integer>
用於測試指定的frontend(或當前frontend)上的會話建立速率是否滿足指定的條件;常用於為frontend指定一個合理的會話建立速率的上限以防止服務被濫用。例如下面的例子限定入站郵件速率不能大於50封/秒,所有在此指定範圍之外的請求都將被延時50毫秒。
frontend mail
bind :25
mode tcp
maxconn 500
acl too_fast fe_sess_rate ge 50
tcp-request inspect-delay 50ms
tcp-request content accept if ! too_fast
tcp-request content accept if WAIT_END
3. hdr(header) <string>
用於測試請求報文中的所有首部或指定首部是否滿足指定的條件;指定首部時,其名稱不區分大小寫,且在括弧“()”中不能有任何多餘的空白字元。測試伺服器端的響應報文時可以使用shdr()。例如下面的例子用於測試首部Connection的值是否為close。
hdr(Connection) -i close
4. method <string>
測試HTTP請求報文中使用的方法。
5. path_beg <string>
用於測試請求的URL是否以<string>指定的模式開頭。下面的例子用於測試URL是否以/static、/iilannis、/javascript或/stylesheets頭。
acl url_static path_beg -i /static /iilannis /javascript /stylesheets
#url 目錄
6. path_end <string>
用於測試請求的URL是否以<string>指定的模式結尾。例如,下面的例子使用者測試URL是否以jpg、gif、png、css或js結尾。
acl url_static path_end -i .jpg .gif .png .css .js
#url 結尾檔案
7. hdr_beg <string>
用於測試請求報文的指定首部的開頭部分是否符合<string>指定的模式。例如,下面的例子用記測試請求是否為提供靜態內容的主機img、video、download或ftp。
acl host_static hdr_beg(host) -i img. video. download. ftp.
8. hdr_end <string>
用於測試請求報文的指定首部的結尾部分是否符合<string>指定的模式。例如,下面的例子用記測試請求是否為
9. hdr_reg <string>
正則匹配
acl bbs hdr_reg(host) -i ^(bbs.test.com|shequ.test.com|forum)
use_backend bbs_pool if bbs or bbs_path #注意 "or"
二、會話保持
haproxy負載平衡保持用戶端和伺服器Session的三種方式:
2.1 使用者源IP 識別
haroxy 將使用者IP經過hash計算後 指定到固定的真實伺服器上(類似於nginx 的IP hash 指令)
配置指令 balance source
backend www
mode http
balance source
server web1 192.168.0.150:80 check inter 1500 rise 3 fall 3
server web2 192.168.0.151:80 check inter 1500 rise 3 fall 3
2.2 cookie 識別
haproxy 將WEB服務端發送給用戶端的cookie中插入(或添加加首碼)haproxy定義的後端的伺服器COOKIE ID。
配置指令例舉 cookie SESSION_COOKIE insert indirect nocache
用firebug可以觀察到使用者的要求標頭的cookie裡 有類似" Cookie jsessionid=0bc588656ca05ecf7588c65f9be214f5;
SESSION_COOKIE=app1"
SESSION_COOKIE=app1就是haproxy添加的內容。
backend COOKIE_srv
mode http
cookie SESSION_COOKIE insert indirect nocache
server web1 192.168.0.150:80 cookie 1 check inter 1500 rise 3 fall 3
server web2 192.168.0.151:80 cookie 2 check inter 1500 rise 3 fall 3
2.3 session 識別
haproxy 將後端伺服器產生的session和後端伺服器標識存在haproxy中的一張表裡。用戶端請求時先查詢這張表。
配置指令:appsession <cookie> len <length> timeout <holdtime>
配置指令例舉 appsession JSESSIONID len 64 timeout 5h request-learn
配置舉例
backend APPSESSION_srv
mode http
appsession JSESSIONID len 64 timeout 5h request-learn
server web1 192.168.0.150:80 cookie 1 check inter 1500 rise 3 fall 3
server web2 192.168.0.151:80 cookie 2 check inter 1500 rise 3 fall 3
本文出自 “蘭州linux營運” 部落格,請務必保留此出處http://linuxzkq.blog.51cto.com/9379412/1701630
Haproxy 常用acl規則與會話保持