詳解配置文件
haproxy 的配置文件由兩部分組成:全局設(shè)定和對(duì)代理的設(shè)定移盆,共分為五段:global所意,defaults变汪,frontend侠坎,backend,listen裙盾。
配置文件格式
HAProxy的配置處理3類來主要參數(shù)來源:
——最優(yōu)先處理的命令行參數(shù);
——“global”配置段实胸,用于設(shè)定全局配置參數(shù)他嫡;
——proxy相關(guān)配置段,如“defaults”庐完、“l(fā)isten”涮瞻、“frontend”和“backend”;
時(shí)間格式
一些包含了值的參數(shù)表示時(shí)間假褪,如超時(shí)時(shí)長署咽。這些值一般以毫秒為單位,但也可以使用其它的時(shí)間單位后綴生音。
us: 微秒(microseconds)宁否,即1/1000000秒;
ms: 毫秒(milliseconds)缀遍,即1/1000秒慕匠;
s: 秒(seconds);
m: 分鐘(minutes)域醇;
h:小時(shí)(hours)台谊;
d: 天(days);
全局配置
* 進(jìn)程管理及安全相關(guān)的參數(shù)
– chroot <jail dir>:修改haproxy的工作目錄至指定的目錄并在放棄權(quán)限之前執(zhí)行chroot()操作譬挚,可以提升haproxy的安全級(jí)別锅铅,不過需要注意的是要確保指定的目錄為空目錄且任何用戶均不能有寫權(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)一對(duì)眾服務(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層過濾隧哮,四層過濾
代理
代理相關(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ì)將對(duì)應(yīng)客戶端的請求轉(zhuǎn)發(fā)至這些服務(wù)器歧譬。
“l(fā)isten”段通過關(guān)聯(lián)“frontend”和“backend”定義了一個(gè)完整的代理岸浑,通常只對(duì)TCP流量有用搏存。
所有代理的名稱只能使用大寫字母、小寫字母矢洲、數(shù)字璧眠、-(中線)、_(下劃線)读虏、.(點(diǎn)號(hào))和:(冒號(hào))责静。此外,ACL名稱會(huì)區(qū)分字母大小寫盖桥。
配置文件中的關(guān)鍵字參考
balance
balance [ ]
balance url_param [check_post []]
定義負(fù)載均衡算法灾螃,可用于“defaults”、“l(fā)isten”和“backend”揩徊。用于在負(fù)載均衡場景中挑選一個(gè)server腰鬼,其僅應(yīng)用于持久信息不可用的條件下或需要將一個(gè)連接重新派發(fā)至另一個(gè)服務(wù)器時(shí)。支持的算法有:
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)牵舱。
?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ì)立即被分配大量連接腰涧。
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)重;
將請求的源地址進(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,對(duì)原地址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)重取模
uri:對(duì)URI的左半部分(“問題”標(biāo)記之前的部分)或整個(gè)URI進(jìn)行hash運(yùn)算鸽斟,并由服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器;這可以使得對(duì)同一個(gè)URI的請求總是被派發(fā)至某特定的服務(wù)器利诺,除非服務(wù)器的權(quán)重總數(shù)發(fā)生了變化富蓄;此算法常用于代理緩存或反病毒代理以提高緩存的命中率;需要注意的是慢逾,此算法僅應(yīng)用于HTTP后端服務(wù)器場景立倍;其默認(rèn)為靜態(tài)算法,不過也可以使用hash-type修改此特性侣滩;
url_param:通過<argument>為URL指定的參數(shù)在每個(gè)HTTP GET請求中將會(huì)被檢索口注;如果找到了指定的參數(shù)且其通過等于號(hào)“=”被賦予了一個(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ù)或其沒有有效值,則使用輪叫算法對(duì)相應(yīng)請求進(jìn)行調(diào)度材部;此算法默認(rèn)為靜態(tài)的毫缆,不過其也可以使用hash-type修改此特性;
hdr(<name>):對(duì)于每個(gè)HTTP請求乐导,通過<name>指定的HTTP首部將會(huì)被檢索苦丁;如果相應(yīng)的首部沒有出現(xiàn)或其沒有有效值,則使用輪叫算法對(duì)相應(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修改此特性蒂秘;
?rdp-cookie(name)
泽本,表示根據(jù)據(jù)cookie(name)來鎖定并哈希每一次TCP請求。
?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)限指定綁定的物理接口秃诵;
?mode
1mode { 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ì)對(duì)7層報(bào)文做任何類型的檢查榛了;通常用于SSL、SSH煞抬、SMTP等應(yīng)用霜大;
http:實(shí)例運(yùn)行于HTTP模式,客戶端請求在轉(zhuǎn)發(fā)至后端服務(wù)器之前將被深度分析革答,所有不與RFC格式兼容的請求都會(huì)被拒絕战坤;此為默認(rèn)模式;
health:實(shí)例工作于health模式残拐,其對(duì)入站請求僅響應(yīng)“OK”信息并關(guān)閉連接途茫,且不會(huì)記錄任何日志信息;此模式將用于響應(yīng)外部組件的健康狀態(tài)檢查請求溪食;目前來講囊卜,此模式已經(jīng)廢棄,因?yàn)閠cp或http模式中的monitor關(guān)鍵字可完成類似功能错沃;
hash-type
1hash-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)方法,對(duì)在線服務(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ù)器上续捂,對(duì)于緩存服務(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ì)對(duì)一小部分請求產(chǎn)生影響,因此州袒,尤其適用于后端服務(wù)器為cache的場景揭绑。不過,此算法不甚平滑郎哭,派發(fā)至各服務(wù)器的請求未必能達(dá)到理想的均衡效果他匪,因此,可能需要不時(shí)的調(diào)整服務(wù)器的權(quán)
重以獲得更好的均衡性夸研。
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>:定義日志級(jí)別宿崭,即輸出信息過濾器,默認(rèn)為所有信息才写;指定級(jí)別時(shí)葡兑,所有等于或高于此級(jí)別的日志信息將會(huì)被發(fā)送;
maxconn
1maxconn <conns>
設(shè)定一個(gè)前端的最大并發(fā)連接數(shù)赞草,因此讹堤,其不能用于backend區(qū)段。對(duì)于大型站點(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瘾境。
?default_backend
1default_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
?server
1server <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)對(duì)此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后面不能使用/逆济,且不能使用相對(duì)地址酌予,以免造成循環(huán)磺箕;例如:
1server 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
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
capture request header
1capture request header <name> len <length>
捕獲并記錄指定的請求首部最近一次出現(xiàn)時(shí)的第一個(gè)值雕欺,僅能用于“frontend”和“l(fā)isten”區(qū)段。捕獲的首部值使用花括號(hào){}括起來后添加進(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)在首部中的格式相同,比如大寫首字母枫吧。需要注意的是浦旱,記錄在日志中的是首部對(duì)應(yīng)的值,而非首部名稱九杂。
<length>:指定記錄首部值時(shí)所記錄的精確長度颁湖,超出的部分將會(huì)被忽略。
可以捕獲的請求首部的個(gè)數(shù)沒有限制例隆,但每個(gè)捕獲最多只能記錄64個(gè)字符甥捺。為了保證同一個(gè)frontend中日志格式的統(tǒng)一性,首部捕獲僅能在frontend中定義镀层。
?capture response header
1capture response header <name> len <length>
捕獲并記錄響應(yīng)首部镰禾,其格式和要點(diǎn)同請求首部。
?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
stats hide-version
1stats hide-version
啟用統(tǒng)計(jì)報(bào)告并隱藏HAProxy版本報(bào)告盯蝴,不能用于“frontend”區(qū)段毅哗。默認(rèn)情況下,統(tǒng)計(jì)頁面會(huì)顯示一些有用信息捧挺,包括HAProxy的版本號(hào)虑绵,然而,向所有人公開HAProxy的精確版本號(hào)是非常有風(fēng)險(xiǎn)的闽烙,因?yàn)樗軒椭鷲阂庥脩艨焖俣ㄎ话姹镜娜毕莺吐┒闯峋Α1M管“stats hide-version”一條就能夠啟用統(tǒng)計(jì)報(bào)告,但還是建議設(shè)定其它所有的參數(shù)黑竞,以免其依賴于默認(rèn)設(shè)定而帶來非期后果捕发。具體請參照“stats enable”一節(jié)的說明。
?stats realm
1stats 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é)的說明。
stats scope
1stats 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
?stats auth
1stats auth <user>:<passwd>
啟用帶認(rèn)證的統(tǒng)計(jì)報(bào)告功能并授權(quán)一個(gè)用戶帳號(hào),其不能用于“frontend”區(qū)段裙戏。
<user>:授權(quán)進(jìn)行訪問的用戶名乘凸;
<passwd>:此用戶的訪問密碼,明文格式累榜;
此語句將基于默認(rèn)設(shè)定啟用統(tǒng)計(jì)報(bào)告功能营勤,并僅允許其定義的用戶訪問,其也可以定義多次以授權(quán)多個(gè)用戶帳號(hào)壹罚「鹱鳎可以結(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)鍵性帳號(hào)的密碼。
盡管“stats auth”一條就能夠啟用統(tǒng)計(jì)報(bào)告漠吻,但還是建議設(shè)定其它所有的參數(shù)量瓜,以免其依賴于默認(rèn)設(shè)定而帶來非期后果。
?stats admin
1stats admin { if | unless } <cond>
在指定的條件滿足時(shí)啟用統(tǒng)計(jì)報(bào)告頁面的管理級(jí)別功能途乃,它允許通過web接口啟用或禁用服務(wù)器绍傲,不過,基于安全的角度考慮耍共,統(tǒng)計(jì)報(bào)告頁面應(yīng)該盡可能為只讀的烫饼。此外,如果啟用了HAProxy的多進(jìn)程模式试读,啟用此管理級(jí)別將有可能導(dǎo)致異常行為杠纵。
目前來說,POST請求方法被限制于僅能使用緩沖區(qū)減去保留部分之外的空間钩骇,因此比藻,服務(wù)器列表不能過長,否則倘屹,此請求將無法正常工作银亲。因此,建議一次僅調(diào)整少數(shù)幾個(gè)服務(wù)器纽匙。下面是兩個(gè)案例务蝠,第一個(gè)限制了僅能在本機(jī)打開報(bào)告頁面時(shí)啟用管理級(jí)別功能,第二個(gè)定義了僅允許通過認(rèn)證的用戶使用管理級(jí)別功能烛缔。
backend stats_localhost
stats enable
stats admin if LOCALHOST
backend stats_auth
stats enable
stats auth haproxyadmin:password
stats admin if TRUE
option httplog
1option 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)然也包括源地址和端口號(hào)等感猛。
?option logasap
option logasap
no option logasap
啟用或禁用提前將HTTP請求記入日志,不能用于“backend”區(qū)段奢赂。
默認(rèn)情況下陪白,HTTP請求是在請求結(jié)束時(shí)進(jìn)行記錄以便能將其整體傳輸時(shí)長和字節(jié)數(shù)記入日志,由此膳灶,傳較大的對(duì)象時(shí)咱士,其記入日志的時(shí)長可能會(huì)略有延遲≡觯“option 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
?option forwardfor
1option 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
?errorfile
1errorfile <code> <file>
在用戶請求不存在的頁面時(shí),返回一個(gè)頁面文件給客戶端而非由haproxy生成的錯(cuò)誤代碼枝嘶;可用于所有段中群扶。
<code>:指定對(duì)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
?errorloc 和 errorloc302
errorloc <code> <url>
errorloc302 <code> <url>
請求錯(cuò)誤時(shí)陪竿,返回一個(gè)HTTP重定向至某URL的信息;可用于所有配置段中族跛。
<code>:指定對(duì)HTTP的哪些狀態(tài)碼返回指定的頁面;這里可用的狀態(tài)碼有200锐墙、400、403夺脾、408馒疹、500颖变、502听想、503和504腥刹;
<url>:Location首部中指定的頁面位置的具體路徑,可以是在當(dāng)前服務(wù)器上的頁面的相對(duì)路徑汉买,也可以使用絕對(duì)路徑衔峰;需要注意的是,如果URI自身錯(cuò)誤時(shí)產(chǎn)生某特定狀態(tài)碼信息的話蛙粘,有可能會(huì)導(dǎo)致循環(huán)定向垫卤;
需要留意的是,這兩個(gè)關(guān)鍵字都會(huì)返回302狀態(tài)嗎出牧,這將使得客戶端使用同樣的HTTP方法獲取指定的URL穴肘,對(duì)于非GET法的場景(如POST)來說會(huì)產(chǎn)生問題,因?yàn)榉祷乜蛻舻腢RL是不允許使用GET以外的其它方法的舔痕。如果的確有這種問題评抚,可以使用errorloc303來返回303狀態(tài)碼給客戶端。
?errorloc303
1errorloc303 <code> <url>
請求錯(cuò)誤時(shí)伯复,返回一個(gè)HTTP重定向至某URL的信息給客戶端慨代;可用于所有配置段中。
<code>:指定對(duì)HTTP的哪些狀態(tài)碼返回指定的頁面啸如;這里可用的狀態(tài)碼有400侍匙、403、408组底、500丈积、502、503和504债鸡;
<url>:Location首部中指定的頁面位置的具體路徑江滨,可以是在當(dāng)前服務(wù)器上的頁面的相對(duì)路徑,也可以使用絕對(duì)路徑厌均;需要注意的是唬滑,如果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的語法格式如下。
1acl <aclname> <criterion> [flags] [operator] <value> ...
<aclname>:ACL名稱元扔,區(qū)分字符大小寫躯保,且其只能包含大小寫字母、數(shù)字澎语、-(連接線)途事、_(下劃線)、.(點(diǎn)號(hào))和:(冒號(hào))擅羞;haproxy中尸变,acl可以重名,這可以把多個(gè)測試條件定義為一個(gè)共同的acl祟滴;
<criterion>:測試標(biāo)準(zhǔn)振惰,即對(duì)什么信息發(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)即為與操作)腿准、“或”(使用“||”操作符)以及“非”(使用“!”操作符)际起。
常用的測試標(biāo)準(zhǔn)(criteria)
?be_sess_rate
1be_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
?fe_sess_rate
1fe_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
?hdr <string>
1hdr(header) <string>
用于測試請求報(bào)文中的所有首部或指定首部是否滿足指定的條件窖认;指定首部時(shí),其名稱不區(qū)分大小寫告希,且在括號(hào)“()”中不能有任何多余的空白字符扑浸。測試服務(wù)器端的響應(yīng)報(bào)文時(shí)可以使用shdr()。例如下面的例子用于測試首部Connection的值是否為close燕偶。
1hdr(Connection) -i close
?method <string>
1method <string>
測試HTTP請求報(bào)文中使用的方法喝噪。
?path_beg <string>
用于測試請求的URL是否以指定的模式開頭。下面的例子用于測試URL是否以/static指么、/images酝惧、/javascript或/stylesheets頭。
1acl url_static path_beg -i /static /images /javascript /stylesheets
?path_end <string>
用于測試請求的URL是否以<string>指定的模式結(jié)尾伯诬。例如晚唇,下面的例子用戶測試URL是否以jpg、gif盗似、png哩陕、css或js結(jié)尾。
1acl url_static path_end -i .jpg .gif .png .css .js
?hdr_beg <string>
用于測試請求報(bào)文的指定首部的開頭部分是否符合<string>指定的模式赫舒。例如悍及,下面的例子用記測試請求是否為提供靜態(tài)內(nèi)容的主機(jī)img、video接癌、download或ftp心赶。
1acl host_static hdr_beg(host) -i img. video. download. ftp.
?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)引用咏闪,就是上一級(jí)
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ù)的配置示例
#---------------------------------------------------------------------
# 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