經常使用配置選項:css
OPTION 選項:html
option httpclose :HAProxy會針對客戶端的第一條請求的返回添加cookie並返回給客戶端,客戶端發送後續請求時會發送前端
此cookie到HAProxy,HAProxy會針對此cookie分發到上次處理此請求的服務器上,若是服務器不能忽略node
此cookie值會影響處理結果。若是避免這種狀況配置此選項,防止產生多餘的cookie信息。mysql
option forwardfor :若是服務器上的應用程序想記錄發起請求的客戶端的IP地址,須要在HAProxy上配置此選項,這樣ios
HAProxy會把客戶端的IP信息發送給服務器,在HTTP請求中添加"X-Forwarded-For"字段。正則表達式
option originalto :若是服務器上的應用程序想記錄發起請求的原目的IP地址,須要在HAProxy上配置此選項,這樣HAProxyredis
會添加"X-Original-To"字段。算法
option dontlognull :保證HAProxy不記錄上級負載均衡發送過來的用於檢測狀態沒有數據的心跳包。sql
BALANCE 選項:
balance source :若是想讓HAProxy按照客戶端的IP地址進行負載均衡策略,即同一IP地址的全部請求都發送到同一服務
器時,須要配置此選項。
balance roundrobin :HAProxy把請求輪流的轉發到每個服務器上,依據每臺服務器的權重,此權重會動態調整。最常
見的默認配置。
COOKIE 選項:
cookie JSESSIONID prefix :若是客戶端只支持一個cookie,而且服務器上的應用程序已經對返回設置了cookie,
HAProxy設置此選項能夠改寫應用程序設置的cookie信息,把服務器的信息添加到原cookie中去。
cookie SERVERID indirect :HAProxy會刪除添加的cookie信息,避免此cookie信息發送到服務器。
cookie SERVERID rewrite :
cookie SERVERID insert :
cookie SERVERID insert nocache :
cookie SERVERID insert postonly :
option httpclose
no option httpclose
Enable or disable passive HTTP connection closing 啓用或禁止消極的HTTP鏈接關閉
May be used in sections : defaults | frontend | listen | backend
yes | yes | yes | yes
Arguments : none
默認的,客戶端與服務端的通信,HAProxy只作分析、日誌和分析每一個鏈接的第一個request。若是設置了 "option
httpclose" , 則會檢查雙向的http頭是否有"Connection: close",若是沒有則自動添加,使每一個客戶端或服務端在每次傳輸後,都會主動關閉TCP鏈接,使HTTP傳輸處於HTTP close模式下。任何 "Connection" 頭若是不是"close",都會被移除。
不多會有服務器不正確的忽略掉頭,即便收到"Connection: close"也不關閉鏈接,不然就是不兼容HTTP 1.0瀏覽器標準。 若是發生這種狀況,可使用"option forceclose",在服務端響應後主動關閉請求鏈接。選項 "forceclose"還能夠及早釋放服務鏈接,而沒必要等到客戶端的應答確認。
這個選項能夠設置在frontend或backend上,只要其上能夠創建鏈接。若是同時設置了"option forceclose",那麼它比"httpclose"優先。若是同時設置了 "option http-server-close",則會實現"option forceclose"的效果。
option forceclose
no option forceclose
Enable or disable active connection closing after response is transferred. 啓用或禁止response後的主動關閉鏈接
May be used in sections : defaults | frontend | listen | backend
yes | yes | yes | yes
Arguments : none
有的HTTP服務器收到"option httpclose"設置的"Connection: close",也不會關閉鏈接,若是客戶端也不關閉,鏈接會 一直打開,直到超時。這會形成服務器上同一時段內的大量鏈接,日誌中也會顯示較高的全局會話時間。
此時,可使用 "option forceclose",當完成響應時,當即關閉對外的服務通道。該選項隱式打開httpclose選項。須要注意,該選項容許解析完整的request 和 response,因此能夠很快關閉至服務器的鏈接,比httpclose更早釋放一些資源。
若是同時啓用了"option http-pretend-keepalive",雖然會禁止發送 "Connection: close"頭,可是依然會在整個response被接收後,關閉鏈接。
option http-server-close
no option http-server-close
Enable or disable HTTP connection closing on the server side 啓用或禁止關閉服務端的HTTP鏈接
May be used in sections : defaults | frontend | listen | backend
yes | yes | yes | yes
Arguments : none
默認的,客戶端與服務端通信,haproxy 只是分析、記日誌,並處理每一個鏈接的第一個請求。該選項設置server端爲HTTP 鏈接關閉模式,並支持客戶端爲HTTP keep-alive的pipelining模式。提供了最低的客戶端延遲和最快的服務端會話重用,以節省服務資源,相似"option forceclose"。還容許無keepalive能力的服務端在keep-alive模式下爲客戶端提供服務,可是須要符合 RFC2616。須要注意的是,有些服務器遇到"Connection: close" 時並不老是執行關閉,那麼keep-alive 則沒法使用,解決方法是啓用 "option http-pretend-keepalive".
目前,日誌沒法指明請求是否來自同一會話;日誌中的接收日期爲前一個請求的結束;請求時間爲新請求的等待時間;keep-alive request time 存活請求時間爲超時時間,綁定 "timeout http-keep-alive" 或 "timeout http-request"的設置。
這個操做能夠設置在frontend或backend上,只要其上能夠創建鏈接。須要注意的是,這個選項能夠與 "option httpclose"結合, 但 "option httpclose"優先級更高,結合後基本實現了forceclose的效果。
option http-pretend-keepalive (http-僞裝-長鏈接)
no option http-pretend-keepalive
Define whether haproxy will announce keepalive to the server or not 定義 haproxy 與服務器是不是 keepalive 的。
May be used in sections : defaults | frontend | listen | backend
yes | yes | yes | yes
Arguments : none
當聲明瞭 "option http-server-close" 或 "option forceclose", haproxy會在給server的request頭中添加 "Connection: close" 。然而有些服務器看到這個頭,會返回未知長度的response,並自動避免chunked encoding,其實這是不對的。它會阻止haproxy保持客戶端長鏈接,還會使客戶端或緩存接收了未完成的響應,卻認爲響應結束了。
設置 "option http-pretend-keepalive", haproxy會在服務器端保持長鏈接,服務端則不會出現前面的問題。當 haproxy 獲取了完整的response, 纔會以相似forceclose的方式關閉服務端。這樣客戶端獲得一個普通的響應,鏈接也在服務端被正常關閉。
建議不將其設爲默認值,由於大部分服務器會在發送完最後一個包以後更高效的關閉鏈接,並釋放緩存,並且網絡上的數據包也會略微下降總體的峯值性能。可是啓用該選項,haproxy會略微少作一些工做。因此若是haproxy在整個架構中是個瓶頸,能夠啓用該操做,以節省CPU。
這個選項能夠設置在frontend或backend上,只要其上能夠創建鏈接。這個選項能夠與 "option httpclose"結合, 使服務端keepalive,客戶端close,但並不建議這樣作。
balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post [<max_wait>]]
定義選擇後端服務的負載均衡算法
May be used in sections : defaults | frontend | listen | backend
yes | no | yes | yes
Arguments :
<algorithm> 是負載均衡時選擇服務器的算法,沒有持續信息時可用,或鏈接重定向到另外一個服務器。<algorithm> 能夠是如下幾種:
roundrobin 每一個服務器根據權重輪流使用,若是服務器的處理時間平均分佈,這是最流暢和公平的算法。算法是動態的,對於實例啓動慢的服務器的權重會在運行中調整。每一個backend的活動服務器在設計上限制爲4128個。在一些大的羣裏面, 當服務器很短的宕機後恢復回來,有時會有幾百個請求被從新整合到羣當中,並開始接收處理。儘管不多發生,可是很正常。這也說明了有機會監視它們,因此沒必要擔憂。
static-rr 每一個服務器根據權重輪流使用,相似roundrobin,但它是靜態的,意味着運行時修改權重是無效的。另外一方面,它對服務器的數量沒有設計上的限制,服務器啓動後便會當即進到羣中,整個分發方案會從新計算。這會略微下降CPU的運行(約1%)。
leastconn 鏈接數最低的服務器優先接收鏈接。Round-robin用於負載相同的服務器,使每臺服務器都被使用。leastconn建議用於長會話服務,例如LDAP, SQL, TSE等,而不是很適合短會話協議,如HTTP。算法是動態的,對於實例啓動慢的服務器的權重會在運行中調整。
source 對源IP地址進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。只要服務器正常,同一個客戶端IP地址老是訪問同一臺服務器。若是哈希的結果隨可用服務器數量而變化,那麼有的客戶端會定向到不一樣的服務器。該算法通常用於不能插入cookie的TCP模式。它還能夠用於廣域網上,爲拒絕使用會話cookie的客戶端提供最有效的粘連。該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據"hash-type"的變化作調整。
uri 對URI左端(問號以前)進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。只要服務器正常,同一個URI地址老是訪問同一臺服務器。通常用於代理緩存和反病毒代理,以最大限度的提升緩存的命中率。該算法只能用於HTTP後端。該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據"hash-type"的變化作調整。
算法支持兩個可選參數"len" 和 "depth", 都是後跟正整數。「len」參數指定算法只處理URI從頭開始的字符數,據此計算哈希。由於大多URI以"/"開頭,因此"len"最好不要設爲1。"depth" 參數指定URI中最大的路徑深度,據此計算哈希。請求中的每一個斜線爲一級。若是同時聲明瞭這兩個參數,則截取URI時必須同時知足。
url_param 在HTTP GET請求的查詢串中查找<param>中指定的URL參數。
若使用了修飾符"check_post",若是在URL問號('?')後面的查詢串中找不到參數,就會搜索HTTP POST 請求實體。或者在指定的一些字節後面嘗試搜索消息體。若是搜索不到實體, 則使用round robin算法。例如,假設客戶端老是在前128個字節發送LB參數,就能夠指定它。默認爲48。若是到達網關的字節數量不夠,實體數據是檢索不到的,至少有:(default/max_wait, Content-Length or first chunk length)。若是Content-Length沒有或爲0,就不須要等待客戶端發送更多的數據。當Content-Length有值且大於<max_wait>,則等待僅限於<max_wait>,並假設有足夠的數據用於搜索參數的存在。萬一Transfer-Encoding被用了,則只能檢查第一個塊。若是參數值被塊邊界分隔開,則只能隨機均衡負載了。
若是參數後面跟着 ('=') 和一個值,則能夠根據這個值進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。
還可用於跟蹤請求中的用戶身份,只要服務器正常,同一個用戶ID的請求老是發給同一臺服務器。若是沒有參數或參數沒有值,則使用輪詢算法。該算法只用於HTTP後端。該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據"hash-type"的變化作調整。
hdr(name) 在每一個HTTP請求中查找HTTP頭<name>。與ACL函數'hdr()'同樣。括號括起來的頭名字不區分大小寫。若是缺乏頭或頭沒有任何值,則使用roundrobin算法代替。
啓用參數'use_domain_only',哈希算法將只用於一些相似'Host'的特定頭的主域部分。例如主機值"haproxy.1wt.eu",則只考慮 "1wt"。該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據"hash-type"的變化作調整。
rdp-cookie
rdp-cookie(name)
爲每一個進來的TCP請求查詢並哈希RDP cookie <name> (或「mstshash」若是省略) 。與ACL函數 'req_rdp_cookie()'同樣,name不區分大小寫。該機制用於退化的持久模式,可使同一個用戶(或同一個會話ID)老是發送給同一臺服務器。若是沒有cookie, 則使用roundrobin算法代替。
必須注意該聲明要生效,前端必須確保在請求緩衝中已經有RDP cookie,因此必須使用規則tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相結合。
該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據"hash-type"的變化作調整。
<arguments> 是用於一些算法的可選參數列表,目前只有"url_param" 和 "uri" 用到,例如:
balance uri [len <len>] [depth <depth>]
balance url_param <param> [check_post [<max_wait>]]
若是沒有其餘算法、模式或選項的設置,後端的負載均衡算法默認爲roundrobin。每一個後端只能設置一種。
Examples :
balance roundrobin
balance url_param userid
balance url_param session_id check_post 64
balance hdr(User-Agent)
balance hdr(host)
balance hdr(Host) use_domain_only
注意: 如下的警告和限制是使用「check_post「擴展和」url_param」所必須考慮 :
- 全部POST請求都要考慮,由於在包含二進制數據的體或實體中,沒有辦法決定是否會找到參數。所以須要另外一種方法,限制POST請求的體中不含有URL參數 (見 acl reqideny http_end)
- 大於請求緩衝大小的 <max_wait> 值是沒用的。在build時設置緩衝大小,默認16KB。
- 不支持Content-Encoding, 參數搜索會失敗;負載均衡會改用 Round Robin。
- 預計: 不支持100-continue,負載均衡會改用 Round Robin。
- Transfer-Encoding (RFC2616 3.6.1) 只在第一個塊中支持。若是在第一個塊中的參數值不完整,選擇的服務器就沒有定義。(實際上取決於在第一個塊中定義的有多小)
- 該特性不支持生成100, 411 或 501 響應。
- 有的狀況下,須要"check_post"只是要查看整個消息體的內容。檢查通常會停在任意數量的空格(LWS: linear
white space)或控制符上,表示這多是一個URL參數列表。這可能不是一個關於SGML的類型消息體。
See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".
hash-type <method>
將哈希映射到服務器的方法。Specify a method to use for mapping hashes to servers
May be used in sections : defaults | frontend | listen | backend
yes | no | yes | yes
Arguments :
map-based 哈希表是包含全部在線服務器的靜態數組。哈希結果很平滑,並考慮了權重,可是會忽略服務器啓動時的權重變化,也就是說不能慢啓動。另外,服務器是根據數組中的位置所選擇的,因此服務器數量變化時,大部分映射也會變化。當一臺服務器啓動或關閉,或服務器加入到羣中,大部分鏈接會再分配給不一樣的服務器,這對有緩存的實例會比較麻煩。
consistent 哈希表是由每一個服務器構成的樹,會在樹上查找哈希Key,並選擇最近的服務器。這種哈希是動態的,支持服務器啓動時修改權重,因此能夠慢啓動。它有一個好處是當服務器啓動或關閉時,只有其自己的關係被移除,當服務器加入羣時,只有一小部分的映射會被從新分配,因此是一個比較理想的支持緩存的算法。可是根據其原理,算法不會很是平滑,有時候必須調整服務器的權重或ID來得到更平衡的分佈。要保持屢次負載均衡時的相同分佈,服務器ID是絕對不能變的。(roloand:haproxy根據服務器的ID初始化其哈希值)
默認值是"map-based",建議大部分狀況下使用。
See also : "balance", "server"
dispatch <address>:<port>
設置一個默認的服務器地址
May be used in sections : defaults | frontend | listen | backend
no | no | yes | yes
Arguments : none
<address> 默認服務器的IPv4地址,也能夠是主機名稱,名稱只在啓動時解析爲IP地址。
<ports> 端口號,全部鏈接都會發送給這個端口,可是不容許像其餘服務器同樣使用端口偏移(port offsets)。
"dispatch"關鍵字指定了一個默認的服務器,用於無可用服務器時的鏈接的處理。過去經常使用於前傳非持久鏈接給後備負載均衡器,因爲定義簡單,還用於簡單的TCP中繼(TCP relays)。 建議對於明確的鏈接處理,應使用"server"直接聲明。
====================
一:Global parameters
* Process management and security
- chroot 改變當前工做目錄
- daemon 運行方式爲後臺工做
- user - group 工做用戶和組
-log <address> <facility>日誌輸出設備
- nbproc 建立工做的進程數目
-pidfile pid文件位置
- ulimit-n 設置每一個進程的可用的最大文件描述符
- stats 建立監控所用的套接字目錄
- node 建立另一個節點名字共用一個IP地址,用來識別哪一個節點在處理流量
- description 描述實例的名稱
maxconn <number> 每一個進程可用的最大鏈接數
maxpipes <number> 每一個進程可用的最大管道數
nokqueue nopoll nosepoll nosplice 禁用這些功能
spread-checks <0..50, in percent> health check 的時間間隔
tune.bufsize <number>
tune.maxaccept <number>
tune.maxpollevents <number>
tune.maxrewrite <number>
tune.rcvbuf.client <number>
tune.rcvbuf.server <number>
tune.sndbuf.client <number>
tune.sndbuf.server <number>
以上憑字面理解吧
debug 調試模式,輸出啓動信息到標準輸出
quiet 安裝模式,啓動時無輸出
二:defaults 塊
做用於其後緊跟的listen塊,直至下一個defaults 塊,下一個default 將替換上一個塊做用於之後的listen
frontend 塊,接受請求的端口組
backend塊,後端處理的server 組
listen塊,frontend和backend 塊的結合
三:經常使用配置命令
balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post [<max_wait>]] 負載均衡模塊設置
Examples :
balance roundrobin
balance url_param userid
balance url_param session_id check_post 64
balance hdr(User-Agent)
balance hdr(host)
balance hdr(Host) use_domain_only
block { if | unless } <condition> 在7層阻止訪問
Example:
acl invalid_src src 0.0.0.0/7 224.0.0.0/3 acl定義和squid 很像
acl invalid_src src_port 0:1023
acl local_dst hdr(host) -i localhost
block if invalid_src || local_dst
capture cookie <name> len <length> 在請求和迴應包中捕捉記錄指定長度的cookie,name 爲cookie的開頭幾個字母
Example:
capture cookie ASPSESSION len 32
capture request header <name> len <length>
capture response header <name> len <length> 同上
clitimeout <timeout> (deprecated)
contimeout <timeout> (deprecated) 客戶端超時時間,不同意設置
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]* 容許持續的基於cookie 的後端鏈接
default_backend <backend> 默認應用的後端
Example :
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic 當沒有匹配時就用dynamic
errorfile <code> <file> 定義出現錯誤的代碼的返回頁
Example :
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
errorloc <code> <url> errorloc302 <code> <url> 出錯重定向到指定url
force-persist { if | unless } <condition> 在特定條件下,強制繼續鏈接down 掉的服務器後端
fullconn <conns> 定義後端組的最大鏈接數
grace <time> haproxy中止後,再持續多長時間用於處理鏈接
http-check disable-on-404 若是後端檢測返回404,將再也不把後端計入負載均衡
http-check send-state 容許haproxy 發送 X-Haproxy-Server-State
http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ] 七層訪問控制
Example:
acl nagios src 192.168.129.3
acl local_net src 192.168.0.0/16
acl auth_ok http_auth(L1)
http-request allow if nagios
http-request allow if local_net auth_ok
http-request auth realm Gimme if local_net auth_ok
http-request deny
Example:
acl auth_ok http_auth_group(L1) G1
http-request auth unless auth_ok
mode { tcp|http|health } 設定啓動的實例的協議類型
monitor fail { if | unless } <condition> 監控失敗條件設置
option abortonclose 丟棄因爲客戶端等待時間過長而關閉鏈接但仍在haproxy等待隊列中的請求
option accept-invalid-http-request 接受無效的http請求,建議關閉(開啓可能有安全隱患)
option accept-invalid-http-response 接受無效的response ,建議關閉
option allbackups 應該是後備服務器,若是正常的後端沒法使用,就使用這些後備的設備,balance方式仍是用原來的,沒有優先的選擇,經常使用來提供錯誤的頁面
option checkcache 分析後端response,阻止可緩存的cookie,它對response 進行嚴格檢查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客戶端代理那邊保存是否有風險,若是這個容許的話,符全如下條件 的response 將被容許,其它的將被阻止。
- all those without "Set-Cookie" header ;
- all those with a return code other than 200, 203, 206, 300, 301, 410,
provided that the server has not set a "Cache-control: public" header ;
- all those that come from a POST request, provided that the server has not
set a 'Cache-Control: public' header ;
- those with a 'Pragma: no-cache' header
- those with a 'Cache-control: private' header
- those with a 'Cache-control: no-store' header
- those with a 'Cache-control: max-age=0' header
- those with a 'Cache-control: s-maxage=0' header
- those with a 'Cache-control: no-cache' header
- those with a 'Cache-control: no-cache="set-cookie"' header
- those with a 'Cache-control: no-cache="set-cookie,' header
(allowing other fields after set-cookie)
option clitcpka 是否容許客戶端發送tcp keepalive 包,這個和http 的keepalive 沒有關係
option contstats 容許連續的流量統計更新
option dontlog-normal 開啓正常鏈接的日誌
option dontlognull 記錄空鏈接
option forceclose 容許關閉session 在後端把response 發送後
option forwardfor [ except <network> ] [ header <name> ] 容許在request 中加入X-Forwarded-For header 發往server
option http-pretend-keepalive 定義是否haproxy要宣佈同server keepalive
option http-server-close 是否開啓在server 端 connection closing
option http-use-proxy-header 用non-standard Proxy-Connection 替換 connection
option httpchk <method> <uri> <version> 容許用http協議檢查server 的健康
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 * HTTP/1.1\r\nHost:\ www
server apache1 192.168.1.1:443 check port 80
option httplog [ clf ] 定製日誌格式
option http_proxy 開啓http 代理模式,只有最基本的代理功能
option ignore-persist { if | unless } <condition> 在某條件下拒絕持續鏈接,適用於對靜態文件的負載均衡
option independant-streams 啓用雙向超時處理,如socket 的read 和write
option log-health-checks 記錄健康檢查日誌
option log-separate-errors 對非徹底成功的鏈接改變日誌記錄等級
option logasap 大傳輸大文件時能夠提早記錄日誌
option mysql-check mysql 健康檢查
option nolinger 清除骯髒鏈接後開成的tcp 狀態及佔用的資源,不過並非強列要求你用這個選項,固然若是你有thousands of FIN_WAIT1 sessions on your system ,那確定得用了
option originalto [ except <network> ] [ header <name> ] 容許在requests中加入X-Original-To header 發往server
option persist 強制將http請求發往已經down 掉的server
option redispatch 是否容許從新分配在session 失敗後
option smtpchk smtp 檢查
option socket-stats 容許對單個socket進行統計
option srvtcpka 是否容許向server 發送keepalive
option tcpka 是否容許向server和client發送keepalive
option tcplog 容許記錄tcp 鏈接的狀態和時間
option transparent 容許客戶端透明代理
rate-limit sessions <rate> 設置frontend 每秒處理的鏈接的上限,若是到達上限就中止創建新的connection
redirect location <to> [code <code>] <option> [{if | unless} <condition>]
redirect prefix <to> [code <code>] <option> [{if | unless} <condition>] 重定向,至關於rewrite
Example: move the login URL only to HTTPS.
acl clear dst_port 80
acl secure dst_port 8080
acl login_page url_beg /login
acl logout url_beg /logout
acl uid_given url_reg /login?userid=[^&]+
acl cookie_set hdr_sub(cookie) SEEN=1
redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set
redirect prefix https://mysite.com if login_page !secure
redirect prefix http://mysite.com drop-query if login_page !uid_given
redirect location http://mysite.com/ if !login_page secure
redirect location / clear-cookie USERID= if logout
Example: send redirects for request for articles without a '/'.
acl missing_slash path_reg ^/article/[^/]*$
redirect code 301 prefix / drop-query append-slash if missing_slash
redisp (deprecated)
redispatch (deprecated) 開啓session 從新分配在connection鏈接失敗後,不同意啓用
reqadd <string> [{if | unless} <cond>] 在http請示的末尾加上string
Example : add "X-Proto: SSL" to requests coming via port 81
acl is-ssl dst_port 81
reqadd X-Proto:\ SSL if is-ssl
reqallow <search> [{if | unless} <cond>]
reqiallow <search> [{if | unless} <cond>] (ignore case) request 請求訪問控制
Example :
# allow www.* but refuse *.local
reqiallow ^Host:\ www\.
reqideny ^Host:\ .*\.local
reqdel <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>] (ignore case) 刪除請求的head 中的內容
Example :
# remove X-Forwarded-For header and SERVER cookie
reqidel ^X-Forwarded-For:.*
reqidel ^Cookie:.*SERVER=
reqdeny <search> [{if | unless} <cond>]
reqideny <search> [{if | unless} <cond>] (ignore case) 拒絕訪問
reqrep <search> <string> [{if | unless} <cond>]
reqirep <search> <string> [{if | unless} <cond>] (ignore case) request 請求替換
Example :
# replace "/static/" with "/" at the beginning of any request path.
reqrep ^([^\ ]*)\ /static/(.*) \1\ /\2
# replace "www.mydomain.com" with "www" in the host name.
reqirep ^Host:\ www.mydomain.com Host:\ www
reqtarpit <search> [{if | unless} <cond>]
reqitarpit <search> [{if | unless} <cond>] (ignore case) 阻止http請求中的某些信息
Examples :
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
# block all others.
reqipass ^User-Agent:\.*(Mozilla|MSIE)
reqitarpit ^User-Agent:
# block bad guys
acl badguys src 10.1.0.3 172.16.13.20/28
reqitarpit . if badguys
retries <value> 當對server的connection失敗後,重試的次數
rspadd <string> [{if | unless} <cond>] response 增長信息
rspdel <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>] (ignore case)
rspdeny <search> [{if | unless} <cond>]
rspideny <search> [{if | unless} <cond>] (ignore case)
rsprep <search> <string> [{if | unless} <cond>]
rspirep <search> <string> [{if | unless} <cond>] (ignore case)
以上和request 的差很少
source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定義從代理出去的鏈接的對象,用於限定地址能夠訪問server
一些timeout
srvtimeout <timeout> server 處理超時,不同意設置
timeout check X - X X
timeout client X X X -
timeout clitimeout (deprecated) X X X -
timeout connect X - X X
timeout contimeout (deprecated) X - X X
timeout http-keep-alive X X X X
timeout http-request X X X X
timeout queue X - X X
timeout server X - X X
timeout srvtimeout (deprecated) X - X X
timeout tarpit X X X X
stats auth <user>:<passwd> 監控統計的賬號和密碼
backend public_www
server srv1 192.168.0.1:80
stats enable
stats hide-version
stats scope .
stats uri /admin?stats
stats realm Haproxy\ Statistics
stats auth admin1:AdMiN123
stats auth admin2:AdMiN321
# internal monitoring access (unlimited)
backend private_monitoring
stats enable
stats uri /admin?stats
stats refresh 5s
還有不少參數,以上能用到的也沒有幾個,只要知足當前需求就好,對於性能要求高的話,建議把不須要的功能 都關了吧.
====================
HAProxy的配置示例
HAProxy配置中分紅五部份內容,固然這些組件不是必選的,能夠根據須要選擇部分做爲配置。
global:參數是進程級的,一般和操做系統(OS)相關。這些參數通常只設置一次,若是配置無誤,就不須要再次配置進行修改
defaults:配置默認參數的,這些參數能夠被利用配置到frontend,backend,listen組件
frontend:接收請求的前端虛擬節點,Frontend能夠根據規則直接指定具體使用後端的 backend(可動態選擇)。
backend:後端服務集羣的配置,是真實的服務器,一個Backend對應一個或者多個實體服務器。
listen:Frontend和Backend的組合體。
下面是HAProxy的一些經常使用的配置,這個配置是用來講明HAProxy的一些經常使用功能的配置,具體詳細配置請查看安裝目錄下的doc目錄下的文檔文件,或者到http://cn.haproxy.org/下載中文配置說明文檔
配置具體實例,後附說明:
global
#全局的日誌配置 其中日誌級別是[err warning info debug]
#local0 是日誌設備,必須爲以下24種標準syslog設備的一種:
#kern user mail daemon auth syslog lpr news
#uucp cron auth2 ftp ntp audit alert cron2
#local0 local1 local2 local3 local4 local5 local6 local7
#可是以前在/etc/syslog.conf文件中定義的是local0因此
#這裏也是用local0
log 127.0.0.1 local0 info #[err warning info debug]
#最大鏈接數
maxconn 4096
#用戶
user admin
#組
group admin
#使HAProxy進程進入後臺運行。這是推薦的運行模式
daemon
#建立4個進程進入deamon模式運行。此參數要求將運行模式設置爲"daemon"
nbproc 4
#將全部進程的pid寫入文件 啓動進程的用戶必須有權限訪問此文件。
pidfile /home/admin/haproxy/logs/haproxy.pid
defaults
#默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
mode http
#採用http日誌格式
option httplog
#三次鏈接失敗就認爲是服務器不可用,也能夠經過後面設置
retries 3
若是cookie寫入了serverId而客戶端不會刷新cookie,
#當serverId對應的服務器掛掉後,強制定向到其餘健康的服務器
option redispatch
#當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接
option abortonclose
#默認的最大鏈接數
maxconn 4096
#鏈接超時
contimeout 5000
#客戶端超時
clitimeout 30000
#服務器超時
srvtimeout 30000
#=心跳檢測超時
timeout check 2000
#注:一些參數值爲時間,好比說timeout。時間值一般單位爲毫秒(ms),可是也能夠經過加#後綴,來使用其餘的單位。
#- us : microseconds. 1 microsecond = 1/1000000 second
#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
#- s : seconds. 1s = 1000ms
#- m : minutes. 1m = 60s = 60000ms
#- h : hours. 1h = 60m = 3600s = 3600000ms
#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
########統計頁面配置############
listen admin_stats
#監聽端口
bind 0.0.0.0:1080
#http的7層模式
mode http
#日誌設置
log 127.0.0.1 local0 err #[err warning info debug]
#統計頁面自動刷新時間
stats refresh 30s
#統計頁面url
stats uri /admin?stats
#統計頁面密碼框上提示文本
stats realm Gemini\ Haproxy
#統計頁面用戶名和密碼設置
stats auth admin:admin
stats auth admin1:admin1
#隱藏統計頁面上HAProxy的版本信息
stats hide-version
#######網站檢測listen定義############
listen site_status
bind 0.0.0.0:1081
mode http
log 127.0.0.1 local0 err #[err warning info debug]
#網站健康檢測URL,用來檢測HAProxy管理的網站是否能夠用,正常返回200,不正常返回500
monitor-uri /site_status
#定義網站down時的策略
#當掛在負載均衡上的指定backend的中有效機器數小於1臺時返回true
acl site_dead nbsrv(denali_server) lt 1
acl site_dead nbsrv(tm_server) lt 1
acl site_dead nbsrv(mms_server) lt 1
#當知足策略的時候返回500
monitor fail if site_dead
#若是192.168.0.252或者192.168.0.31這兩天機器掛了
#認爲網站掛了,這時候返回500,判斷標準是若是mode是
#http返回200認爲是正常的,若是mode是tcp認爲端口暢通是好的
monitor-net 192.168.0.252/31
########frontend配置############
frontend http_80_in
#監聽端口
bind 0.0.0.0:80
#http的7層模式
mode http
#應用全局的日誌配置
log global
#啓用http的log
option httplog
#每次請求完畢後主動關閉http通道,HA-Proxy不支持keep-alive模式
option httpclose
#若是後端服務器須要得到客戶端的真實IP須要配置次參數,將能夠從Http Header中
#得到客戶端IP
option forwardfor
###########HAProxy的日誌記錄內容配置##########
capture request header Host len 40
capture request header Content-Length len 10
capture request header Referer len 200
capture response header Server len 40
capture response header Content-Length len 10
capture response header Cache-Control len 8
####################acl策略定義#########################
#若是請求的域名知足正則表達式返回true -i是忽略大小寫
acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
#若是請求域名知足trade.gemini.taobao.net 返回 true -i是忽略大小寫
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
##在請求url中包含sip_apiname=,則此控制策略返回true,不然爲false
acl invalid_req url_sub -i sip_apiname=
##在請求url中存在timetask做爲部分地址路徑,則此控制策略返回true,不然返回false
acl timetask_req url_dir -i timetask
#當請求的header中Content-length等於0時返回 true
acl missing_cl hdr_cnt(Content-length) eq 0
######################acl策略匹配相應###################
##當請求中header中Content-length等於0 阻止請求返回403
block if missing_cl
##block表示阻止請求,返回403錯誤,當前表示若是不知足策略invalid_req,或者知足策略timetask_req,則阻止請求。
block if !invalid_req || timetask_req
#當知足denali_policy的策略時使用denali_server的backend
use_backend denali_server if denali_policy
#當知足tm_policy的策略時使用tm_server的backend
use_backend tm_server if tm_policy
#reqisetbe關鍵字定義,根據定義的關鍵字選擇backend
reqisetbe ^Host:\ img dynamic
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic
reqisetbe ^[^\ ]*\ /admin/stats stats
#以上都不知足的時候使用默認mms_server的backend
default_backend mms_server
#HAProxy錯誤頁面設置
errorfile 400 /home/admin/haproxy/errorfiles/400.http
errorfile 403 /home/admin/haproxy/errorfiles/403.http
errorfile 408 /home/admin/haproxy/errorfiles/408.http
errorfile 500 /home/admin/haproxy/errorfiles/500.http
errorfile 502 /home/admin/haproxy/errorfiles/502.http
errorfile 503 /home/admin/haproxy/errorfiles/503.http
errorfile 504 /home/admin/haproxy/errorfiles/504.http
##########backend的設置##############
backend mms_server
#http的7層模式
mode http
#負載均衡的方式,roundrobin平均方式
balance roundrobin
#容許插入serverid到cookie中,serverid後面能夠定義
cookie SERVERID
#心跳檢測的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳檢測HTTP的版本,XXX爲檢測時請求
#服務器的request中的域名是什麼,這個在應用的檢測URL對應的功能有對域名依賴的話須要設置
option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net
#服務器定義,cookie 1表示serverid爲1,check inter 1500 是檢測心跳頻率
#rise 3是3次正確認爲服務器可用,fall 3是3次失敗認爲服務器不可用,weight表明權重
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
server mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2
backend denali_server
mode http
#負載均衡的方式,source根據客戶端IP進行哈希的方式
balance source
#但設置了backup的時候,默認第一個backup會優先,設置option allbackups後
#全部備份服務器權重同樣
option allbackups
#心跳檢測URL設置
option httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net
#能夠根據機器的性能不一樣,不使用默認的鏈接數配置而使用本身的特殊的鏈接數配置
#如minconn 10 maxconn 20
server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3
#備份機器配置,正常狀況下備機不會使用,當主機的所有服務器都down的時候備備機會啓用
server dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
backend tm_server
mode http
#負載均衡的方式,leastconn根據服務器當前的請求數,取當前請求數最少的服務器
balance leastconn
option httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne
server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3
######reqisetbe自定義關鍵字匹配backend部分#######################
backend dynamic
mode http
balance source
option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3
server denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3
backend stats
mode http
balance source
option httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com
server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
server denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3