[:port][param*]
在后端聲明一個server,因此,,不能用于defaults和frontend區(qū)段,。
: 為此服務(wù)器指定的內(nèi)部名稱,其將會出現(xiàn)在日志及警告信息中,;如果設(shè)定了“http-send-server-name”,他還將會被添加至發(fā)往此服務(wù)器的請求首部中
:此服務(wù)器的IPv4地址,,也支持使用可解析的主機名,只不過在啟動時需要解析主機名至響應(yīng)的IPV4地址
<:port>:指定將連接請求所發(fā)往此服務(wù)器時的目標(biāo)端口,,其為可選項,,為設(shè)定是,將使用客戶端請求時的同一相同端口
[param*]:為此服務(wù)器設(shè)定的一系列參數(shù):其可以得參數(shù)非常多,,具體請參考官方文檔(http://cbonte./haproxy-dconv/configuration-1.4.html#5)中的說明,,下面僅說明幾個常用的參數(shù)
服務(wù)器或默認(rèn)服務(wù)器參數(shù):
backup:設(shè)定為備用服務(wù)器,僅在負(fù)載均衡場景中的其他server均不可以啟用此server
check:啟動對此server執(zhí)行監(jiān)控狀態(tài)檢查,,其可以借助于額外的其他參數(shù)完成更精細(xì)的設(shè)定,,如:
inter: 設(shè)定監(jiān)控狀態(tài)檢查的時間間隔,單位為毫秒,,默認(rèn)為2000,,也可以使用fastinter和downinter來根據(jù)服務(wù)器端專題優(yōu)化此事件延遲
rise:設(shè)定檢查狀態(tài)檢查中,,某離線的server從離線狀態(tài)轉(zhuǎn)換至正常狀態(tài)需要成功檢查的次數(shù)
fall:設(shè)定檢查狀態(tài)檢查中,,某離線的server從正常狀態(tài)轉(zhuǎn)換至離線狀態(tài)需要成功檢查的次數(shù)
cookie:為指定server設(shè)定cookie值,此處指定的值將會在請求入站時被檢查,,第一次為此值挑選的server將會倍后續(xù)的請求所選中,,其目的在于實現(xiàn)持久連接的功能
maxconn:指定此服務(wù)器接受的最大并發(fā)連接數(shù),如果發(fā)往此服務(wù)器的連接數(shù)目高于此處指定的值,,其將被放置于請求隊列,,以等待其他連接被釋放
maxqueue:通過觀察服務(wù)器的通信狀況來判斷其健康狀態(tài),,默認(rèn)為禁用,其支持的類型有“l(fā)ayer 4”和“l(fā)ayer 7”,,“l(fā)ayer 7”僅能用于http代理場景
redir:啟用重定向功能,,將發(fā)往此服務(wù)的GET和HEAD請求均以302狀態(tài)碼響應(yīng),需要注意的是,,在prefix后面不能使用/,,且不能使用相對地址,以避免造成循環(huán),,例如
server srv1 192..168.1.202:80 redir http://imageserver. check
weight: 權(quán)重,,默認(rèn)為1,最大值為256,,0表示不參與負(fù)載均衡
檢查方法:
option httpchk
option httpchk
option httpchk
option httpchk:不能用于frontend端,,例如:
backend https_relay
mode tcp
option httpchk OPTIONS * HTTP/1.1rnHost: www
server apache1 192.168.1.1:443 check port 80
capture request header
capture request header len
捕獲并記錄指定的請求首部最近一次出現(xiàn)時的第一個值,僅能用于“frontend”和“l(fā)isten”區(qū)段,,捕獲的首部值使用花括號{}括起來后添加進日志中,,如果需要捕獲多個首部值,他們將以指定的次序出現(xiàn)在日志文件中,,并以豎線“|”作為分隔符,,不存在的首部記錄為空字符串,最長需要捕獲的首部包括在虛擬主機環(huán)境中使用的“host”,、上傳請求首部中的“Content-length”,、快速區(qū)別現(xiàn)實用戶和網(wǎng)絡(luò)機器人“User-agent”,已經(jīng)代理環(huán)境中距離請求來源的“X-Forword-For”
: 要捕獲的首部的名稱,,此名稱不區(qū)分大小寫,,但建議與他們出現(xiàn)在首部中的格式相同,比如大寫首字母,,需要注意的是,,記錄在日志的是首部的值,而非首部名稱
: 指定距離首部值時所記錄的精確長度,,超出的部分將會倍忽略
可以捕獲的請求首部的個數(shù)沒有限制,,但每個捕獲最多能記錄64個字符,為了保證同一個frontend中日志格式的統(tǒng)一性,,首部捕獲僅能在frontend中定義
capture response header
capture response header len
捕獲并記錄響應(yīng)首部,。其格式和要點同捕獲的請求首部響應(yīng)
stats enable
啟用基于程序編譯時默認(rèn)設(shè)置的統(tǒng)計報告,不能用于“frontend”區(qū)段,,只要沒有額外的其他設(shè)定,,他們就會使用如下的配置
- stats uri : /haproxy?stats
- stats realm : 'HAProxy Statistics'
- stats auth : no authentication
- stats scope : no restriction
盡管“stats enable”一條就能夠啟用統(tǒng)計報告,但還是建議設(shè)定其他所有的參數(shù),以避免其依賴默認(rèn)設(shè)定而帶來非預(yù)期后果,,下面是一個配置案例實例
backend public_www
server srv1 192.168.1.201:80
stats enable
stats hide-version
stats scope .
stats uri /admin?stats
stats realm Haproxy Statistics
stats auth admin1:AdMiN123
stats auth admin2:AdMiN321
stats hide-version
啟用統(tǒng)計報告并隱藏HAProxy版本報告,,不能用于“frontend”區(qū)域,默認(rèn)情況下,,統(tǒng)計頁面會顯示一些有用信息,,包括HAProxy的版本號,然后,,向所有人公開HAproxy的準(zhǔn)確版本號是非常有危險的,,因為他能夠版主惡意用戶快速定位版本的缺陷和漏洞,盡管“stats hide-version”一條就能夠啟用統(tǒng)計報告,,但還是建議設(shè)定其他所有的參數(shù),,以避免其依賴默認(rèn)設(shè)定而帶來非預(yù)期后果請參照“stats enable”一節(jié)的說明
stats realm
stats realm
啟用統(tǒng)計報告并高精認(rèn)證領(lǐng)域,不能用于“frontend”區(qū)域,,haproxy在讀取realm是會講是做一個單詞,,因此,中間的空白字符都必須使用反斜線進行轉(zhuǎn)移,。此參數(shù)僅在與“stats auth”配置使用時有意義
:實現(xiàn)HTTP基本認(rèn)證時顯示在瀏覽器中的領(lǐng)域名稱,,用于提示用戶輸入一個用戶名和密碼
盡管“stats realm”一條就能夠啟用統(tǒng)計報告,但還是建議設(shè)定其他所有的參數(shù),,以避免其依賴默認(rèn)設(shè)定而帶來非預(yù)期,,后果請參照“stats enable”一節(jié)的說明
stats scope
stats scope {|'.'}
啟用統(tǒng)計報告并限定報告的區(qū)段,不能用于“frontend”區(qū)域,,當(dāng)指定此語句時,,統(tǒng)計報告將僅顯示其列舉出區(qū)段的報告信息,所有其他區(qū)段的信息將被隱藏,,如果需要顯示多個區(qū)段的統(tǒng)計報告,,此語句可以定義多次,需要注意的是,,區(qū)段名稱進程僅僅是以字符串比較的方式進行,,他不會真檢查指定的區(qū)段是否真正存在
:可以是一個“l(fā)isten”、“frontend”或“backend”區(qū)段的名稱,,而“.”則表示stats scope語句所定義的當(dāng)前區(qū)段
盡管“stats scope”一條就能夠啟用統(tǒng)計報告,,但還是建議設(shè)定其他所有的參數(shù),以避免其依賴默認(rèn)設(shè)定而帶來非預(yù)期后果,,請參照“stats enable”一節(jié)的說明
stats auth
stats auth :
啟用帶認(rèn)證的統(tǒng)計報告功能并授權(quán)一個用戶賬號,,不能用于“frontend”區(qū)域
:授權(quán)進行訪問的用戶名
:此用戶的訪問密碼,明文格式
此語句將給予默認(rèn)設(shè)定啟用統(tǒng)計功能報告,,并僅允許其定義的用戶訪問,,其也可以定義多次以手段多個用戶賬號,可以結(jié)合“stats realm”參數(shù)在提示用戶認(rèn)證是給出一個領(lǐng)域說明信息,,在使用非法用戶訪問統(tǒng)計功能時,,其將會響應(yīng)一個“401 Forbidden”頁面,其認(rèn)證方式為HTTP Basic認(rèn)證,,密碼傳輸會以明文方式進行,,因此,配置文件中也使用存儲明文方式存儲以說明其非保密信息故此不能想用與其他關(guān)鍵性賬號的密碼,。
盡管“stats auth”一條就能夠啟用統(tǒng)計報告,,但還是建議設(shè)定其他所有的參數(shù),以避免其依賴默認(rèn)設(shè)定而帶來非預(yù)期后果,,請參照“stats enable”一節(jié)的說明
stats admin
atsts admin {if|unless}
在指定的條件滿足時啟用統(tǒng)計報告頁面的管理級別功能,,他允許通過web接口啟用或禁用服務(wù)器,不過,,基于安全的角度考慮,,統(tǒng)計報告頁面應(yīng)該盡可能為只讀的,此外,,如果啟用了HAproxy的多進程模式,,啟用此管理級別將會可能導(dǎo)致異常行為
目前來說,POST請求方法被限制于僅能使用緩沖區(qū)減去保留之外的空間,,因此,,服務(wù)器列表不能過長,否則,,此請求將無法正常工作,,因此,建議一次僅調(diào)整少數(shù)幾個服務(wù)器,,
option httplog
option httplog [clf]
啟用記錄HTTP請求,、會話狀態(tài)和計時器的功能
clf:使用CLF格式來代替HAproxy默認(rèn)的HTTP格式,通常在使用僅支持CLF格式的特定日志分析器時才需要使用此格式
默認(rèn)情況下,,日志輸入格式非常簡陋,。因為其僅包括源地址、目標(biāo)地址和實例名稱,、而“option httplog”參數(shù)將會使得日志變得豐富許多,,其通常包括但不局限于HTTP請求、連接計時器,、會話狀態(tài),、連接數(shù)、捕獲的首部及cookie,、“frontend”,、“backend”及服務(wù)器名稱,。當(dāng)然也包括源地址和端口號等。
option logasap
no option logasap
啟用或禁用提前將HTTP請求記入日志,,不能用于“frontend”區(qū)段,。
默認(rèn)情況下,HTTP請求是在請求結(jié)束時進行記錄以便能夠?qū)⑵湔w輸入時長和字節(jié)數(shù)記入日志,,由此,,傳較大的對象時,其記入日志的市場可能會略有延遲,,“option logasap”參數(shù)能夠在服務(wù)器發(fā)送complete首部時及時記錄日志,,只不過,此時將不記錄整體傳輸時長和字節(jié)數(shù),。此情形下,,捕獲“Content-Length”響應(yīng)報文來記錄的字節(jié)數(shù)是以一個較好的選擇
option forwardfor
option forwardfor[ except ][ header ][ if-none ]
允許在發(fā)往服務(wù)器的請求首部中插入“X-Forwarded-For”首部
:可選參數(shù),當(dāng)指定時,,源地址為皮至此網(wǎng)絡(luò)中的請求都禁用此功能
:可選參數(shù),,可使用一個自定義的首部,如“X-Cluster-Client-IP”來代替“X-Forwarded-For”,,有些獨特的web服務(wù)器的確需要用一個獨特的首部
if-none: 僅在此首部不存在時才會將其添加至請求報文中
HAproxy工作與反向代理模式,,其發(fā)往服務(wù)器的請求中的客戶端IP均為HAproxy主機的地址而非真正的客戶端地址,這會使得服務(wù)器的日志記錄不了真正的請求來源,,“X-Forwarded-For”首部則可用于解決此問題,,HAproxy可以向每個房網(wǎng)服務(wù)器的請求上添加此首部,并以客戶端IP為其value
需要注意的是,,HAproxy工作與隧道模式,,其僅檢查每一個連接的第一個請求,一次,,僅第一個請求報文中被附加此首部,,請確保同時使用“option httpclose”、“option forceclose”和“option http-server-close”幾個option,,例如
errorfile
errorfile
在用戶請求不存在的頁面時,,返回一個頁面給客戶端而非有haproxy生成的錯誤代碼,可用于所有段中
: 指定對HTTP的那些狀態(tài)碼發(fā)回指定的頁面,,這里可用的狀態(tài)碼有200,、400、403,、408,、500、502,、503和504
:指定用于響應(yīng)的頁面文件
例如:
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
errorloc和errorloc302
errorloc
errorloc302
請求錯誤時,,返回一個HTTP重定向至某URL的信息,,可以用于所有端中
: 指定對HTTP的那些狀態(tài)碼發(fā)回指定的頁面,這里可用的狀態(tài)碼有200,、400,、403、408,、500,、502,、503和504
:Location首部中指定的頁面位置的具體路徑,,可以是在當(dāng)前服務(wù)器上的頁面的相對路徑,也可以使用絕對路徑,,需要注意的是,,如果URI之神錯誤時禪師某特定狀態(tài)碼信息的話,有可能會導(dǎo)致循環(huán)定向
需要留意的時,,這兩個關(guān)鍵字都會返回302狀態(tài)碼,,浙江使得客戶端使用同樣的HTTP方法獲取指定的URL。對于非GET方法獲取指定的URL,,對于非GET方法的場景(如POST)來說會產(chǎn)生問題,,因為返回客戶端的URL是不允許使用GET意外的其他方法的,如果的確有這種問題,,可以使用errorloc303來返回303狀態(tài)碼給客戶端
errorloc303
errorloc303
: 指定對HTTP的那些狀態(tài)碼發(fā)回指定的頁面,,這里可用的狀態(tài)碼有400、403,、408,、500、502,、503和504
:Location首部中指定的頁面位置的具體路徑,,可以是在當(dāng)前服務(wù)器上的頁面的相對路徑,也可以使用絕對路徑,,需要注意的是,,如果URI之神錯誤時禪師某特定狀態(tài)碼信息的話,有可能會導(dǎo)致循環(huán)定向
五,、ACL
haproxy的ACL用于實現(xiàn)基于請求報文的首部,、響應(yīng)報文的內(nèi)容或其他的環(huán)境狀態(tài)信息來做出轉(zhuǎn)發(fā)決策,這大大增強了其配置彈性,,其配置法則通常非為兩步,,首先定義ACL,及定義一個測試條件,,而后在條件得到滿足時執(zhí)行某特定的動作,,如阻止請求或轉(zhuǎn)發(fā)至某特定的后端,,官方文檔(http://cbonte./haproxy-dconv/configuration-1.4.html#7)定義ACL的語法格式如下:
acl[flags][operator] …
:ACL名稱,區(qū)分字符大小寫,,其只能包含大小寫字符,、數(shù)字、-(連接線),、_(下劃線),、.(點號)和:冒號,haproxy中,,acl可以重名,,還可以把多個測試條件定義為一個共同的acl
: 測試標(biāo)準(zhǔn),即對什么信息發(fā)起測試,,測試方式可以有[flags]指定的標(biāo)志進行調(diào)整,,而有些測試標(biāo)準(zhǔn)也可以需要在其為之前指定一個操作符[operator]
[flags]:目前haproxy的acl支持的標(biāo)志位有3個
-i:不區(qū)分中模式字符的大小寫
-f:從指定的文件中加載模式
–:標(biāo)識符的強制結(jié)束標(biāo)記,在模式中的字符串像標(biāo)記符時使用
:acl測試條件支持的值有以下四類
整數(shù)或證書范圍:如1024:65535表示從1024到65535,,僅支持使用正整數(shù)(如果出現(xiàn)類似小數(shù)的標(biāo)識,,其通常為測試版本),其支持使用的操作符有5個,,分別為eq(等于),、ge(大于等于)、gt(大于),、le(小于等于)和lt(小于)
字符串:支持使用“-i”以忽略字符大小寫,,支持使用“”進行轉(zhuǎn)義,如果在模式首部出現(xiàn)了-i,,可以在之前使用“–”標(biāo)識位
正則表達式:其機制類同于字符串匹配
IP地址及網(wǎng)絡(luò)地址
同一個acl中可以指定多個測試條件,,這些測試條件需要由邏輯操作符指定其關(guān)系,條件間的組合測試關(guān)系有三種:“與”(默認(rèn)即為與操作),、“或”(使用“||”操作符和“or”)和“非”(使用“,!”操作符)
常用的測試標(biāo)準(zhǔn)
5.1 be_sess_rate (integer)
be_sess_rate(backend) (integer)
用于測試指定的backend上會話創(chuàng)建的速率(即每秒創(chuàng)建的會話數(shù))是否滿足指定的條件,常用于在指定的backend上的會話速率過高時將用戶請求轉(zhuǎn)發(fā)至另外的backend,,或用于阻止攻擊行為,。例如:
backend dynamic
mode http
acl being_scanned be_sess_rate gt 100
redirect location /denied.html if being_scanned
5.2 fe_sess_rate
fe_sess_rate(backend) (integer)
用于測試指定的frontend(或當(dāng)前fortend)上的創(chuàng)建速率是否滿足指定的條件,常用于為frontend指定一個合理的會話創(chuàng)建速率的上限以防止服務(wù)器被濫用,,例如
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
定律限定入站郵件速率不能大于50封/秒,,所有在指定范圍之外的請求都被延時50毫秒
5.3 hdr
hdr(header)
用于測定請求報文中的所有首部或指定首部是否滿足指定的條件,指定首部時,,其名稱不區(qū)分大小寫,,且在括號“()”中不能有任何多余的空白字符,測試服務(wù)器端的響應(yīng)報文時可以使用shdr(),。例如,。下面的例子用于測試首部Connection的值是否為close
hdr(Connection) -i close
5.4 method
測試HTTP請求報文中使用的方法
5.5 path_beg
用于測試請求的URI是否以指定的模式開頭,。
1
acl url_static path_beg -i /static /images /javascript /stylesheets
測試URL是個以/static /images /javascript /stylesheets開頭
5.6 path_end
用于測試請求的URL是否以指定的模式結(jié)尾
1
acl url_static path_end -i .jpg .gif .png .css .js
測試URI是否以.jpg .gif .png .css .js結(jié)尾
5.7 hdr_beg
用于測試請求報文的指定首部的開頭部分是否符合指定的模式
1
acl host_static hdr_beg(host) -i img. video. download. ftp.
用于測試請求報文首部中的主機是否已img. video. download. ftp.開頭
5.8 hdr_beg
用于測試請求報文的指定首部結(jié)尾是否符合指定的模式
|