一、常用的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:正則表達式:其機制類同字符串匹配;
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