常用配置選項:
option 選項:
option httpclose :haproxy會針對用戶端的第一條請求的傳回添加cookie并傳回給用戶端,用戶端發送後續請求時會發送
此cookie到haproxy,haproxy會針對此cookie分發到上次處理此請求的伺服器上,如果伺服器不能忽略
此cookie值會影響處理結果。如果避免這種情況配置此選項,防止産生多餘的cookie資訊。
option forwardfor :如果伺服器上的應用程式想記錄發起請求的用戶端的ip位址,需要在haproxy上配置此選項,這樣
haproxy會把用戶端的ip資訊發送給伺服器,在http請求中添加"x-forwarded-for"字段。
option originalto :如果伺服器上的應用程式想記錄發起請求的原目的ip位址,需要在haproxy上配置此選項,這樣haproxy
會添加"x-original-to"字段。
option dontlognull :保證haproxy不記錄上級負載均衡發送過來的用于檢測狀态沒有資料的心跳包。
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後的主動關閉連接配接
有的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連接配接
預設的,用戶端與服務端通訊,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 的。
當聲明了 "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>]]
定義選擇後端服務的負載均衡算法
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
map-based
哈希表是包含所有線上伺服器的靜态數組。哈希結果很平滑,并考慮了權重,但是會忽略伺服器啟動時的權重變化,也就是說不能慢啟動。另外,伺服器是根據數組
中的位置所選擇的,是以伺服器數量變化時,大部分映射也會變化。當一台伺服器啟動或關閉,或伺服器加入到群中,大部分連接配接會再配置設定給不同的伺服器,這對有
緩存的執行個體會比較麻煩。
consistent
哈希表是由每個伺服器構成的樹,會在樹上查找哈希key,并選擇最近的伺服器。這種哈希是動态的,支援伺服器啟動時修改權重,是以可以慢啟動。它有一個好
處是當伺服器啟動或關閉時,隻有其本身的關系被移除,當伺服器加入群時,隻有一小部分的映射會被重新配置設定,是以是一個比較理想的支援緩存的算法。但是根據
其原理,算法不會非常平滑,有時候必須調整伺服器的權重或id來獲得更平衡的分布。要保持多次負載均衡時的相同分布,伺服器id是絕對不能變的。
(roloand:haproxy根據伺服器的id初始化其哈希值)
預設值是"map-based",建議大部分情況下使用。
see also : "balance", "server"
dispatch <address>:<port>
設定一個預設的伺服器位址
no | no | yes | yes
<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> 定義出現錯誤的代碼的傳回頁
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> ] 七層通路控制
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
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 的健康
# 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 中的内容
# 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 請求替換
# 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請求中的某些資訊
# 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 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
#預設的最大連接配接數
#連接配接逾時
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層模式
#日志設定
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的版本資訊
#######網站檢測listen定義############
listen site_status
bind 0.0.0.0:1081
#網站健康檢測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
#應用全局的日志配置
log global
#啟用http的log
#每次請求完畢後主動關閉http通道,ha-proxy不支援keep-alive模式
#如果後端伺服器需要獲得用戶端的真實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
#負載均衡的方式,roundrobin平均方式
balance roundrobin
#允許插入serverid到cookie中,serverid後面可以定義
cookie serverid
#心跳檢測的url,http/1.1rnhost: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
#負載均衡的方式,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
#負載均衡的方式,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
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
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