haproxy簡介
HAProxy是一款提供高可用性、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理軟件指么。暫時不支持UDP協(xié)議
主要版本
版本1.8:多線程酝惧,HTTP / 2,緩存伯诬,動態(tài)服務(wù)器添加/刪除晚唇,無縫重新加載,DNS SRV盗似,硬件SSL引擎哩陕,...
版本1.7:增加了服務(wù)器熱重新配置,內(nèi)容處理代理赫舒,多種證書悍及,... -
版本1.6:添加DNS解析支持,HTTP連接復(fù)用接癌,完整的粘貼表復(fù)制心赶,無狀態(tài)壓縮,...
版本1.5:添加SSL缺猛,IPv6缨叫,保持活著椭符,DDoS保護(hù),... -
1.4版:不需要SSL的人最穩(wěn)定的版本耻姥。仍然提供客戶端連接包活
高性能
- 單進(jìn)程事件驅(qū)動的模型大大降低了上下文切換 和內(nèi)存使用的成本 销钝。在幾毫秒內(nèi)處理數(shù)百個任務(wù)是可能的,并且內(nèi)存使用量是每個會話幾千字節(jié)的數(shù)量級琐簇,而預(yù)先執(zhí)行的或線程化的服務(wù)器中消耗的內(nèi)存更多是每個進(jìn)程的兆字節(jié)數(shù)量級蒸健。
- O(1)事件檢查系統(tǒng),允許它(Linux和FreeBSD)鸽嫂,允許瞬間檢測任何事件在成千上萬的任何連接。
- 使用延遲事件緩存延遲對事件檢查器的更新可確保我們絕不會在事件絕對需要的情況下更新事件征讲。這節(jié)省了很多系統(tǒng)調(diào)用据某。
- 只要可能,在讀寫之間沒有任何數(shù)據(jù)拷貝的單緩沖诗箍。這節(jié)省了大量的CPU周期和有用的內(nèi)存帶寬癣籽。通常,瓶頸將是CPU和網(wǎng)絡(luò)接口之間的I / O總線滤祖。在10-100 Gbps時筷狼,內(nèi)存帶寬也可能成為瓶頸。
- 使用Linux下的splice()系統(tǒng)調(diào)用可以實(shí)現(xiàn)零拷貝轉(zhuǎn)發(fā)匠童,并且從Linux 3.5開始實(shí)現(xiàn)零拷貝埂材。這允許一個小型3瓦設(shè)備(如希捷Dockstar)以千兆/秒的速度轉(zhuǎn)發(fā)HTTP流量。
- MRU 內(nèi)存分配器使用固定大小的內(nèi)存池進(jìn)行即時內(nèi)存分配汤求,有利于冷高速緩存中的熱緩存區(qū)域俏险。這大大縮短了創(chuàng)建新會話所需的時間。
- 工作分解(例如同時接受多個accept)以及在多進(jìn)程模式下運(yùn)行時限制每次迭代accept()的次數(shù)的能力扬绪,以便負(fù)載在進(jìn)程間平均分配竖独。
- 在多進(jìn)程模式下運(yùn)行時支持CPU親和性,或者僅適應(yīng)硬件挤牛,并盡可能靠近管理NIC的CPU內(nèi)核莹痢,而不與其沖突。
- 基于樹的存儲墓赴,大量使用彈性二叉樹我已經(jīng)開發(fā)了好幾年了竞膳。這用于保持定時器的有序性,以保持runqueue的有序性诫硕,以管理循環(huán)和最少連接隊(duì)列顶猜,僅在O(log(N))成本中查找表中的ACL或密鑰。
- 優(yōu)化的定時器隊(duì)列:如果定時器被推遲痘括,定時器不會在樹中移動长窄,因?yàn)樗鼈儽粷M足的可能性接近于零滔吠,因?yàn)樗鼈冎饕糜诔瑫r處理。這進(jìn)一步優(yōu)化了ebtree的使用挠日。
- 優(yōu)化的HTTP頭分析:頭文件被解析和動態(tài)解析疮绷,解析被優(yōu)化以避免重新讀取任何先前讀取的內(nèi)存區(qū)域。檢查點(diǎn)用于當(dāng)一個不完整的頭部達(dá)到緩沖區(qū)的末端時嚣潜,以便當(dāng)更多的數(shù)據(jù)被讀取時解析不會從頭再次開始冬骚。在快速Xeon E5上解析平均HTTP請求通常需要半微秒。
- 仔細(xì)減少昂貴的系統(tǒng)調(diào)用的次數(shù)懂算。大部分工作是在用戶空間默認(rèn)完成的只冻,如時間讀取,緩沖區(qū)聚合计技,文件描述符啟用/禁用喜德。
- 內(nèi)容分析被優(yōu)化為只攜帶指向原始數(shù)據(jù)的指針,并且除非數(shù)據(jù)需要被轉(zhuǎn)換垮媒,否則不會復(fù)制舍悯。這確保了非常小的結(jié)構(gòu)被轉(zhuǎn)移,并且當(dāng)不是絕對必要時內(nèi)容不會被復(fù)制睡雇。
衡量負(fù)載平衡器性能有三個重要因素:
會話速率
會話并發(fā)性
數(shù)據(jù)轉(zhuǎn)發(fā)速率
安全
建議使用root用戶啟動萌衬,因?yàn)榭梢允褂胏hroot()提高提高系統(tǒng)安全性。
使用upd方式發(fā)送日志它抱,提供較多排查信息秕豫。
配置文件格式
- 配置文件一行總是優(yōu)先
- global,設(shè)置全過程參數(shù)
- 代理部分可以采取“default”观蓄,“l(fā)isten”馁蒂,
“frontend”和“backend”的形式。
測試配置命令:
$ haproxy -f configuration.conf -c
全局參數(shù)
-
Process management and security
- ca-base SSL CA證書目錄蜘腌,“ca-file”和“crl-file”指定的絕對位置為準(zhǔn)
- chroot chroot目錄
- crt-base 和ca-base類似
- daemon 守護(hù)進(jìn)程方式
- gid 指定gid
- group
- log <ip>
- log-send-hostname
- nbproc <num> 守護(hù)進(jìn)程數(shù)量默認(rèn)為1
- pidfile
- uid
- ulimit-n
- user
- stats
- ssl-server-verify
- node 此語句在兩個或更多進(jìn)程或服務(wù)器共享相同IP地址的HA配置中非常有用沫屡。通過在所有節(jié)點(diǎn)上設(shè)置不同的節(jié)點(diǎn)名稱,很容易立即發(fā)現(xiàn)哪個服務(wù)器正在處理流量撮珠。
- description
- unix-bind
-
性能調(diào)整
- max-spread-checks
- maxconn 最大連接數(shù)
- maxconnrate
- maxcomprate
- maxcompcpuusage
- maxpipes
- maxsessrate
- maxsslconn
- maxsslrate
- noepoll 禁止在BSD上使用“kqueue”事件輪詢系統(tǒng)沮脖。
- nokqueue
- nopoll 禁用在Linux上使用“epoll”事件輪詢系統(tǒng)。
- nosplice 禁止在Linux上的套接字之間使用內(nèi)核tcp連接芯急。
- nogetaddrinfo
- spread-checks
- tune.bufsize
- tune.chksize
- tune.comp.maxlevel
- tune.http.cookielen
- tune.http.maxhdr
- tune.idletimer
- tune.maxaccept
- tune.maxpollevents
- tune.maxrewrite
- tune.pipesize
- tune.rcvbuf.client
- tune.rcvbuf.server
- tune.sndbuf.client
- tune.sndbuf.server
- tune.ssl.cachesize
- tune.ssl.lifetime
- tune.ssl.force-private-cache
- tune.ssl.maxrecord
- tune.ssl.default-dh-param
- tune.zlib.memlevel
- tune.zlib.windowsize
-
Debugging
- debug
- quiet
更多詳細(xì)解釋請參考官方文檔
后端配置
“defaults”段用于為所有其它配置段提供默認(rèn)參數(shù)勺届,這配置默認(rèn)配置參數(shù)可由下一個“defaults”所重新設(shè)定。
“frontend”段用于定義一系列監(jiān)聽的套接字娶耍,這些套接字可接受客戶端請求并與之建立連接免姿。
“backend”段用于定義一系列“后端”服務(wù)器,代理將會將對應(yīng)客戶端的請求轉(zhuǎn)發(fā)至這些服務(wù)器榕酒。
“l(fā)isten”段通過關(guān)聯(lián)“frontend”和“backend”定義了一個完整的代理胚膊,通常只對TCP流量有用故俐。
關(guān)鍵字段解析
1, balance
balance url_param [check_post []]
定義負(fù)載均衡算法,可用于“defaults”紊婉、“l(fā)isten”和“backend”药版。用于在負(fù)載均衡場景中挑選一個server,其僅應(yīng)用于持久信息不可用的條件下或需要將一個連接重新派發(fā)至另一個服務(wù)器時喻犁。支持的算法有:
roundrobin:基于權(quán)重進(jìn)行輪叫槽片,在服務(wù)器的處理時間保持均勻分布時,這是最平衡肢础、最公平的算法还栓。此算法是動態(tài)的,這表示其權(quán)重可以在運(yùn)行時進(jìn)行調(diào)整传轰,不過剩盒,在設(shè)計上,每個后端服務(wù)器僅能最多接受4128個連接路召;并支持慢啟動勃刨。
static-rr:基于權(quán)重進(jìn)行輪叫波材,與roundrobin類似股淡,但是為靜態(tài)方法,在運(yùn)行時調(diào)整其服務(wù)器權(quán)重不會生效廷区;不過唯灵,其在后端服務(wù)器連接數(shù)上沒有限制;不支持慢啟動隙轻,在高負(fù)荷的情況下埠帕,服務(wù)器重新上線時會立即被分配大量連接。
leastconn(WLC):適用于長連接的會話玖绿,新的連接請求被派發(fā)至具有最少連接數(shù)目的后端服務(wù)器敛瓷;在有著較長時間會話的場景中推薦使用此算法,如LDAP斑匪、SQL等呐籽,其并不太適用于較短會話的應(yīng)用層協(xié)議,如HTTP蚀瘸;此算法是動態(tài)的狡蝶,可以在運(yùn)行時調(diào)整其權(quán)重;
source:將請求的源地址進(jìn)行hash運(yùn)算贮勃,并由后端服務(wù)器的權(quán)重總數(shù)相除后派發(fā)至某匹配的服務(wù)器贪惹;這可以使得同一個客戶端IP的請求始終被派發(fā)至某特定的服務(wù)器;不過寂嘉,當(dāng)服務(wù)器權(quán)重總數(shù)發(fā)生變化時奏瞬,如某服務(wù)器宕機(jī)或添加了新的服務(wù)器枫绅,許多客戶端的請求可能會被派發(fā)至與此前請求不同的服務(wù)器;常用于負(fù)載均衡無cookie功能的基于TCP的協(xié)議丝格;其默認(rèn)為靜態(tài)撑瞧,不過也可以使用hash-type修改此特性;
對原地址hash显蝌,第一次調(diào)度時使用WLC
source:IP層预伺,位于同一個NAT服務(wù)器背后的多個請求都會定向至同一個upstream server,不利于負(fù)載均衡曼尊,一般只有不支持使用cookie插入又需要保持會話時使用 cookie:應(yīng)用層酬诀,有更好的負(fù)載均衡效果;
hash/weight%ip :除以權(quán)重取模
uri:對URI的左半部分(“問題”標(biāo)記之前的部分)或整個URI進(jìn)行hash運(yùn)算骆撇,并由服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器瞒御;這可以使得對同一個URI的請求總是被派發(fā)至某特定的服務(wù)器,除非服務(wù)器的權(quán)重總數(shù)發(fā)生了變化神郊;此算法常用于代理緩存或反病毒代理以提高緩存的命中率肴裙;需要注意的是,此算法僅應(yīng)用于HTTP后端服務(wù)器場景涌乳;其默認(rèn)為靜態(tài)算法蜻懦,不過也可以使用hash-type修改此特性;
url_param:通過<argument>為URL指定的參數(shù)在每個HTTP GET請求中將會被檢索夕晓;如果找到了指定的參數(shù)且其通過等于號“=”被賦予了一個值宛乃,那么此值將被執(zhí)行hash運(yùn)算并被服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器;此算法可以通過追蹤請求中的用戶標(biāo)識進(jìn)而確保同一個用戶ID的請求將被送往同一個特定的服務(wù)器蒸辆,除非服務(wù)器的總權(quán)重發(fā)生了變化征炼;如果某請求中沒有出現(xiàn)指定的參數(shù)或其沒有有效值,則使用輪叫算法對相應(yīng)請求進(jìn)行調(diào)度躬贡;此算法默認(rèn)為靜態(tài)的谆奥,不過其也可以使用hash-type修改此特性;
hdr(<name>):對于每個HTTP請求拂玻,通過<name>指定的HTTP首部將會被檢索器罐;如果相應(yīng)的首部沒有出現(xiàn)或其沒有有效值鳖眼,則使用輪叫算法對相應(yīng)請求進(jìn)行調(diào)度;其有一個可選選項(xiàng)“use_domain_only”,可在指定檢索類似Host類的首部時僅計算域名部分以降低hash算法的運(yùn)算量溶耘;此算法默認(rèn)為靜態(tài)的氏豌,不過其也可以使用hash-type修改此特性冤狡;
2, mode
tcp:實(shí)例運(yùn)行于純TCP模式聊品,在客戶端和服務(wù)器端之間將建立一個全雙工的連接,且不會對7層報文做任何類型的檢查乡括;通常用于SSL肃廓、SSH智厌、SMTP等應(yīng)用;
http:實(shí)例運(yùn)行于HTTP模式盲赊,客戶端請求在轉(zhuǎn)發(fā)至后端服務(wù)器之前將被深度分析铣鹏,所有不與RFC格式兼容的請求都會被拒絕;此為默認(rèn)模式哀蘑;
3, hash-type
map-based:hash表是一個包含了所有在線服務(wù)器的靜態(tài)數(shù)組诚卸。其hash值將會非常平滑,會將權(quán)重考慮在列绘迁,但其為靜態(tài)方法合溺,對在線服務(wù)器的權(quán)重進(jìn)行調(diào)整將不會生效,這意味著其不支持慢速啟動缀台。此外棠赛,挑選服務(wù)器是根據(jù)其在數(shù)組中的位置進(jìn)行的,因此膛腐,當(dāng)一臺服務(wù)器宕機(jī)或添加了一臺新的服務(wù)器時睛约,大多數(shù)連接將會被重新派發(fā)至一個與此前不同的服務(wù)器上,對于緩存服務(wù)器的工作場景來說哲身,此方法不甚適用辩涝。
consistent:“一致性哈希算法”,hash表是一個由各服務(wù)器填充而成的樹狀結(jié)構(gòu)律罢,將服務(wù)器散列在hash環(huán)上膀值;基于hash鍵在hash樹中查找相應(yīng)的服務(wù)器時棍丐,最近的服務(wù)器將被選中误辑。此方法是動態(tài)的,支持在運(yùn)行時修改服務(wù)器權(quán)重歌逢,因此兼容慢速啟動的特性巾钉。添加一個新的服務(wù)器時,僅會對一小部分請求產(chǎn)生影響秘案,因此砰苍,尤其適用于后端服務(wù)器為cache的場景。不過阱高,此算法不甚平滑赚导,派發(fā)至各服務(wù)器的請求未必能達(dá)到理想的均衡效果,因此赤惊,可能需要不時的調(diào)整服務(wù)器的權(quán)重以獲得更好的均衡性吼旧。
4,log address facility level
global:當(dāng)前實(shí)例的日志系統(tǒng)參數(shù)同”global”段中的定義時未舟,將使用此格式圈暗;每個實(shí)例僅能定義一次“l(fā)og global”語句掂为,且其沒有任何額外參數(shù);
<address>:定義日志發(fā)往的位置员串,其格式之一可以為<IPv4_address:PORT>勇哗,其中的port為UDP協(xié)議端口,默認(rèn)為514寸齐;格式之二為Unix套接字文件路徑欲诺,但需要留心chroot應(yīng)用及用戶的讀寫權(quán)限;
<facility>:可以為syslog系統(tǒng)的標(biāo)準(zhǔn)facility之一渺鹦;
<level>:定義日志級別瞧栗,即輸出信息過濾器,默認(rèn)為所有信息海铆;指定級別時迹恐,所有等于或高于此級別的日志信息將會被發(fā)送;
5卧斟,maxconn
設(shè)定一個前端的最大并發(fā)連接數(shù)殴边,因此,其不能用于backend區(qū)段珍语。對于大型站點(diǎn)來說锤岸,可以盡可能提高此值以便讓haproxy管理連接隊(duì)列,從而避免無法應(yīng)答用戶請求板乙。當(dāng)然是偷,此最大值不能超出“global”段中的定義。此外募逞,需要留心的是蛋铆,haproxy會為每個連接維持兩個緩沖,每個緩沖的大小為8KB放接,再加上其它的數(shù)據(jù)刺啦,每個連接將大約占用17KB的RAM空間。這意味著經(jīng)過適當(dāng)優(yōu)化后纠脾,有著1GB的可用RAM空間時將能維護(hù)40000-50000并發(fā)連接玛瘸。
如果為<conns>指定了一個過大值,極端場景下苟蹈,其最終占據(jù)的空間可能會超出當(dāng)前主機(jī)的可用內(nèi)存糊渊,這可能會帶來意想不到的結(jié)果;因此慧脱,將其設(shè)定了一個可接受值方為明智決定渺绒。其默認(rèn)為2000。
6,server
后端聲明一個server芒篷,因此搜变,不能用于defaults和frontend區(qū)段。
<name>:為此服務(wù)器指定的內(nèi)部名稱针炉,其將出現(xiàn)在日志及警告信息中挠他;如果設(shè)定了”http-send-server-name”,它還將被添加至發(fā)往此服務(wù)器的請求首部中篡帕;
<address>:此服務(wù)器的的IPv4地址殖侵,也支持使用可解析的主機(jī)名,只不過在啟動時需要解析主機(jī)名至相應(yīng)的IPv4地址镰烧;
[:port]:指定將連接請求所發(fā)往的此服務(wù)器時的目標(biāo)端口拢军,其為可選項(xiàng);未設(shè)定時怔鳖,將使用客戶端請求時的同一相端口茉唉;
[param*]:為此服務(wù)器設(shè)定的一系參數(shù);其可用的參數(shù)非常多结执,具體請參考官方文檔中的說明度陆,下面僅說明幾個常用的參數(shù);
服務(wù)器或默認(rèn)服務(wù)器參數(shù):
backup:設(shè)定為備用服務(wù)器献幔,僅在負(fù)載均衡場景中的其它server均不可用于啟用此server懂傀;
check:啟動對此server執(zhí)行健康狀態(tài)檢查,其可以借助于額外的其它參數(shù)完成更精細(xì)的設(shè)定蜡感,如:
inter <delay>:設(shè)定健康狀態(tài)檢查的時間間隔蹬蚁,單位為毫秒,默認(rèn)為2000郑兴;也可以使用fastinter和downinter來根據(jù)服務(wù)器端狀態(tài)優(yōu)化此時間延遲犀斋;
rise <count>:設(shè)定健康狀態(tài)檢查中,某離線的server從離線狀態(tài)轉(zhuǎn)換至正常狀態(tài)需要成功檢查的次數(shù)杈笔;
fall <count>:確認(rèn)server從正常狀態(tài)轉(zhuǎn)換為不可用狀態(tài)需要檢查的次數(shù)闪水;
cookie <value>:為指定server設(shè)定cookie值糕非,此處指定的值將在請求入站時被檢查蒙具,第一次為此值挑選的server將在后續(xù)的請求中被選中,其目的在于實(shí)現(xiàn)持久連接的功能朽肥;
maxconn <maxconn>:指定此服務(wù)器接受的最大并發(fā)連接數(shù)禁筏;如果發(fā)往此服務(wù)器的連接數(shù)目高于此處指定的值,其將被放置于請求隊(duì)列衡招,以等待其它連接被釋放篱昔;
haproxy 有n個進(jìn)程,每個支持m個連接,后端有x個服務(wù)器州刽,每個最大支持y個連接空执,則 nm <= xy,如果后端服務(wù)器支持排隊(duì)穗椅,則nm <= x(y+z)辨绊,z為每個服務(wù)器的排隊(duì)隊(duì)列
maxqueue <maxqueue>:設(shè)定請求隊(duì)列的最大長度;
observe <mode>:通過觀察服務(wù)器的通信狀況來判定其健康狀態(tài)匹表,默認(rèn)為禁用门坷,其支持的類型有“l(fā)ayer4”和“l(fā)ayer7”,“l(fā)ayer7”僅能用于http代理場景袍镀;
redir <prefix>:啟用重定向功能默蚌,將發(fā)往此服務(wù)器的GET和HEAD請求均以302狀態(tài)碼響應(yīng);需要注意的是苇羡,在prefix后面不能使用/绸吸,且不能使用相對地址,以免造成循環(huán);
weight <weight>:權(quán)重设江,默認(rèn)為1惯裕,最大值為256,0表示不參與負(fù)載均衡绣硝;
7蜻势,capture request header
capture request header <name> len <length>
捕獲并記錄指定的請求首部最近一次出現(xiàn)時的第一個值,僅能用于frontend和listen區(qū)段鹉胖。捕獲的首部值使用花括號{}括起來后添加進(jìn)日志中握玛。如果需要捕獲多個首部值,它們將以指定的次序出現(xiàn)在日志文件中甫菠,并以豎線“|”作為分隔符挠铲。不存在的首部記錄為空字符串,最常需要捕獲的首部包括在虛擬主機(jī)環(huán)境中使用的“Host”寂诱、上傳請求首部中的“Content-length”拂苹、快速區(qū)別真實(shí)用戶和網(wǎng)絡(luò)機(jī)器人的“User-agent”,以及代理環(huán)境中記錄真實(shí)請求來源的X-Forward-For痰洒。
<name>:要捕獲的首部的名稱瓢棒,此名稱不區(qū)分字符大小寫,但建議與它們出現(xiàn)在首部中的格式相同丘喻,比如大寫首字母脯宿。需要注意的是,記錄在日志中的是首部對應(yīng)的值泉粉,而非首部名稱连霉。
<length>:指定記錄首部值時所記錄的精確長度榴芳,超出的部分將會被忽略。
可以捕獲的請求首部的個數(shù)沒有限制跺撼,但每個捕獲最多只能記錄64個字符窟感。為了保證同一個frontend中日志格式的統(tǒng)一性,首部捕獲僅能在frontend中定義歉井。
8肌括, capture response header
capture response header <name> len <length>
捕獲并記錄響應(yīng)首部,其格式和要點(diǎn)同請求首部酣难。
9谍夭,stats enable
示例:
stats enable
stats hide-version
stats scope .
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth statsadmin:password
stats auth statsmaster:password
10,option httplog
默認(rèn)情況下憨募,日志輸入格式非常簡陋紧索,因?yàn)槠鋬H包括源地址、目標(biāo)地址和實(shí)例名稱菜谣,而“option httplog”參數(shù)將會使得日志格式變得豐富許多珠漂,其通常包括但不限于HTTP請求、連接計時器尾膊、會話狀態(tài)媳危、連接數(shù)、捕獲的首部cookie冈敛、frontend待笑、backend及服務(wù)器名稱,當(dāng)然也包括源地址和端口號等抓谴。
11暮蹂,option forwardfor 添加X-forward-for,客戶的真實(shí)IP地址癌压。
option forwardfor [ except <network> ] [ header <name> ] [ if-none ]
<network>:可選參數(shù)仰泻,當(dāng)指定時,源地址為匹配至此網(wǎng)絡(luò)中的請求都禁用此功能滩届。
<name>:可選參數(shù)集侯,可使用一個自定義的首部。
if-none:僅在此首部不存在時才將其添加至請求報文問道中帜消。
12棠枉,errorfile
在用戶請求不存在的頁面時,返回一個頁面文件給客戶端而非由haproxy生成的錯誤代碼券犁;可用于所有段中术健。
<code>:指定對HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有200粘衬、400、403、408稚新、500勘伺、502、503和504褂删;
<file>:指定用于響應(yīng)的頁面文件飞醉;
13,ACL
haproxy的ACL用于實(shí)現(xiàn)基于請求報文的首部屯阀、響應(yīng)報文的內(nèi)容或其它的環(huán)境狀態(tài)信息來做出轉(zhuǎn)發(fā)決策缅帘,這大大增強(qiáng)了其配置彈性。其配置法則通常分為兩步难衰,首先去定義ACL钦无,譬如用來做動靜分離,定義ACL的語法格式如下盖袭。
acl <aclname> <criterion> [flags] [operator] <value> ...
<aclname>:ACL名稱失暂,區(qū)分字符大小寫,且其只能包含大小寫字母鳄虱、數(shù)字弟塞、-(連接線)、_(下劃線)拙已、.(點(diǎn)號)和:(冒號)决记;haproxy中,acl可以重名倍踪,這可以把多個測試條件定義為一個共同的acl霉涨;
<criterion>:測試標(biāo)準(zhǔn),即對什么信息發(fā)起測試惭适;測試方式可以由[flags]指定的標(biāo)志進(jìn)行調(diào)整笙瑟;而有些測試標(biāo)準(zhǔn)也可以需要為其在<value>之前指定一個操作符[operator];
[flags]:目前haproxy的acl支持的標(biāo)志位有3個:
-i:不區(qū)分<value>中模式字符的大小寫癞志;
-f:從指定的文件中加載模式往枷;
--:標(biāo)志符的強(qiáng)制結(jié)束標(biāo)記,在模式中的字符串像標(biāo)記符時使用凄杯;
<value>:acl測試條件支持的值有以下四類:
整數(shù)或整數(shù)范圍:如1024:65535表示從1024至65535错洁;僅支持使用正整數(shù)(如果出現(xiàn)類似小數(shù)的標(biāo)識,其為通常為版本測試)戒突,且支持使用的操作符有5個屯碴,分別為eq、ge膊存、gt导而、le和lt忱叭;
字符串:支持使用“-i”以忽略字符大小寫,支持使用“\”進(jìn)行轉(zhuǎn)義今艺;如果在模式首部出現(xiàn)了-i韵丑,可以在其之前使用“–”標(biāo)志位;
正則表達(dá)式:其機(jī)制類同字符串匹配虚缎;
IP地址及網(wǎng)絡(luò)地址
同一個acl中可以指定多個測試條件撵彻,這些測試條件需要由邏輯操作符指定其關(guān)系。條件間的組合測試關(guān)系有三種:與(默認(rèn)即為與操作)实牡、或(使用||操作符)以及非(使用“!”操作符)陌僵。
hdr <string>
hdr(header) <string>
用于測試請求報文中的所有首部或指定首部是否滿足指定的條件;指定首部時创坞,其名稱不區(qū)分大小寫碗短,且在括號“()”中不能有任何多余的空白字符。測試服務(wù)器端的響應(yīng)報文時可以使用shdr()摆霉。例如下面的例子用于測試首部Connection的值是否為close豪椿。
hdr(Connection) -i close
method <string>
method <string>
測試HTTP請求報文中使用的方法。
path_beg <string>
用于測試請求的URL是否以<string>指定的模式開頭携栋。下面的例子用于測試URL是否以/static搭盾、/images、/javascript或/stylesheets頭婉支。
acl url_static path_beg -i /static /images /javascript /stylesheets
path_end <string>
用于測試請求的URL是否以<string>指定的模式結(jié)尾鸯隅。例如,下面的例子用戶測試URL是否以jpg向挖、gif蝌以、png、css或js結(jié)尾何之。
acl url_static path_end -i .jpg .gif .png .css .js
hdr_beg <string>
用于測試請求報文的指定首部的開頭部分是否符合<string>指定的模式跟畅。例如,下面的例子用記測試請求是否為提供靜態(tài)內(nèi)容的主機(jī)img溶推、video徊件、download或ftp。
acl host_static hdr_beg(host) -i img. video. download. ftp.
hdr_end <string>
用于測試請求報文的指定首部的結(jié)尾部分是否符合<string>指定的模式蒜危。
定義獨(dú)立日志
[root@hadoop01 haproxy]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r -c 2"
[root@hadoop01 haproxy]# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
local2.* /var/log/haproxy.log
Http代理示例:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend web:
bind *:80
acl url_static path_beg -i /img
acl url_static path_end -i .jpg
use_backend web_static if url_static
default_backend webserver
backend web_static
balance roundrobin
server web_static 172.16.10.53:80 check maxconn 20000
backend webserver
balance roundrobin
server app1 172.16.10.53:80 check maxconn 20000
server app2 172.16.10.54:80 check maxconn 20000
listen statistics
bind *:8009
stats auth admin:admin # 統(tǒng)計頁面用戶名和密碼設(shè)置
stats uri /admin?stats # 自定義統(tǒng)計頁面的URL虱痕,默認(rèn)為/haproxy?stats
stats hide-version # 隱藏統(tǒng)計頁面上HAProxy的版本信息
stats refresh 30s # 統(tǒng)計頁面自動刷新時間
stats admin if TRUE #如果認(rèn)證通過就做管理功能,可以管理后端的服務(wù)器
stats realm Hapadmin # 統(tǒng)計頁面密碼框上提示文本辐赞,默認(rèn)為Haproxy\ Statistics
MySQL代理示例:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend mysql
bind *:3306
mode tcp
log global
default_backend mysqlservers
backend mysqlservers
balance roundrobin
server ms1 172.16.10.53:3306 check inter 2 rise 1 fall 2 maxconn 400
server ms2 172.16.10.54:3306 check inter 2 rise 1 fall 2 maxconn 400
listen statistics
bind *:8009
mode http
stats auth admin:admin # 統(tǒng)計頁面用戶名和密碼設(shè)置
stats uri /admin?stats # 自定義統(tǒng)計頁面的URL部翘,默認(rèn)為/haproxy?stats
stats hide-version # 隱藏統(tǒng)計頁面上HAProxy的版本信息
stats refresh 30s # 統(tǒng)計頁面自動刷新時間
stats admin if TRUE #如果認(rèn)證通過就做管理功能,可以管理后端的服務(wù)器
stats realm Hapadmin # 統(tǒng)計頁面密碼框上提示文本响委,默認(rèn)為Haproxy\ Statistics
參考鏈接:
http://www.tianfeiyu.com/?p=1061
https://www.haproxy.org/download/1.5/doc/configuration.txt