這篇文章主要講解了“在CentOS上如何完全安裝和使用代理軟件HAProxy”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“在CentOS上如何完全安裝和使用代理軟件HAProxy”吧!
創(chuàng)新互聯(lián)建站是少有的成都做網(wǎng)站、網(wǎng)站制作、營銷型企業(yè)網(wǎng)站、微信小程序定制開發(fā)、手機(jī)APP,開發(fā)、制作、設(shè)計(jì)、買友情鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,自2013年創(chuàng)立以來,堅(jiān)持透明化,價(jià)格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評一、HAProxy簡介
(1)HAProxy 是一款提供高可用性、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理軟件,支持虛擬主機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。 HAProxy特別適用于那些負(fù)載特大的web站點(diǎn),這些站點(diǎn)通常又需要會(huì)話保持或七層處理。HAProxy運(yùn)行在時(shí)下的硬件上,完全可以支持?jǐn)?shù)以萬計(jì)的 并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。
(2)HAProxy 實(shí)現(xiàn)了一種事件驅(qū)動(dòng)、單一進(jìn)程模型,此模型支持非常大的并發(fā)連接數(shù)。多進(jìn)程或多線程模型受內(nèi)存限制 、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制,很少能處理數(shù)千并發(fā)連接。事件驅(qū)動(dòng)模型因?yàn)樵谟懈玫馁Y源和時(shí)間管理的用戶端(User-Space) 實(shí)現(xiàn)所有這些任務(wù),所以沒有這些問題。此模型的弊端是,在多核系統(tǒng)上,這些程序通常擴(kuò)展性較差。這就是為什么他們必須進(jìn)行優(yōu)化以 使每個(gè)CPU時(shí)間片(Cycle)做更多的工作。
(3)HAProxy 支持連接拒絕 : 因?yàn)榫S護(hù)一個(gè)連接的打開的開銷是很低的,有時(shí)我們很需要限制攻擊蠕蟲(attack bots),也就是說限制它們的連接打開從而限制它們的危害。 這個(gè)已經(jīng)為一個(gè)陷于小型DDoS攻擊的網(wǎng)站開發(fā)了而且已經(jīng)拯救
了很多站點(diǎn),這個(gè)優(yōu)點(diǎn)也是其它負(fù)載均衡器沒有的。
(4)HAProxy 支持全透明代理(已具備硬件防火墻的典型特點(diǎn)): 可以用客戶端IP地址或者任何其他地址來連接后端服務(wù)器. 這個(gè)特性僅在Linux 2.4/2.6內(nèi)核打了cttproxy補(bǔ)丁后才可以使用. 這個(gè)特性也使得為某特殊服務(wù)器處理部分流量同時(shí)又不修改服務(wù)器的地址成為可能。
性能
HAProxy借助于OS上幾種常見的技術(shù)來實(shí)現(xiàn)性能的較大化。
1,單進(jìn)程、事件驅(qū)動(dòng)模型顯著降低了上下文切換的開銷及內(nèi)存占用。
2,O(1)事件檢查器(event checker)允許其在高并發(fā)連接中對任何連接的任何事件實(shí)現(xiàn)即時(shí)探測。
3,在任何可用的情況下,單緩沖(single buffering)機(jī)制能以不復(fù)制任何數(shù)據(jù)的方式完成讀寫操作,這會(huì)節(jié)約大量的CPU時(shí)鐘周期及內(nèi)存帶寬;
4,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系統(tǒng)調(diào)用,HAProxy可以實(shí)現(xiàn)零復(fù)制轉(zhuǎn)發(fā)(Zero-copy forwarding),在Linux 3.5及以上的OS中還可以實(shí)現(xiàn)零復(fù)制啟動(dòng)(zero-starting);
5,內(nèi)存分配器在固定大小的內(nèi)存池中可實(shí)現(xiàn)即時(shí)內(nèi)存分配,這能夠顯著減少創(chuàng)建一個(gè)會(huì)話的時(shí)長;
6,樹型存儲(chǔ):側(cè)重于使用作者多年前開發(fā)的彈性二叉樹,實(shí)現(xiàn)了以O(shè)(log(N))的低開銷來保持計(jì)時(shí)器命令、保持運(yùn)行隊(duì)列命令及管理輪詢及最少連接隊(duì)列;
7,優(yōu)化的HTTP首部分析:優(yōu)化的首部分析功能避免了在HTTP首部分析過程中重讀任何內(nèi)存區(qū)域;
8,精心地降低了昂貴的系統(tǒng)調(diào)用,大部分工作都在用戶空間完成,如時(shí)間讀取、緩沖聚合及文件描述符的啟用和禁用等;
所有的這些細(xì)微之處的優(yōu)化實(shí)現(xiàn)了在中等規(guī)模負(fù)載之上依然有著相當(dāng)?shù)偷腃PU負(fù)載,甚至于在非常高的負(fù)載場景中,5%的用戶空間占用率和95%的系統(tǒng)空間占用率也是非常普遍的現(xiàn)象,這意味著HAProxy進(jìn)程消耗比系統(tǒng)空間消耗低20倍以上。因此,對OS進(jìn)行性能調(diào)優(yōu)是非常重要的。即使用戶空間的占用率提高一倍,其CPU占用率也僅為10%,這也解釋了為何7層處理對性能影響有限這一現(xiàn)象。由此,在高端系統(tǒng)上HAProxy的7層性能可輕易超過硬件負(fù)載均衡設(shè)備。
在生產(chǎn)環(huán)境中,在7層處理上使用HAProxy作為昂貴的高端硬件負(fù)載均衡設(shè)備故障故障時(shí)的緊急解決方案也時(shí)長可見。硬件負(fù)載均衡設(shè)備在“報(bào)文”級別處理請求,這在支持跨報(bào)文請求(request across multiple packets)有著較高的難度,并且它們不緩沖任何數(shù)據(jù),因此有著較長的響應(yīng)時(shí)間。對應(yīng)地,軟件負(fù)載均衡設(shè)備使用TCP緩沖,可建立極長的請求,且有著較大的響應(yīng)時(shí)間。
HAProxy目前主要有三個(gè)版本: 1.3 , 1.4 ,1.5,CentOS6.6 自帶的RPM包為 1.5 的。
二,安裝配置HAProxy
以下實(shí)驗(yàn)環(huán)境均為CentOS6.6 i686平臺(tái)。
1,安裝haproxy
代碼如下:
[root@LB ~]# yum install -y haproxy #直接使用RPM來安裝
[root@LB ~]# rpm -qi haproxy #版本為1.5.4
Name : haproxy Relocations: (not relocatable)
Version : 1.5.4 Vendor: CentOS
Release : 2.el6 Build Date: Thu 23 Jul 2015 04:26:35 PM PDT
Install Date: Sat 29 Aug 2015 06:49:30 PM PDT Build Host: c6b9.bsys.dev.centos.org
Group : System Environment/Daemons Source RPM: haproxy-1.5.4-2.el6.src.rpm
Size : 2542578 License: GPLv2+
Signature : RSA/SHA1, Fri 24 Jul 2015 01:39:18 PM PDT, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : http://www.haproxy.org/
Summary : HAProxy is a TCP/HTTP reverse proxy for high availability environments
[root@LB ~]# rpm -ql haproxy
/etc/haproxy
/etc/haproxy/haproxy.cfg ---------->配置文件
/etc/logrotate.d/haproxy
/etc/rc.d/init.d/haproxy
/etc/sysconfig/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/sbin/haproxy
[root@LB ~]# cd /etc/haproxy/
2,詳解配置文件
haproxy 的配置文件由兩部分組成:全局設(shè)定和對代理的設(shè)定,共分為五段:global,defaults,frontend,backend,listen。
2.1 配置文件格式
HAProxy的配置處理3類來主要參數(shù)來源:
——最優(yōu)先處理的命令行參數(shù);
——“global”配置段,用于設(shè)定全局配置參數(shù);
——proxy相關(guān)配置段,如“defaults”、“l(fā)isten”、“frontend”和“backend”;
2.2 時(shí)間格式
一些包含了值的參數(shù)表示時(shí)間,如超時(shí)時(shí)長。這些值一般以毫秒為單位,但也可以使用其它的時(shí)間單位后綴。
us: 微秒(microseconds),即1/1000000秒;
ms: 毫秒(milliseconds),即1/1000秒;
s: 秒(seconds);
m: 分鐘(minutes);
h:小時(shí)(hours);
d: 天(days);
2.3 全局配置
* 進(jìn)程管理及安全相關(guān)的參數(shù)
– chroot <jail dir>:修改haproxy的工作目錄至指定的目錄并在放棄權(quán)限之前執(zhí)行chroot()操作,可以提升haproxy的安全級別,不過需要注意的是要確保指定的目錄為空目錄且任何用戶均不能有寫權(quán)限;
– daemon:讓haproxy以守護(hù)進(jìn)程的方式工作于后臺(tái),其等同于“-D”選項(xiàng)的功能,當(dāng)然,也可以在命令行中以“-db”選項(xiàng)將其禁用;
– gid <number>:以指定的GID運(yùn)行haproxy,建議使用專用于運(yùn)行haproxy的GID,以免因權(quán)限問題帶來風(fēng)險(xiǎn);
– group <group name>:同gid,不過指定的組名;
– log <address> <facility> [max level [min level]]:定義全局的syslog服務(wù)器,最多可以定義兩個(gè);
– log-send-hostname [<string>]:在syslog信息的首部添加當(dāng)前主機(jī)名,可以為“string”指定的名稱,也可以缺省使用當(dāng)前主機(jī)名;
– nbproc <number>:指定啟動(dòng)的haproxy進(jìn)程的個(gè)數(shù),只能用于守護(hù)進(jìn)程模式的haproxy;默認(rèn)只啟動(dòng)一個(gè)進(jìn)程,鑒于調(diào)試?yán)щy等多方面的原因,一般只在單進(jìn)程僅能打開少數(shù)文件描述符的場景中才使用多進(jìn)程模式;
– pidfile:
– uid:以指定的UID身份運(yùn)行haproxy進(jìn)程;
– ulimit-n:設(shè)定每進(jìn)程所能夠打開的較大文件描述符數(shù)目,默認(rèn)情況下其會(huì)自動(dòng)進(jìn)行計(jì)算,因此不推薦修改此選項(xiàng);Linux默認(rèn)單進(jìn)程打開文件數(shù)為1024個(gè)
– user:同uid,但使用的是用戶名;
– stats:用戶訪問統(tǒng)計(jì)數(shù)據(jù)的接口
– node:定義當(dāng)前節(jié)點(diǎn)的名稱,用于HA場景中多haproxy進(jìn)程共享同一個(gè)IP地址時(shí);
– description:當(dāng)前實(shí)例的描述信息;
* 性能調(diào)整相關(guān)的參數(shù)
– maxconn <number>:設(shè)定每個(gè)haproxy進(jìn)程所接受的較大并發(fā)連接數(shù),其等同于命令行選項(xiàng)“-n”;“ulimit -n”自動(dòng)計(jì)算的結(jié)果正是參照此參數(shù)設(shè)定的;
– maxpipes <number>:haproxy使用pipe完成基于內(nèi)核的tcp報(bào)文重組,此選項(xiàng)則用于設(shè)定每進(jìn)程所允許使用的較大pipe個(gè)數(shù);每個(gè)pipe會(huì)打開兩個(gè)文件描述符,因此,“ulimit -n”自動(dòng)計(jì)算時(shí)會(huì)根據(jù)需要調(diào)大此值;默認(rèn)為maxconn/4,其通常會(huì)顯得過大;
– noepoll:在Linux系統(tǒng)上禁用epoll機(jī)制;
– nokqueue:在BSE系統(tǒng)上禁用kqueue機(jī)制;
– nopoll:禁用poll機(jī)制;
– nosepoll:在Linux禁用啟發(fā)式epoll機(jī)制;
– nosplice:禁止在Linux套接字上使用內(nèi)核tcp重組,這會(huì)導(dǎo)致更多的recv/send系統(tǒng)調(diào)用;不過,在Linux 2.6.25-28系列的內(nèi)核上,tcp重組功能有bug存在;
– spread-checks <0..50, in percent>:在haproxy后端有著眾多服務(wù)器的場景中,在精確的時(shí)間間隔后統(tǒng)一對眾服務(wù)器進(jìn)行健康狀況檢查可能會(huì)帶來意外問題;此選項(xiàng)用于將其檢查的時(shí)間間隔長度上增加或減小一定的隨機(jī)時(shí)長;
– tune.bufsize <number>:設(shè)定buffer的大小,同樣的內(nèi)存條件小,較小的值可以讓haproxy有能力接受更多的并發(fā)連接,較大的值可以讓某些應(yīng)用程序使用較大的cookie信息;默認(rèn)為16384,其可以在編譯時(shí)修改,不過強(qiáng)烈建議使用默認(rèn)值;
– tune.chksize <number>:設(shè)定檢查緩沖區(qū)的大小,單位為字節(jié);更大的值有助于在較大的頁面中完成基于字符串或模式的文本查找,但也會(huì)占用更多的系統(tǒng)資源;不建議修改;
– tune.maxaccept <number>:設(shè)定haproxy進(jìn)程內(nèi)核調(diào)度運(yùn)行時(shí)一次性可以接受的連接的個(gè)數(shù),較大的值可以帶來較大的吞吐率,默認(rèn)在單進(jìn)程模式下為100,多進(jìn)程模式下為8,設(shè)定為-1可以禁止此限制;一般不建議修改;
– tune.maxpollevents <number>:設(shè)定一次系統(tǒng)調(diào)用可以處理的事件較大數(shù),默認(rèn)值取決于OS;其值小于200時(shí)可節(jié)約帶寬,但會(huì)略微增大網(wǎng)絡(luò)延遲,而大于200時(shí)會(huì)降低延遲,但會(huì)稍稍增加網(wǎng)絡(luò)帶寬的占用量;
– tune.maxrewrite <number>:設(shè)定為首部重寫或追加而預(yù)留的緩沖空間,建議使用1024左右的大小;在需要使用更大的空間時(shí),haproxy會(huì)自動(dòng)增加其值;
– tune.rcvbuf.client <number>:
– tune.rcvbuf.server <number>:設(shè)定內(nèi)核套接字中服務(wù)端或客戶端接收緩沖的大小,單位為字節(jié);強(qiáng)烈推薦使用默認(rèn)值;
– tune.sndbuf.client:
– tune.sndbuf.server:
* Debug相關(guān)的參數(shù)
- debug
- quiet
* 超時(shí)時(shí)長
timeout http request :在客戶端建立連接但不請求數(shù)據(jù)時(shí),關(guān)閉客戶端連接
timeout queue :等待較大時(shí)長
timeout connect: 定義haproxy將客戶端請求轉(zhuǎn)發(fā)至后端服務(wù)器所等待的超時(shí)時(shí)長
timeout client:客戶端非活動(dòng)狀態(tài)的超時(shí)時(shí)長
timeout server:客戶端與服務(wù)器端建立連接后,等待服務(wù)器端的超時(shí)時(shí)長,
timeout http-keep-alive :定義保持連接的超時(shí)時(shí)長
timeout check:健康狀態(tài)監(jiān)測時(shí)的超時(shí)時(shí)間,過短會(huì)誤判,過長資源消耗
maxconn :每個(gè)server較大的連接數(shù)
http-server-close : 在使用長連接時(shí),為了避免客戶端超時(shí)沒有關(guān)閉長連接,此功能可以使服務(wù)器端關(guān)閉長連接
redispatch: 在使用基于cookie定向時(shí),一旦后端某一server宕機(jī)時(shí),會(huì)將會(huì)話重新定向至某一上游服務(wù)器,必須使用 的選項(xiàng)
* 實(shí)現(xiàn)訪問控制:
http-request: 7層過濾
tcp-request content: tcp層過濾,四層過濾
2.4 代理
代理相關(guān)的配置可以如下配置段中
– defaults <name>
– frontend <name>
– backend <name>
– listen <name>
“defaults”段用于為所有其它配置段提供默認(rèn)參數(shù),這配置默認(rèn)配置參數(shù)可由下一個(gè)“defaults”所重新設(shè)定。
“frontend”段用于定義一系列監(jiān)聽的套接字,這些套接字可接受客戶端請求并與之建立連接。
“backend”段用于定義一系列“后端”服務(wù)器,代理將會(huì)將對應(yīng)客戶端的請求轉(zhuǎn)發(fā)至這些服務(wù)器。
“l(fā)isten”段通過關(guān)聯(lián)“frontend”和“backend”定義了一個(gè)完整的代理,通常只對TCP流量有用。
所有代理的名稱只能使用大寫字母、小寫字母、數(shù)字、-(中線)、_(下劃線)、.(點(diǎn)號)和:(冒號)。此外,ACL名稱會(huì)區(qū)分字母大小寫。
三、配置文件中的關(guān)鍵字參考
3.1 balance
代碼如下:
balance [ ]
balance url_param [check_post []]
定義負(fù)載均衡算法,可用于“defaults”、“l(fā)isten”和“backend”。用于在負(fù)載均衡場景中挑選一個(gè)server,其僅應(yīng)用于持久信息不可用的條件下或需要將一個(gè)連接重新派發(fā)至另一個(gè)服務(wù)器時(shí)。支持的算法有:
3.11 roundrobin:基于權(quán)重進(jìn)行輪叫,在服務(wù)器的處理時(shí)間保持均勻分布時(shí),這是最平衡、最公平的算法。此算法是動(dòng)態(tài)的,這表示其權(quán)重可以在運(yùn)行時(shí)進(jìn)行調(diào)整,不過,在設(shè)計(jì)上,每個(gè)后端服務(wù)器僅能最多接受4128個(gè)連接;并支持慢啟動(dòng)。
3.12 static-rr:基于權(quán)重進(jìn)行輪叫,與roundrobin類似,但是為靜態(tài)方法,在運(yùn)行時(shí)調(diào)整其服務(wù)器權(quán)重不會(huì)生效;不過,其在后端服務(wù)器連接數(shù)上沒有限制;不支持慢啟動(dòng),在高負(fù)荷的情況下,服務(wù)器重新上線時(shí)會(huì)立即被分配大量連接。
3.13 leastconn(WLC):適用于長連接的會(huì)話,新的連接請求被派發(fā)至具有最少連接數(shù)目的后端服務(wù)器;在有著較長時(shí)間會(huì)話的場景中推薦使用此算法,如LDAP、SQL等,其并不太適用于較短會(huì)話的應(yīng)用層協(xié)議,如HTTP;此算法是動(dòng)態(tài)的,
可以在運(yùn)行時(shí)調(diào)整其權(quán)重;
3.14 source:將請求的源地址進(jìn)行hash運(yùn)算,并由后端服務(wù)器的權(quán)重總數(shù)相除后派發(fā)至某匹配的服務(wù)器;這可以使得同一個(gè)客戶端IP的請求始終被派發(fā)至某特定的服務(wù)器;不過,當(dāng)服務(wù)器權(quán)重總數(shù)發(fā)生變化時(shí),如某服務(wù)器宕機(jī)或添加了新的服務(wù)器,許多客戶端的請求可能會(huì)被派發(fā)至與此前請求不同的服務(wù)器;常用于負(fù)載均衡無cookie功能的基于TCP的協(xié)議;其默認(rèn)為靜態(tài),不過也可以使用hash-type修改此特性;
1,對原地址hash,第一次調(diào)度時(shí)使用WLC
source:IP層,位于同一個(gè)NAT服務(wù)器背后的多個(gè)請求都會(huì)定向至同一個(gè)upstream server,不利于負(fù)載均衡,一般只有不支持使用cookie插入又需要保持會(huì)話時(shí)使用
cookie:應(yīng)用層,有更好的負(fù)載均衡效果;
2,hash/weight%ip :除以權(quán)重取模
3.15 uri:對URI的左半部分(“問題”標(biāo)記之前的部分)或整個(gè)URI進(jìn)行hash運(yùn)算,并由服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器;這可以使得對同一個(gè)URI的請求總是被派發(fā)至某特定的服務(wù)器,除非服務(wù)器的權(quán)重總數(shù)發(fā)生了變化;此算法常用于代理緩存或反病毒代理以提高緩存的命中率;需要注意的是,此算法僅應(yīng)用于HTTP后端服務(wù)器場景;其默認(rèn)為靜態(tài)算法,不過也可以使用hash-type修改此特性;
3.16 url_param:通過<argument>為URL指定的參數(shù)在每個(gè)HTTP GET請求中將會(huì)被檢索;如果找到了指定的參數(shù)且其通過等于號“=”被賦予了一個(gè)值,那么此值將被執(zhí)行hash運(yùn)算并被服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器;此算法可以通過追蹤請求中的用戶標(biāo)識(shí)進(jìn)而確保同一個(gè)用戶ID的請求將被送往同一個(gè)特定的服務(wù)器,除非服務(wù)器的總權(quán)重發(fā)生了變化;如果某請求中沒有出現(xiàn)指定的參數(shù)或其沒有有效值,則使用輪叫算法對相應(yīng)請求進(jìn)行調(diào)度;此算法默認(rèn)為靜態(tài)的,不過其也可以使用hash-type修改此特性;
3.17 hdr(<name>):對于每個(gè)HTTP請求,通過<name>指定的HTTP首部將會(huì)被檢索;如果相應(yīng)的首部沒有出現(xiàn)或其沒有有效值,則使用輪叫算法對相應(yīng)請求進(jìn)行調(diào)度;其有一個(gè)可選選項(xiàng)“use_domain_only”,可在指定檢索類似Host類的首部時(shí)僅計(jì)算域名部分(比如通過www.feiyu.com來說,僅計(jì)算feiyu字符串的hash值)以降低hash算法的運(yùn)算量;此算法默認(rèn)為靜態(tài)的,不過其也可以使用hash-type修改此特性;
3.18 rdp-cookie(name)
,表示根據(jù)據(jù)cookie(name)來鎖定并哈希每一次TCP請求。
3.2 bind
代碼如下:
bind [<address>]:<port_range> [, …]
bind [<address>]:<port_range> [, …] interface <interface>
此指令僅能用于frontend和listen區(qū)段,用于定義一個(gè)或幾個(gè)監(jiān)聽的套接字。
<address>:可選選項(xiàng),其可以為主機(jī)名、IPv4地址、IPv6地址或*;省略此選項(xiàng)、將其指定為*或0.0.0.0時(shí),將監(jiān)聽當(dāng)前系統(tǒng)的所有IPv4地址;<port_range>:可以是一個(gè)特定的TCP端口,也可是一個(gè)端口范圍(如5005-5010),代理服務(wù)器將通過指定的端口來接收客戶端請求;需要注意的是,每組監(jiān)聽的套接字<address:port>在同一個(gè)實(shí)例上只能使用一次,而且小于1024的端口需要有特定權(quán)限的用戶才能使用,這可能需要通過uid參數(shù)來定義;<interface>:指定物理接口的名稱,僅能在Linux系統(tǒng)上使用;其不能使用接口別名,而僅能使用物理接口名稱,而且只有管理有權(quán)限指定綁定的物理接口;
3.3 mode
代碼如下:
mode { tcp|http|health }
設(shè)定實(shí)例的運(yùn)行模式或協(xié)議。當(dāng)實(shí)現(xiàn)內(nèi)容交換時(shí),前端和后端必須工作于同一種模式(一般說來都是HTTP模式),否則將無法啟動(dòng)實(shí)例。
tcp:實(shí)例運(yùn)行于純TCP模式,在客戶端和服務(wù)器端之間將建立一個(gè)全雙工的連接,且不會(huì)對7層報(bào)文做任何類型的檢查;通常用于SSL、SSH、SMTP等應(yīng)用;
http:實(shí)例運(yùn)行于HTTP模式,客戶端請求在轉(zhuǎn)發(fā)至后端服務(wù)器之前將被深度分析,所有不與RFC格式兼容的請求都會(huì)被拒絕;此為默認(rèn)模式;
health:實(shí)例工作于health模式,其對入站請求僅響應(yīng)“OK”信息并關(guān)閉連接,且不會(huì)記錄任何日志信息;此模式將用于響應(yīng)外部組件的健康狀態(tài)檢查請求;目前來講,此模式已經(jīng)廢棄,因?yàn)閠cp或http模式中的monitor關(guān)鍵字可完成類似功能;
3.4 hash-type
代碼如下:
hash-type <method>
定義用于將hash碼映射至后端服務(wù)器的方法;其不能用于frontend區(qū)段;可用方法有map-based和consistent,在大多數(shù)場景下推薦使用默認(rèn)的map-based方法。
map-based:hash表是一個(gè)包含了所有在線服務(wù)器的靜態(tài)數(shù)組。其hash值將會(huì)非常平滑,會(huì)將權(quán)重考慮在列,但其為靜態(tài)方法,對在線服務(wù)器的權(quán)重進(jìn)行調(diào)整將不會(huì)生效,這意味著其不支持慢速啟動(dòng)。此外,挑選服務(wù)器是根據(jù)其在數(shù)組中的
位置進(jìn)行的,因此,當(dāng)一臺(tái)服務(wù)器宕機(jī)或添加了一臺(tái)新的服務(wù)器時(shí),大多數(shù)連接將會(huì)被重新派發(fā)至一個(gè)與此前不同的服務(wù)器上,對于緩存服務(wù)器的工作場景來說,此方法不甚適用。
consistent:“一致性哈希算法”,hash表是一個(gè)由各服務(wù)器填充而成的樹狀結(jié)構(gòu),將服務(wù)器散列在hash環(huán)上;基于hash鍵在hash樹中查找相應(yīng)的服務(wù)器時(shí),最近的服務(wù)器將被選中。此方法是動(dòng)態(tài)的,支持在運(yùn)行時(shí)修改服務(wù)器權(quán)重,因此兼
容慢速啟動(dòng)的特性。添加一個(gè)新的服務(wù)器時(shí),僅會(huì)對一小部分請求產(chǎn)生影響,因此,尤其適用于后端服務(wù)器為cache的場景。不過,此算法不甚平滑,派發(fā)至各服務(wù)器的請求未必能達(dá)到理想的均衡效果,因此,可能需要不時(shí)的調(diào)整服務(wù)器的權(quán)
重以獲得更好的均衡性。
3.5 log
代碼如下:
log global
log <address> <facility> [<level> [<minlevel>]]
為每個(gè)實(shí)例啟用事件和流量日志,因此可用于所有區(qū)段。每個(gè)實(shí)例最多可以指定兩個(gè)log參數(shù),不過,如果使用了“l(fā)og global”且”global”段已經(jīng)定了兩個(gè)log參數(shù)時(shí),多余了log參數(shù)將被忽略。
global:當(dāng)前實(shí)例的日志系統(tǒng)參數(shù)同”global”段中的定義時(shí),將使用此格式;每個(gè)實(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)為所有信息;指定級別時(shí),所有等于或高于此級別的日志信息將會(huì)被發(fā)送;
3.6 maxconn
代碼如下:
maxconn <conns>
設(shè)定一個(gè)前端的較大并發(fā)連接數(shù),因此,其不能用于backend區(qū)段。對于大型站點(diǎn)來說,可以盡可能提高此值以便讓haproxy管理連接隊(duì)列,從而避免無法應(yīng)答用戶請求。當(dāng)然,此較大值不能超出“global”段中的定義。此外,需要留心的是,haproxy會(huì)為每個(gè)連接維持兩個(gè)緩沖,每個(gè)緩沖的大小為8KB,再加上其它的數(shù)據(jù),每個(gè)連接將大約占用17KB的RAM空間。這意味著經(jīng)過適當(dāng)優(yōu)化后,有著1GB的可用RAM空間時(shí)將能維護(hù)40000-50000并發(fā)連接。
如果為<conns>指定了一個(gè)過大值,極端場景下,其最終占據(jù)的空間可能會(huì)超出當(dāng)前主機(jī)的可用內(nèi)存,這可能會(huì)帶來意想不到的結(jié)果;因此,將其設(shè)定了一個(gè)可接受值方為明智決定。其默認(rèn)為2000。
3.7 default_backend
代碼如下:
default_backend <backend>
在沒有匹配的”use_backend”規(guī)則時(shí)為實(shí)例指定使用的默認(rèn)后端,因此,其不可應(yīng)用于backend區(qū)段。在”frontend”和”backend”之間進(jìn)行內(nèi)容交換時(shí),通常使用”use-backend”定義其匹配規(guī)則;而沒有被規(guī)則匹配到的請求將由此參數(shù)指定的后端接收。
<backend>:指定使用的后端的名稱;
使用案例:
代碼如下:
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic
3.8 server
代碼如下:
server <name> <address>[:port] [param*]
為后端聲明一個(gè)server,因此,不能用于defaults和frontend區(qū)段。
<name>:為此服務(wù)器指定的內(nèi)部名稱,其將出現(xiàn)在日志及警告信息中;如果設(shè)定了”http-send-server-name”,它還將被添加至發(fā)往此服務(wù)器的請求首部中;
<address>:此服務(wù)器的的IPv4地址,也支持使用可解析的主機(jī)名,只不過在啟動(dòng)時(shí)需要解析主機(jī)名至相應(yīng)的IPv4地址;
[:port]:指定將連接請求所發(fā)往的此服務(wù)器時(shí)的目標(biāo)端口,其為可選項(xiàng);未設(shè)定時(shí),將使用客戶端請求時(shí)的同一相端口;
[param*]:為此服務(wù)器設(shè)定的一系參數(shù);其可用的參數(shù)非常多,具體請參考官方文檔中的說明,下面僅說明幾個(gè)常用的參數(shù);
服務(wù)器或默認(rèn)服務(wù)器參數(shù):
backup:設(shè)定為備用服務(wù)器,僅在負(fù)載均衡場景中的其它server均不可用于啟用此server;
check:啟動(dòng)對此server執(zhí)行健康狀態(tài)檢查,其可以借助于額外的其它參數(shù)完成更精細(xì)的設(shè)定,如:
inter <delay>:設(shè)定健康狀態(tài)檢查的時(shí)間間隔,單位為毫秒,默認(rèn)為2000;也可以使用fastinter和downinter來根據(jù)服務(wù)器端狀態(tài)優(yōu)化此時(shí)間延遲;
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值,此處指定的值將在請求入站時(shí)被檢查,第一次為此值挑選的server將在后續(xù)的請求中被選中,其目的在于實(shí)現(xiàn)持久連接的功能;
maxconn <maxconn>:指定此服務(wù)器接受的較大并發(fā)連接數(shù);如果發(fā)往此服務(wù)器的連接數(shù)目高于此處指定的值,其將被放置于請求隊(duì)列,以等待其它連接被釋放;
haproxy 有n個(gè)進(jìn)程,每個(gè)支持m個(gè)連接,后端有x個(gè)服務(wù)器,每個(gè)較大支持y個(gè)連接,則 n*m <= x*y,如果后端服務(wù)器支持排隊(duì),則n*m <= x*(y+z),z為每個(gè)服務(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);例如:
代碼如下:
server srv1 172.16.100.6:80 redir http://imageserver.feiyu.com check
weight <weight>:權(quán)重,默認(rèn)為1,較大值為256,0表示不參與負(fù)載均衡(不被調(diào)度);
檢查方法:
代碼如下:
option httpchk
option httpchk :不能用于frontend段,例如:
代碼如下:
backend https_relay
mode tcp
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.feiyu.com
server apache1 192.168.1.1:443 check port 80
使用案例:
代碼如下:
server first 172.16.100.7:1080 cookie first check inter 1000
server second 172.16.100.8:1080 cookie second check inter 1000
3.9 capture request header
代碼如下:
capture request header <name> len <length>
捕獲并記錄指定的請求首部最近一次出現(xiàn)時(shí)的第一個(gè)值,僅能用于“frontend”和“l(fā)isten”區(qū)段。捕獲的首部值使用花括號{}括起來后添加進(jìn)日志中。如果需要捕獲多個(gè)首部值,它們將以指定的次序出現(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í)所記錄的精確長度,超出的部分將會(huì)被忽略。
可以捕獲的請求首部的個(gè)數(shù)沒有限制,但每個(gè)捕獲最多只能記錄64個(gè)字符。為了保證同一個(gè)frontend中日志格式的統(tǒng)一性,首部捕獲僅能在frontend中定義。
3.10 capture response header
代碼如下:
capture response header <name> len <length>
捕獲并記錄響應(yīng)首部,其格式和要點(diǎn)同請求首部。
3.11 stats enable
啟用基于程序編譯時(shí)默認(rèn)設(shè)置的統(tǒng)計(jì)報(bào)告,不能用于“frontend”區(qū)段。只要沒有另外的其它設(shè)定,它們就會(huì)使用如下的配置:
代碼如下:
- stats uri : /haproxy?stats
- stats realm : "HAProxy Statistics"
- stats auth : no authentication
- stats scope : no restriction
盡管“stats enable”一條就能夠啟用統(tǒng)計(jì)報(bào)告,但還是建議設(shè)定其它所有的參數(shù),以免其依賴于默認(rèn)設(shè)定而帶來非期后果。下面是一個(gè)配置案例。
代碼如下:
backend public_www
server websrv1 172.16.100.11:80
stats enable
stats hide-version
stats scope .
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth statsadmin:password
stats auth statsmaster:password
3.12 stats hide-version
代碼如下:
stats hide-version
啟用統(tǒng)計(jì)報(bào)告并隱藏HAProxy版本報(bào)告,不能用于“frontend”區(qū)段。默認(rèn)情況下,統(tǒng)計(jì)頁面會(huì)顯示一些有用信息,包括HAProxy的版本號,然而,向所有人公開HAProxy的精確版本號是非常有風(fēng)險(xiǎn)的,因?yàn)樗軒椭鷲阂庥脩艨焖俣ㄎ话姹镜娜毕莺吐┒?。盡管“stats hide-version”一條就能夠啟用統(tǒng)計(jì)報(bào)告,但還是建議設(shè)定其它所有的參數(shù),以免其依賴于默認(rèn)設(shè)定而帶來非期后果。具體請參照“stats enable”一節(jié)的說明。
3.13 stats realm
代碼如下:
stats realm <realm>
啟用統(tǒng)計(jì)報(bào)告并高精認(rèn)證領(lǐng)域,不能用于“frontend”區(qū)段。haproxy在讀取realm時(shí)會(huì)將其視作一個(gè)單詞,因此,中間的任何空白字符都必須使用反斜線進(jìn)行轉(zhuǎn)義。此參數(shù)僅在與“stats auth”配置使用時(shí)有意義。
<realm>:實(shí)現(xiàn)HTTP基本認(rèn)證時(shí)顯示在瀏覽器中的領(lǐng)域名稱,用于提示用戶輸入一個(gè)用戶名和密碼。
盡管“stats realm”一條就能夠啟用統(tǒng)計(jì)報(bào)告,但還是建議設(shè)定其它所有的參數(shù),以免其依賴于默認(rèn)設(shè)定而帶來非期后果。具體請參照“stats enable”一節(jié)的說明。
3.14 stats scope
代碼如下:
stats scope { <name> | "." }
啟用統(tǒng)計(jì)報(bào)告并限定報(bào)告的區(qū)段,不能用于“frontend”區(qū)段。當(dāng)指定此語句時(shí),統(tǒng)計(jì)報(bào)告將僅顯示其列舉出區(qū)段的報(bào)告信息,所有其它區(qū)段的信息將被隱藏。如果需要顯示多個(gè)區(qū)段的統(tǒng)計(jì)報(bào)告,此語句可以定義多次。需要注意的是,區(qū)段名稱檢測僅僅是以字符串比較的方式進(jìn)行,它不會(huì)真檢測指定的區(qū)段是否真正存在。
<name>:可以是一個(gè)“l(fā)isten”、“frontend”或“backend”區(qū)段的名稱,而“.”則表示stats scope語句所定義的當(dāng)前區(qū)段。
盡管“stats scope”一條就能夠啟用統(tǒng)計(jì)報(bào)告,但還是建議設(shè)定其它所有的參數(shù),以免其依賴于默認(rèn)設(shè)定而帶來非期后果。下面是一個(gè)配置案例。
代碼如下:
backend private_monitoring
stats enable
stats uri /haproxyadmin?stats
stats refresh 10s
3.15 stats auth
代碼如下:
stats auth <user>:<passwd>
啟用帶認(rèn)證的統(tǒng)計(jì)報(bào)告功能并授權(quán)一個(gè)用戶帳號,其不能用于“frontend”區(qū)段。
<user>:授權(quán)進(jìn)行訪問的用戶名;
<passwd>:此用戶的訪問密碼,明文格式;
此語句將基于默認(rèn)設(shè)定啟用統(tǒng)計(jì)報(bào)告功能,并僅允許其定義的用戶訪問,其也可以定義多次以授權(quán)多個(gè)用戶帳號。可以結(jié)合“stats realm”參數(shù)在提示用戶認(rèn)證時(shí)給出一個(gè)領(lǐng)域說明信息。在使用非法用戶訪問統(tǒng)計(jì)功能時(shí),其將會(huì)響應(yīng)一個(gè)“401 Forbidden”頁面。其認(rèn)證方式為HTTP Basic認(rèn)證,密碼傳輸會(huì)以明文方式進(jìn)行,因此,配置文件中也使用明文方式存儲(chǔ)以說明其非保密信息故此不能相同于其它關(guān)鍵性帳號的密碼。
盡管“stats auth”一條就能夠啟用統(tǒng)計(jì)報(bào)告,但還是建議設(shè)定其它所有的參數(shù),以免其依賴于默認(rèn)設(shè)定而帶來非期后果。
3.16 stats admin
代碼如下:
stats admin { if | unless } <cond>
在指定的條件滿足時(shí)啟用統(tǒng)計(jì)報(bào)告頁面的管理級別功能,它允許通過web接口啟用或禁用服務(wù)器,不過,基于安全的角度考慮,統(tǒng)計(jì)報(bào)告頁面應(yīng)該盡可能為只讀的。此外,如果啟用了HAProxy的多進(jìn)程模式,啟用此管理級別將有可能導(dǎo)致異常行為。
目前來說,POST請求方法被限制于僅能使用緩沖區(qū)減去保留部分之外的空間,因此,服務(wù)器列表不能過長,否則,此請求將無法正常工作。因此,建議一次僅調(diào)整少數(shù)幾個(gè)服務(wù)器。下面是兩個(gè)案例,第一個(gè)限制了僅能在本機(jī)打開報(bào)告頁面時(shí)啟用管理級別功能,第二個(gè)定義了僅允許通過認(rèn)證的用戶使用管理級別功能。
代碼如下:
backend stats_localhost
stats enable
stats admin if LOCALHOST
backend stats_auth
stats enable
stats auth haproxyadmin:password
stats admin if TRUE
3.17 option httplog
代碼如下:
option httplog [ clf ]
啟用記錄HTTP請求、會(huì)話狀態(tài)和計(jì)時(shí)器的功能。
clf:使用CLF格式來代替HAProxy默認(rèn)的HTTP格式,通常在使用僅支持CLF格式的特定日志分析器時(shí)才需要使用此格式。
默認(rèn)情況下,日志輸入格式非常簡陋,因?yàn)槠鋬H包括源地址、目標(biāo)地址和實(shí)例名稱,而“option httplog”參數(shù)將會(huì)使得日志格式變得豐富許多,其通常包括但不限于HTTP請求、連接計(jì)時(shí)器、會(huì)話狀態(tài)、連接數(shù)、捕獲的首部及cookie、“frontend”、“backend”及服務(wù)器名稱,當(dāng)然也包括源地址和端口號等。
3.18 option logasap
代碼如下:
option logasap
no option logasap
啟用或禁用提前將HTTP請求記入日志,不能用于“backend”區(qū)段。
默認(rèn)情況下,HTTP請求是在請求結(jié)束時(shí)進(jìn)行記錄以便能將其整體傳輸時(shí)長和字節(jié)數(shù)記入日志,由此,傳較大的對象時(shí),其記入日志的時(shí)長可能會(huì)略有延遲?!皁ption logasap”參數(shù)能夠在服務(wù)器發(fā)送complete首部時(shí)即時(shí)記錄日志,只不過,此時(shí)將不記錄整體傳輸時(shí)長和字節(jié)數(shù)。此情形下,捕獲“Content-Length”響應(yīng)首部來記錄傳輸?shù)淖止?jié)數(shù)是一個(gè)較好選擇。下面是一個(gè)例子。
代碼如下:
listen http_proxy 0.0.0.0:80
mode http
option httplog
option logasap
log 172.16.100.9 local2
3.19 option forwardfor
option forwardfor [ except <network> ] [ header <name> ] [ if-none ]
允許在發(fā)往服務(wù)器的請求首部中插入“X-Forwarded-For”首部。
<network>:可選參數(shù),當(dāng)指定時(shí),源地址為匹配至此網(wǎng)絡(luò)中的請求都禁用此功能。
<name>:可選參數(shù),可使用一個(gè)自定義的首部,如“X-Client”來替代“X-Forwarded-For”。有些獨(dú)特的web服務(wù)器的確需要用于一個(gè)獨(dú)特的首部。
if-none:僅在此首部不存在時(shí)才將其添加至請求報(bào)文問道中。
HAProxy工作于反向代理模式,其發(fā)往服務(wù)器的請求中的客戶端IP均為HAProxy主機(jī)的地址而非真正客戶端的地址,這會(huì)使得服務(wù)器端的日志信息記錄不了真正的請求來源,“X-Forwarded-For”首部則可用于解決此問題。HAProxy可以向每個(gè)發(fā)往服務(wù)器的請求上添加此首部,并以客戶端IP為其value。
需要注意的是,HAProxy工作于隧道模式,其僅檢查每一個(gè)連接的第一個(gè)請求,因此,僅第一個(gè)請求報(bào)文被附加此首部。如果想為每一個(gè)請求都附加此首部,請確保同時(shí)使用了“option httpclose”、“option forceclose”和“option http-server-close”幾個(gè)option。
下面是一個(gè)例子。
代碼如下:
frontend www
mode http
option forwardfor except 127.0.0.1
3.20 errorfile
代碼如下:
errorfile <code> <file>
在用戶請求不存在的頁面時(shí),返回一個(gè)頁面文件給客戶端而非由haproxy生成的錯(cuò)誤代碼;可用于所有段中。
<code>:指定對HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有200、400、403、408、500、502、503和504;
<file>:指定用于響應(yīng)的頁面文件;
例如:
代碼如下:
errorfile 400 /etc/haproxy/errorpages/400badreq.http
errorfile 403 /etc/haproxy/errorpages/403forbid.http
errorfile 503 /etc/haproxy/errorpages/503sorry.http
3.21 errorloc 和 errorloc302
代碼如下:
errorloc <code> <url>
errorloc302 <code> <url>
請求錯(cuò)誤時(shí),返回一個(gè)HTTP重定向至某URL的信息;可用于所有配置段中。
<code>:指定對HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有200、400、403、408、500、502、503和504;
<url>:Location首部中指定的頁面位置的具體路徑,可以是在當(dāng)前服務(wù)器上的頁面的相對路徑,也可以使用絕對路徑;需要注意的是,如果URI自身錯(cuò)誤時(shí)產(chǎn)生某特定狀態(tài)碼信息的話,有可能會(huì)導(dǎo)致循環(huán)定向;
需要留意的是,這兩個(gè)關(guān)鍵字都會(huì)返回302狀態(tài)嗎,這將使得客戶端使用同樣的HTTP方法獲取指定的URL,對于非GET法的場景(如POST)來說會(huì)產(chǎn)生問題,因?yàn)榉祷乜蛻舻腢RL是不允許使用GET以外的其它方法的。如果的確有這種問題,可以使用errorloc303來返回303狀態(tài)碼給客戶端。
3.22 errorloc303
代碼如下:
errorloc303 <code> <url>
請求錯(cuò)誤時(shí),返回一個(gè)HTTP重定向至某URL的信息給客戶端;可用于所有配置段中。
<code>:指定對HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有400、403、408、500、502、503和504;
<url>:Location首部中指定的頁面位置的具體路徑,可以是在當(dāng)前服務(wù)器上的頁面的相對路徑,也可以使用絕對路徑;需要注意的是,如果URI自身錯(cuò)誤時(shí)產(chǎn)生某特定狀態(tài)碼信息的話,有可能會(huì)導(dǎo)致循環(huán)定向;
例如:
代碼如下:
backend webserver
server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srv01
server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv02
errorloc 403 /etc/haproxy/errorpages/sorry.htm
errorloc 503 /etc/haproxy/errorpages/sorry.htm
四、ACL
haproxy的ACL用于實(shí)現(xiàn)基于請求報(bào)文的首部、響應(yīng)報(bào)文的內(nèi)容或其它的環(huán)境狀態(tài)信息來做出轉(zhuǎn)發(fā)決策,這大大增強(qiáng)了其配置彈性。其配置法則通常分為兩步,首先去定義ACL,即定義一個(gè)測試條件,而后在條件得到滿足時(shí)執(zhí)行某特定的動(dòng)作,如阻止請求或轉(zhuǎn)發(fā)至某特定的后端。定義ACL的語法格式如下。
代碼如下:
acl <aclname> <criterion> [flags] [operator] <value> ...
<aclname>:ACL名稱,區(qū)分字符大小寫,且其只能包含大小寫字母、數(shù)字、-(連接線)、_(下劃線)、.(點(diǎn)號)和:(冒號);haproxy中,acl可以重名,這可以把多個(gè)測試條件定義為一個(gè)共同的acl;
<criterion>:測試標(biāo)準(zhǔn),即對什么信息發(fā)起測試;測試方式可以由[flags]指定的標(biāo)志進(jìn)行調(diào)整;而有些測試標(biāo)準(zhǔn)也可以需要為其在之前指定一個(gè)操作符[operator];
[flags]:目前haproxy的acl支持的標(biāo)志位有3個(gè):
-i:不區(qū)分中模式字符的大小寫;
-f:從指定的文件中加載模式;
--:標(biāo)志符的強(qiáng)制結(jié)束標(biāo)記,在模式中的字符串像標(biāo)記符時(shí)使用;
<value>:acl測試條件支持的值有以下四類:
整數(shù)或整數(shù)范圍:如1024:65535表示從1024至65535;僅支持使用正整數(shù)(如果出現(xiàn)類似小數(shù)的標(biāo)識(shí),其為通常為版本測試),且支持使用的操作符有5個(gè),分別為eq、ge、gt、le和lt;
字符串:支持使用“-i”以忽略字符大小寫,支持使用“\”進(jìn)行轉(zhuǎn)義;如果在模式首部出現(xiàn)了-i,可以在其之前使用“–”標(biāo)志位;
正則表達(dá)式:其機(jī)制類同字符串匹配;
IP地址及網(wǎng)絡(luò)地址;
同一個(gè)acl中可以指定多個(gè)測試條件,這些測試條件需要由邏輯操作符指定其關(guān)系。條件間的組合測試關(guān)系有三種:“與”(默認(rèn)即為與操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。
5.1 常用的測試標(biāo)準(zhǔn)(criteria)
5.1.1 be_sess_rate
代碼如下:
be_sess_rate(backend) <integer>
用于測試指定的backend上會(huì)話創(chuàng)建的速率(即每秒創(chuàng)建的會(huì)話數(shù))是否滿足指定的條件;常用于在指定backend上的會(huì)話速率過高時(shí)將用戶請求轉(zhuǎn)發(fā)至另外的backend,或用于阻止攻擊行為。例如:
代碼如下:
backend dynamic
mode http
acl being_scanned be_sess_rate gt 50
redirect location /error_pages/denied.html if being_scanned
5.1.2 fe_sess_rate
代碼如下:
fe_sess_rate(frontend) <integer>
用于測試指定的frontend(或當(dāng)前frontend)上的會(huì)話創(chuàng)建速率是否滿足指定的條件;常用于為frontend指定一個(gè)合理的會(huì)話創(chuàng)建速率的上限以防止服務(wù)被濫用。例如下面的例子限定入站郵件速率不能大于50封/秒,所有在此指定范圍之外的請求都將被延時(shí)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
5.1.3 hdr <string>
代碼如下:
hdr(header) <string>
用于測試請求報(bào)文中的所有首部或指定首部是否滿足指定的條件;指定首部時(shí),其名稱不區(qū)分大小寫,且在括號“()”中不能有任何多余的空白字符。測試服務(wù)器端的響應(yīng)報(bào)文時(shí)可以使用shdr()。例如下面的例子用于測試首部Connection的值是否為close。
代碼如下:
hdr(Connection) -i close
5.1.4 method <string>
代碼如下:
method <string>
測試HTTP請求報(bào)文中使用的方法。
5.1.5 path_beg <string>
用于測試請求的URL是否以指定的模式開頭。下面的例子用于測試URL是否以/static、/images、/javascript或/stylesheets頭。
代碼如下:
acl url_static path_beg -i /static /images /javascript /stylesheets
5.1.6 path_end <string>
用于測試請求的URL是否以<string>指定的模式結(jié)尾。例如,下面的例子用戶測試URL是否以jpg、gif、png、css或js結(jié)尾。
代碼如下:
acl url_static path_end -i .jpg .gif .png .css .js
5.1.7 hdr_beg <string>
用于測試請求報(bào)文的指定首部的開頭部分是否符合<string>指定的模式。例如,下面的例子用記測試請求是否為提供靜態(tài)內(nèi)容的主機(jī)img、video、download或ftp。
代碼如下:
acl host_static hdr_beg(host) -i img. video. download. ftp.
5.1.8 hdr_end <string>
用于測試請求報(bào)文的指定首部的結(jié)尾部分是否符合<string>指定的模式。
五、配置案例
前端調(diào)度器IP:192.168.1.210
后端應(yīng)用服務(wù)器IP: 192.168.1.111 和 192.168.1.112
定義獨(dú)立日志文件
代碼如下:
[root@node1 haproxy]# vim /etc/rsyslog.conf #為其添加日志功能
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514 ------>啟動(dòng)udp,啟動(dòng)端口后將作為服務(wù)器工作
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514 ------>啟動(dòng)tcp監(jiān)聽端口
local2.* /var/log/haproxy.log
[root@node1 haproxy]# service rsyslog restar
[root@LB haproxy]# vim haproxy.cfg
log 127.0.0.1 local2 --------->在global端中添加此行
一個(gè)最簡單的http服務(wù)的配置
代碼如下:
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 webser #webser為名稱
option forwardfor
bind *:80
default_backend app
backend app
balance roundrobin #使擁roundrobin 算法
server app1 192.168.1.111:80 check
server app2 192.168.1.112:80 check
haproxy統(tǒng)計(jì)頁面的輸出機(jī)制
代碼如下:
frontend webser
log 127.0.0.1 local3
option forwardfor
bind *:80
default_backend app
backend app
cookie node insert nocache
balance roundrobin
server app1 192.168.1.111:80 check cookie node1 intval 2 rise 1 fall 2
server app2 192.168.1.112:80 check cookie node2 intval 2 rise 1 fall 2
server backup 127.0.0.1:8010 check backup
listen statistics
bind *:8009 # 自定義監(jiān)聽端口
stats enable # 啟用基于程序編譯時(shí)默認(rèn)設(shè)置的統(tǒng)計(jì)報(bào)告
stats auth admin:admin # 統(tǒng)計(jì)頁面用戶名和密碼設(shè)置
stats uri /admin?stats # 自定義統(tǒng)計(jì)頁面的URL,默認(rèn)為/haproxy?stats
stats hide-version # 隱藏統(tǒng)計(jì)頁面上HAProxy的版本信息
stats refresh 30s # 統(tǒng)計(jì)頁面自動(dòng)刷新時(shí)間
stats admin if TRUE #如果認(rèn)證通過就做管理功能,可以管理后端的服務(wù)器
stats realm Hapadmin # 統(tǒng)計(jì)頁面密碼框上提示文本,默認(rèn)為Haproxy\ Statistics
動(dòng)靜分離示例:
代碼如下:
frontend webservs
bind *:80
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js .html
acl url_php path_end -i .php
acl host_static hdr_beg(host) -i img. imgs. video. videos. ftp. image. download.
use_backend static if url_static or host_static
use_backend dynamic if url_php
default_backend dynamic
backend static
balance roundrobin
server node1 192.168.1.111:80 check maxconn 3000
backend dynamic
balance roundrobin
server node2 192.168.1.112:80 check maxconn 1000
http服務(wù)器配置完整示例
代碼如下:
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
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 30000
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend http-in
bind *:80
mode http
log global
option httpclose
option logasap #不等待響應(yīng)結(jié)束就記錄日志,表示提前記錄日志,一般日志會(huì)記錄響應(yīng)時(shí)長,此不記錄響應(yīng)時(shí)長
option dontlognull #不記錄空信息
capture request header Host len 20 #記錄請求首部的前20個(gè)字符
capture request header Referer len 60 #referer跳轉(zhuǎn)引用,就是上一級
default_backend servers
frontend healthcheck
bind :1099 #定義外部檢測機(jī)制
mode http
option httpclose
option forwardfor
default_backend servers
backend servers
balance roundrobin
server websrv1 192.168.1.111:80 check maxconn 2000
server websrv2 192.168.1.112:80 check maxconn 2000
負(fù)載均衡MySQL服務(wù)的配置示例
代碼如下:
</p>
<p>#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode tcp
log global
option httplog
option dontlognull
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 600
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend mysql
bind *:3306
mode tcp
log global
default_backend mysqlservers
backend mysqlservers
balance leastconn
server dbsrv1 192.168.1.111:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
server dbsrv2 192.168.1.112:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
感謝各位的閱讀,以上就是“在CentOS上如何完全安裝和使用代理軟件HAProxy”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對在CentOS上如何完全安裝和使用代理軟件HAProxy這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
名稱欄目:在CentOS上如何完全安裝和使用代理軟件HAProxy-創(chuàng)新互聯(lián)
分享路徑:http://muchs.cn/article46/idjeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、定制開發(fā)、網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容