http反向代理及haproxy

2017年3月4日23:27:48 發(fā)表評(píng)論 4,436 ℃

一、HAProxy簡(jiǎn)介

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)行模式使得它可以很簡(jiǎn)單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。

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)做更多的工作。

————百度百科

HAProxy是免費(fèi)、極速且可靠的用于為TCP和基于HTTP應(yīng)用程序提供高可用、負(fù)載均衡和代理服務(wù)的解決方案,尤其適用于高負(fù)載且需要持久連接或7層處理機(jī)制的web站點(diǎn)。

HAProxy目前主要有兩個(gè)版本:

1.4——提供較好的彈性:衍生于1.2版本,并提供了額外的新特性,其中大多數(shù)是期待已久的。

 客戶端側(cè)的長(zhǎng)連接(client-side keep-alive)

 TCP加速(TCP speedups)

 響應(yīng)池(response buffering)

 RDP協(xié)議

 基于源的粘性(source-based stickiness)

 更好的統(tǒng)計(jì)數(shù)據(jù)接口(a much better stats interfaces)

 更詳細(xì)的健康狀態(tài)檢測(cè)機(jī)制(more verbose health checks)

 基于流量的健康評(píng)估機(jī)制(traffic-based health)

 支持HTTP認(rèn)證

 服務(wù)器管理命令行接口(server management from the CLI)

 基于ACL的持久性(ACL-based persistence)

 日志分析器

1.3——內(nèi)容交換和超強(qiáng)負(fù)載:衍生于1.2版本,并提供了額外的新特性。

 內(nèi)容交換(content switching):基于任何請(qǐng)求標(biāo)準(zhǔn)挑選服務(wù)器池;

 ACL:編寫內(nèi)容交換規(guī)則;

 負(fù)載均衡算法(load-balancing algorithms):更多的算法支持;

 內(nèi)容探測(cè)(content inspection):阻止非授權(quán)協(xié)議;

 透明代理(transparent proxy):在Linux系統(tǒng)上允許使用客戶端IP直接連入服務(wù)器;

 內(nèi)核TCP拼接(kernel TCP splicing):無copy方式在客戶端和服務(wù)端之間轉(zhuǎn)發(fā)數(shù)據(jù)以實(shí)現(xiàn)數(shù)G級(jí)別的數(shù)據(jù)速率;

 分層設(shè)計(jì)(layered design):分別實(shí)現(xiàn)套接字、TCP、HTTP處理以提供更好的健壯性、更快的處理機(jī)制及便捷的演進(jìn)能力;

 快速、公平調(diào)度器(fast and fair scheduler):為某些任務(wù)指定優(yōu)先級(jí)可實(shí)現(xiàn)理好的QoS;

 會(huì)話速率限制(session rate limiting):適用于托管環(huán)境;

支持的平臺(tái)及OS:

 x86、x86_64、Alpha、SPARC、MIPS及PARISC平臺(tái)上的Linux 2.4;

 x86、x86_64、ARM (ixp425)及PPC64平臺(tái)上的Linux2.6;

 UltraSPARC 2和3上的Sloaris 8/9;

 Opteron和UltraSPARC平臺(tái)上的Solaris 10;

 x86平臺(tái)上的FreeBSD 4.1-8;

 i386, amd64, macppc, alpha, sparc64和VAX平臺(tái)上的OpenBSD 3.1-current;

若要獲得最高性能,需要在Linux 2.6或打了epoll補(bǔ)丁的Linux 2.4上運(yùn)行haproxy 1.2.5以上的版本。haproxy 1.1l默認(rèn)使用的polling系統(tǒng)為select(),其處理的文件數(shù)達(dá)數(shù)千個(gè)時(shí)性能便會(huì)急劇下降。1.2和1.3版本默認(rèn)的為poll(),在有些操作系統(tǒng)上可會(huì)也會(huì)有性能方面的問題,但在Solaris上表現(xiàn)相當(dāng)不錯(cuò)。HAProxy 1.3在Linux 2.6及打了epoll補(bǔ)丁的Linux 2.4上默認(rèn)使用epoll,在FreeBSD上使用kqueue,這兩種機(jī)制在任何負(fù)載上都能提供恒定的性能表現(xiàn)。

在較新版本的Linux 2.6(>=2.6.27.19)上,HAProxy還能夠使用splice()系統(tǒng)調(diào)用在接口間無復(fù)制地轉(zhuǎn)發(fā)任何數(shù)據(jù),這甚至可以達(dá)到10Gbps的性能。

基于以上事實(shí),在x86或x86_64平臺(tái)上,要獲取最好性能的負(fù)載均衡器,建議按順序考慮以下方案。

 Linux 2.6.32及之后版本上運(yùn)行HAProxy 1.4;

 打了epoll補(bǔ)丁的Linux 2.4上運(yùn)行HAProxy 1.4;

 FreeBSD上運(yùn)行HAProxy 1.4;

 Solaris 10上運(yùn)行HAProxy 1.4;

性能

HAProxy借助于OS上幾種常見的技術(shù)來實(shí)現(xiàn)性能的最大化。

 單進(jìn)程、事件驅(qū)動(dòng)模型顯著降低了上下文切換的開銷及內(nèi)存占用。

 O(1)事件檢查器(event checker)允許其在高并發(fā)連接中對(duì)任何連接的任何事件實(shí)現(xiàn)即時(shí)探測(cè)。

 在任何可用的情況下,單緩沖(single buffering)機(jī)制能以不復(fù)制任何數(shù)據(jù)的方式完成讀寫操作,這會(huì)節(jié)約大量的CPU時(shí)鐘周期及內(nèi)存帶寬;

 借助于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);

 MRU內(nèi)存分配器在固定大小的內(nèi)存池中可實(shí)現(xiàn)即時(shí)內(nèi)存分配,這能夠顯著減少創(chuàng)建一個(gè)會(huì)話的時(shí)長(zhǎng);

 樹型存儲(chǔ):側(cè)重于使用作者多年前開發(fā)的彈性二叉樹,實(shí)現(xiàn)了以O(shè)(log(N))的低開銷來保持計(jì)時(shí)器命令、保持運(yùn)行隊(duì)列命令及管理輪詢及最少連接隊(duì)列;

 優(yōu)化的HTTP首部分析:優(yōu)化的首部分析功能避免了在HTTP首部分析過程中重讀任何內(nèi)存區(qū)域;

 精心地降低了昂貴的系統(tǒng)調(diào)用,大部分工作都在用戶空間完成,如時(shí)間讀取、緩沖聚合及文件描述符的啟用和禁用等;

所有的這些細(xì)微之處的優(yōu)化實(shí)現(xiàn)了在中等規(guī)模負(fù)載之上依然有著相當(dāng)?shù)偷腃PU負(fù)載,甚至于在非常高的負(fù)載場(chǎng)景中,5%的用戶空間占用率和95%的系統(tǒng)空間占用率也是非常普遍的現(xiàn)象,這意味著HAProxy進(jìn)程消耗比系統(tǒng)空間消耗低20倍以上。因此,對(duì)OS進(jìn)行性能調(diào)優(yōu)是非常重要的。即使用戶空間的占用率提高一倍,其CPU占用率也僅為10%,這也解釋了為何7層處理對(duì)性能影響有限這一現(xiàn)象。由此,在高端系統(tǒng)上HAProxy的7層性能可輕易超過硬件負(fù)載均衡設(shè)備。

在生產(chǎn)環(huán)境中,在7層處理上使用HAProxy作為昂貴的高端硬件負(fù)載均衡設(shè)備故障故障時(shí)的緊急解決方案也時(shí)長(zhǎng)可見。硬件負(fù)載均衡設(shè)備在“報(bào)文”級(jí)別處理請(qǐng)求,這在支持跨報(bào)文請(qǐng)求(request across multiple packets)有著較高的難度,并且它們不緩沖任何數(shù)據(jù),因此有著較長(zhǎng)的響應(yīng)時(shí)間。對(duì)應(yīng)地,軟件負(fù)載均衡設(shè)備使用TCP緩沖,可建立極長(zhǎng)的請(qǐng)求,且有著較大的響應(yīng)時(shí)間。

可以從三個(gè)因素來評(píng)估負(fù)載均衡器的性能:

 會(huì)話率

 會(huì)話并發(fā)能力

 數(shù)據(jù)率

二、配置HAProxy

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í)長(zhǎng)。這些值一般以毫秒為單位,但也可以使用其它的時(shí)間單位后綴。

 us: 微秒(microseconds),即1/1000000秒;

 ms: 毫秒(milliseconds),即1/1000秒;

 s: 秒(seconds);

 m: 分鐘(minutes);

 h:小時(shí)(hours);

 d: 天(days);

2.3 例子

下面的例子配置了一個(gè)監(jiān)聽在所有接口的80端口上HTTP proxy服務(wù),它轉(zhuǎn)發(fā)所有的請(qǐng)求至后端監(jiān)聽在127.0.0.1:8000上的"server"。

 global

        daemon

        maxconn 25600

    defaults

        mode http

        timeout connect 5000ms

        timeout client 50000ms

        timeout server 50000ms

    frontend http-in

        bind *:80

        default_backend servers

    backend servers

        server server1 127.0.0.1:8080 maxconn 32

2.4 全局配置

“global”配置中的參數(shù)為進(jìn)程級(jí)別的參數(shù),且通常與其運(yùn)行的OS相關(guān)。

 * 進(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ù)文件描述符的場(chǎng)景中才使用多進(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);

   - user:同uid,但使用的是用戶名;

   - stats:

   - node:定義當(dāng)前節(jié)點(diǎn)的名稱,用于HA場(chǎng)景中多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ù)器的場(chǎng)景中,在精確的時(shí)間間隔后統(tǒng)一對(duì)眾服務(wù)器進(jìn)行健康狀況檢查可能會(huì)帶來意外問題;此選項(xiàng)用于將其檢查的時(shí)間間隔長(zhǎng)度上增加或減小一定的隨機(jī)時(shí)長(zhǎng);

   - 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

2.5 代理

代理相關(guān)的配置可以如下配置段中。

 - defaults <name>

 - frontend <name>

 - backend  <name>

 - listen   <name>

 “defaults”段用于為所有其它配置段提供默認(rèn)參數(shù),這配置默認(rèn)配置參數(shù)可由下一個(gè)“defaults”所重新設(shè)定。

 “frontend”段用于定義一系列監(jiān)聽的套接字,這些套接字可接受客戶端請(qǐng)求并與之建立連接。

 “backend”段用于定義一系列“后端”服務(wù)器,代理將會(huì)將對(duì)應(yīng)客戶端的請(qǐng)求轉(zhuǎn)發(fā)至這些服務(wù)器。

 “l(fā)isten”段通過關(guān)聯(lián)“前端”和“后端”定義了一個(gè)完整的代理,通常只對(duì)TCP流量有用。

 所有代理的名稱只能使用大寫字母、小寫字母、數(shù)字、-(中線)、_(下劃線)、.(點(diǎn)號(hào))和:(冒號(hào))。此外,ACL名稱會(huì)區(qū)分字母大小寫。

三、配置文件中的關(guān)鍵字參考

3.1 balance

balance <algorithm> [ <arguments> ]

balance url_param <param> [check_post [<max_wait>]]

定義負(fù)載均衡算法,可用于“defaults”、“l(fā)isten”和“backend”。<algorithm>用于在負(fù)載均衡場(chǎng)景中挑選一個(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è)連接;

 static-rr:基于權(quán)重進(jìn)行輪叫,與roundrobin類似,但是為靜態(tài)方法,在運(yùn)行時(shí)調(diào)整其服務(wù)器權(quán)重不會(huì)生效;不過,其在后端服務(wù)器連接數(shù)上沒有限制;

 leastconn:新的連接請(qǐng)求被派發(fā)至具有最少連接數(shù)目的后端服務(wù)器;在有著較長(zhǎng)時(shí)間會(huì)話的場(chǎng)景中推薦使用此算法,如LDAP、SQL等,其并不太適用于較短會(huì)話的應(yīng)用層協(xié)議,如HTTP;此算法是動(dòng)態(tài)的,可以在運(yùn)行時(shí)調(diào)整其權(quán)重;

 source:將請(qǐng)求的源地址進(jìn)行hash運(yùn)算,并由后端服務(wù)器的權(quán)重總數(shù)相除后派發(fā)至某匹配的服務(wù)器;這可以使得同一個(gè)客戶端IP的請(qǐng)求始終被派發(fā)至某特定的服務(wù)器;不過,當(dāng)服務(wù)器權(quán)重總數(shù)發(fā)生變化時(shí),如某服務(wù)器宕機(jī)或添加了新的服務(wù)器,許多客戶端的請(qǐng)求可能會(huì)被派發(fā)至與此前請(qǐng)求不同的服務(wù)器;常用于負(fù)載均衡無cookie功能的基于TCP的協(xié)議;其默認(rèn)為靜態(tài),不過也可以使用hash-type修改此特性;

 uri:對(duì)URI的左半部分(“問題”標(biāo)記之前的部分)或整個(gè)URI進(jìn)行hash運(yùn)算,并由服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器;這可以使得對(duì)同一個(gè)URI的請(qǐng)求總是被派發(fā)至某特定的服務(wù)器,除非服務(wù)器的權(quán)重總數(shù)發(fā)生了變化;此算法常用于代理緩存或反病毒代理以提高緩存的命中率;需要注意的是,此算法僅應(yīng)用于HTTP后端服務(wù)器場(chǎng)景;其默認(rèn)為靜態(tài)算法,不過也可以使用hash-type修改此特性;

 url_param:通過<argument>為URL指定的參數(shù)在每個(gè)HTTP GET請(qǐng)求中將會(huì)被檢索;如果找到了指定的參數(shù)且其通過等于號(hào)“=”被賦予了一個(gè)值,那么此值將被執(zhí)行hash運(yùn)算并被服務(wù)器的總權(quán)重相除后派發(fā)至某匹配的服務(wù)器;此算法可以通過追蹤請(qǐng)求中的用戶標(biāo)識(shí)進(jìn)而確保同一個(gè)用戶ID的請(qǐng)求將被送往同一個(gè)特定的服務(wù)器,除非服務(wù)器的總權(quán)重發(fā)生了變化;如果某請(qǐng)求中沒有出現(xiàn)指定的參數(shù)或其沒有有效值,則使用輪叫算法對(duì)相應(yīng)請(qǐng)求進(jìn)行調(diào)度;此算法默認(rèn)為靜態(tài)的,不過其也可以使用hash-type修改此特性;

 hdr(<name>):對(duì)于每個(gè)HTTP請(qǐng)求,通過<name>指定的HTTP首部將會(huì)被檢索;如果相應(yīng)的首部沒有出現(xiàn)或其沒有有效值,則使用輪叫算法對(duì)相應(yīng)請(qǐng)求進(jìn)行調(diào)度;其有一個(gè)可選選項(xiàng)“use_domain_only”,可在指定檢索類似Host類的首部時(shí)僅計(jì)算域名部分(比如通過www.magedu.com來說,僅計(jì)算magedu字符串的hash值)以降低hash算法的運(yùn)算量;此算法默認(rèn)為靜態(tài)的,不過其也可以使用hash-type修改此特性;

 rdp-cookie

 rdp-cookie(name):

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ù)器將通過指定的端口來接收客戶端請(qǐng)求;需要注意的是,每組監(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ì)對(duì)7層報(bào)文做任何類型的檢查;此為默認(rèn)模式,通常用于SSL、SSH、SMTP等應(yīng)用;

http:實(shí)例運(yùn)行于HTTP模式,客戶端請(qǐng)求在轉(zhuǎn)發(fā)至后端服務(wù)器之前將被深度分析,所有不與RFC格式兼容的請(qǐng)求都會(huì)被拒絕;

health:實(shí)例工作于health模式,其對(duì)入站請(qǐng)求僅響應(yīng)“OK”信息并關(guān)閉連接,且不會(huì)記錄任何日志信息;此模式將用于響應(yīng)外部組件的健康狀態(tài)檢查請(qǐng)求;目前業(yè)講,此模式已經(jīng)廢棄,因?yàn)閠cp或http模式中的monitor關(guān)鍵字可完成類似功能;

3.4 hash-type

hash-type <method>

定義用于將hash碼映射至后端服務(wù)器的方法;其不能用于frontend區(qū)段;可用方法有map-based和consistent,在大多數(shù)場(chǎng)景下推薦使用默認(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ù)器的工作場(chǎng)景來說,此方法不甚適用。

consistent:hash表是一個(gè)由各服務(wù)器填充而成的樹狀結(jié)構(gòu);基于hash鍵在hash樹中查找相應(yīng)的服務(wù)器時(shí),最近的服務(wù)器將被選中。此方法是動(dòng)態(tài)的,支持在運(yùn)行時(shí)修改服務(wù)器權(quán)重,因此兼容慢速啟動(dòng)的特性。添加一個(gè)新的服務(wù)器時(shí),僅會(huì)對(duì)一小部分請(qǐng)求產(chǎn)生影響,因此,尤其適用于后端服務(wù)器為cache的場(chǎng)景。不過,此算法不甚平滑,派發(fā)至各服務(wù)器的請(qǐng)求未必能達(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>:定義日志級(jí)別,即輸出信息過濾器,默認(rèn)為所有信息;指定級(jí)別時(shí),所有等于或高于此級(jí)別的日志信息將會(huì)被發(fā)送;

3.6 maxconn

maxconn <conns>

設(shè)定一個(gè)前端的最大并發(fā)連接數(shù),因此,其不能用于backend區(qū)段。對(duì)于大型站點(diǎn)來說,可以盡可能提高此值以便讓haproxy管理連接隊(duì)列,從而避免無法應(yīng)答用戶請(qǐ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è)過大值,極端場(chǎng)景下,其最終占據(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ī)則匹配到的請(qǐng)求將由此參數(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ù)器的請(qǐng)求首部中;

<address>:此服務(wù)器的的IPv4地址,也支持使用可解析的主機(jī)名,只不過在啟動(dòng)時(shí)需要解析主機(jī)名至相應(yīng)的IPv4地址;

[:port]:指定將連接請(qǐng)求所發(fā)往的此服務(wù)器時(shí)的目標(biāo)端口,其為可選項(xiàng);未設(shè)定時(shí),將使用客戶端請(qǐng)求時(shí)的同一相端口;

[param*]:為此服務(wù)器設(shè)定的一系參數(shù);其可用的參數(shù)非常多,具體請(qǐng)參考官方文檔中的說明,下面僅說明幾個(gè)常用的參數(shù);

服務(wù)器或默認(rèn)服務(wù)器參數(shù):

backup:設(shè)定為備用服務(wù)器,僅在負(fù)載均衡場(chǎng)景中的其它server均不可用于啟用此server;

check:?jiǎn)?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值,此處指定的值將在請(qǐng)求入站時(shí)被檢查,第一次為此值挑選的server將在后續(xù)的請(qǐng)求中被選中,其目的在于實(shí)現(xiàn)持久連接的功能;

maxconn <maxconn>:指定此服務(wù)器接受的最大并發(fā)連接數(shù);如果發(fā)往此服務(wù)器的連接數(shù)目高于此處指定的值,其將被放置于請(qǐng)求隊(duì)列,以等待其它連接被釋放;

maxqueue <maxqueue>:設(shè)定請(qǐng)求隊(duì)列的最大長(zhǎng)度;

observe <mode>:通過觀察服務(wù)器的通信狀況來判定其健康狀態(tài),默認(rèn)為禁用,其支持的類型有“l(fā)ayer4”和“l(fā)ayer7”,“l(fā)ayer7”僅能用于http代理場(chǎng)景;

redir <prefix>:?jiǎn)⒂弥囟ㄏ蚬δ?,將發(fā)往此服務(wù)器的GET和HEAD請(qǐng)求均以302狀態(tài)碼響應(yīng);需要注意的是,在prefix后面不能使用/,且不能使用相對(duì)地址,以免造成循環(huán);例如:

 server srv1 172.16.100.6:80 redir http://imageserver.magedu.com check

weight <weight>:權(quán)重,默認(rèn)為1,最大值為256,0表示不參與負(fù)載均衡;

檢查方法:

option httpchk

option httpchk <uri>

option httpchk <method> <uri>

option httpchk <method> <uri> <version>:不能用于frontend段,例如:

backend https_relay

    mode tcp

    option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.magedu.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>

捕獲并記錄指定的請(qǐng)求首部最近一次出現(xiàn)時(shí)的第一個(gè)值,僅能用于“frontend”和“l(fā)isten”區(qū)段。捕獲的首部值使用花括號(hào){}括起來后添加進(jìn)日志中。如果需要捕獲多個(gè)首部值,它們將以指定的次序出現(xiàn)在日志文件中,并以豎線“|”作為分隔符。不存在的首部記錄為空字符串,最常需要捕獲的首部包括在虛擬主機(jī)環(huán)境中使用的“Host”、上傳請(qǐng)求首部中的“Content-length”、快速區(qū)別真實(shí)用戶和網(wǎng)絡(luò)機(jī)器人的“User-agent”,以及代理環(huán)境中記錄真實(shí)請(qǐng)求來源的“X-Forward-For”。

<name>:要捕獲的首部的名稱,此名稱不區(qū)分字符大小寫,但建議與它們出現(xiàn)在首部中的格式相同,比如大寫首字母。需要注意的是,記錄在日志中的是首部對(duì)應(yīng)的值,而非首部名稱。

<length>:指定記錄首部值時(shí)所記錄的精確長(zhǎng)度,超出的部分將會(huì)被忽略。

可以捕獲的請(qǐng)求首部的個(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)同請(qǐng)求首部。

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的版本號(hào),然而,向所有人公開HAProxy的精確版本號(hào)是非常有風(fēng)險(xiǎn)的,因?yàn)樗軒椭鷲阂庥脩艨焖俣ㄎ话姹镜娜毕莺吐┒?。盡管“stats hide-version”一條就能夠啟用統(tǒng)計(jì)報(bào)告,但還是建議設(shè)定其它所有的參數(shù),以免其依賴于默認(rèn)設(shè)定而帶來非期后果。具體請(qǐng)參照“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è)定而帶來非期后果。具體請(qǐng)參照“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ū)段名稱檢測(cè)僅僅是以字符串比較的方式進(jìn)行,它不會(huì)真檢測(cè)指定的區(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è)用戶帳號(hào),其不能用于“frontend”區(qū)段。

<user>:授權(quán)進(jìn)行訪問的用戶名;

<passwd>:此用戶的訪問密碼,明文格式;

此語句將基于默認(rèn)設(shè)定啟用統(tǒng)計(jì)報(bào)告功能,并僅允許其定義的用戶訪問,其也可以定義多次以授權(quán)多個(gè)用戶帳號(hào)??梢越Y(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è)定而帶來非期后果。

3.16 stats admin

stats 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ǐng)求方法被限制于僅能使用緩沖區(qū)減去保留部分之外的空間,因此,服務(wù)器列表不能過長(zhǎng),否則,此請(qǐng)求將無法正常工作。因此,建議一次僅調(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

3.17 option httplog

option httplog [ clf ]

啟用記錄HTTP請(qǐng)求、會(huì)話狀態(tài)和計(jì)時(shí)器的功能。

clf:使用CLF格式來代替HAProxy默認(rèn)的HTTP格式,通常在使用僅支持CLF格式的特定日志分析器時(shí)才需要使用此格式。

默認(rèn)情況下,日志輸入格式非常簡(jiǎn)陋,因?yàn)槠鋬H包括源地址、目標(biāo)地址和實(shí)例名稱,而“option httplog”參數(shù)將會(huì)使得日志格式變得豐富許多,其通常包括但不限于HTTP請(qǐng)求、連接計(jì)時(shí)器、會(huì)話狀態(tài)、連接數(shù)、捕獲的首部及cookie、“frontend”、“backend”及服務(wù)器名稱,當(dāng)然也包括源地址和端口號(hào)等。

3.18 option logasap

     no option logasap

option logasap

no option logasap

啟用或禁用提前將HTTP請(qǐng)求記入日志,不能用于“backend”區(qū)段。

默認(rèn)情況下,HTTP請(qǐng)求是在請(qǐng)求結(jié)束時(shí)進(jìn)行記錄以便能將其整體傳輸時(shí)長(zhǎng)和字節(jié)數(shù)記入日志,由此,傳較大的對(duì)象時(shí),其記入日志的時(shí)長(zhǎng)可能會(huì)略有延遲?!皁ption logasap”參數(shù)能夠在服務(wù)器發(fā)送complete首部時(shí)即時(shí)記錄日志,只不過,此時(shí)將不記錄整體傳輸時(shí)長(zhǎng)和字節(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ù)器的請(qǐng)求首部中插入“X-Forwarded-For”首部。

<network>:可選參數(shù),當(dāng)指定時(shí),源地址為匹配至此網(wǎng)絡(luò)中的請(qǐng)求都禁用此功能。

<name>:可選參數(shù),可使用一個(gè)自定義的首部,如“X-Client”來替代“X-Forwarded-For”。有些獨(dú)特的web服務(wù)器的確需要用于一個(gè)獨(dú)特的首部。

if-none:僅在此首部不存在時(shí)才將其添加至請(qǐng)求報(bào)文問道中。

HAProxy工作于反向代理模式,其發(fā)往服務(wù)器的請(qǐng)求中的客戶端IP均為HAProxy主機(jī)的地址而非真正客戶端的地址,這會(huì)使得服務(wù)器端的日志信息記錄不了真正的請(qǐng)求來源,“X-Forwarded-For”首部則可用于解決此問題。HAProxy可以向每個(gè)發(fā)往服務(wù)器的請(qǐng)求上添加此首部,并以客戶端IP為其value。

需要注意的是,HAProxy工作于隧道模式,其僅檢查每一個(gè)連接的第一個(gè)請(qǐng)求,因此,僅第一個(gè)請(qǐng)求報(bào)文被附加此首部。如果想為每一個(gè)請(qǐng)求都附加此首部,請(qǐng)確保同時(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>

在用戶請(qǐng)求不存在的頁面時(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

3.21 errorloc 和 errorloc302 

errorloc <code> <url>

errorloc302 <code> <url>

請(qǐng)求錯(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法的場(chǎng)景(如POST)來說會(huì)產(chǎn)生問題,因?yàn)榉祷乜蛻舻腢RL是不允許使用GET以外的其它方法的。如果的確有這種問題,可以使用errorloc303來返回303狀態(tài)碼給客戶端。

3.22 errorloc303

errorloc303 <code> <url>

請(qǐng)求錯(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

一個(gè)配置示例:

#---------------------------------------------------------------------

# 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

    option dontlognull

    capture request  header Host len 20

    capture request  header Referer len 60

    default_backend servers

frontend healthcheck

    bind :1099

    mode http

    option httpclose

    option forwardfor

    default_backend servers

backend servers

 balance roundrobin

    server websrv1 192.168.10.11:80 check maxconn 2000

    server websrv2 192.168.10.12: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.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

    server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

【騰訊云】云服務(wù)器、云數(shù)據(jù)庫、COS、CDN、短信等云產(chǎn)品特惠熱賣中

發(fā)表評(píng)論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: