HAProxy 之 概念和配置介紹

本文索引

1? 概述

2? HAProxy功能

3? HAProxy組成

4? 相關(guān)配置

4.1? global配置

4.2? 綁定監(jiān)聽端口配置

4.3? 定義后端主機(jī)的各服務(wù)器及其選項(xiàng)

4.4? compression設(shè)置

4.5? 健康狀態(tài)檢測(cè)

4.6? cookie配置

4.7? 工作模式

4.8? 錯(cuò)誤頁(yè)配置

4.9? 修改報(bào)文首部

4.10 連接超時(shí)

1? 概述

HAProxy:是法國(guó)人Willy Tarreau開發(fā)的一個(gè)開源軟件,是一款應(yīng)對(duì)客戶端10000以上的同時(shí)連接的高性能的TCP和HTTP負(fù)載均衡器(LB)。其功能是用來(lái)提供基于cookie的持久性,基于內(nèi)容的交換,過載保護(hù)的高級(jí)流量管制,自動(dòng)故障切換,以正則表達(dá)式為基礎(chǔ)的標(biāo)題控制運(yùn)行事件,基于Web的報(bào)表,高級(jí)日志記錄以幫助排除故障的應(yīng)用或網(wǎng)絡(luò)及其他功能。HAProxy系統(tǒng)自帶管理頁(yè)面。版本有1.41.5 1.6 1.7 1.8

HAProxy官網(wǎng):http://www.haproxy.org

官方文檔:https://cbonte.github.io/haproxy-dconv/

2??HAProxy功能

.HAProxy是基于TCP/HTTP反向代理服務(wù)器,尤其適合于高可用性環(huán)境

.可以針對(duì)HTTP請(qǐng)求添加cookie,進(jìn)行路由后端服務(wù)器

.可平衡負(fù)載至后端服務(wù)器,并支持持久連接

.支持基于cookie進(jìn)行調(diào)度

.支持所有主服務(wù)器故障切換至備用服務(wù)器

.支持專用端口實(shí)現(xiàn)監(jiān)控服務(wù)

.支持不影響現(xiàn)有連接情況下停止接受新連接請(qǐng)求

.可以在雙向添加,修改或刪除HTTP報(bào)文首部

.支持基于pattern實(shí)現(xiàn)連接請(qǐng)求的訪問控制

.通過特定的URI為授權(quán)用戶提供詳細(xì)的狀態(tài)信息

.支持http反向代理

.支持動(dòng)態(tài)程序的反向代理

.支持基于數(shù)據(jù)庫(kù)的反向代理

HAProxy放置在如下的位置調(diào)度請(qǐng)求


3? HAProxy組成

.程序環(huán)境:

主程序:/usr/sbin/haproxy

配置文件:/etc/haproxy/haproxy.cfg

單元文件:/usr/lib/systemd/system/haproxy.service

配置文件配置段:

.global:全局配置段

進(jìn)程及安全配置相關(guān)的參數(shù)

性能調(diào)整相關(guān)參數(shù)

Debug參數(shù)

.proxies:代理配置段,proxy名稱:使用字母數(shù)字-_ . :并區(qū)分字符大小寫

defaults:為frontend, backend,listen提供默認(rèn)配置,如果其他段沒配置,則相關(guān)參數(shù)使用defaults段里設(shè)定的參數(shù)

frontend:前端,指定接收客戶端連接偵聽套接字設(shè)置,相當(dāng)于是VIP,發(fā)布到公網(wǎng)的ip,功能相當(dāng)于在nginx中是配置于server {}

backend:后端,指定將連接請(qǐng)求轉(zhuǎn)發(fā)至后端服務(wù)器的相關(guān)設(shè)置,相當(dāng)于是RS,同一個(gè)RS可以屬于多個(gè)backend,功能相當(dāng)于在nginx中是配置于upstream {}

listen:指定完整的前后端設(shè)置,同時(shí)擁有前端和后端,只對(duì)TCP有效,適用于一對(duì)一環(huán)境,但是建議寫出frontend和backend格式,方便調(diào)整

4? 相關(guān)配置

4.1? global配置

.global配置參數(shù):

.進(jìn)程及安全管理:chroot, deamon,user,group, uid, gid

nbproc :要啟動(dòng)的haproxy的進(jìn)程數(shù)量,這個(gè)是和內(nèi)核有關(guān),單核的系統(tǒng)默認(rèn)單進(jìn)程,如果是兩核,默認(rèn)是兩個(gè),要求使用daemon模式,不建議設(shè)置太多數(shù)量,因?yàn)樯婕暗缴舷挛?/p>

ulimit-n :每個(gè)haproxy進(jìn)程可打開的最大文件數(shù),系統(tǒng)自動(dòng)會(huì)指定,不建議設(shè)置

daemon后端方式運(yùn)行,建議使用

log:定義全局的syslog服務(wù)器;最多可以定義兩個(gè)

log ??[len] [max level [min level]]

address:rsyslog服務(wù)器地址

len:記錄日志的長(zhǎng)度,默認(rèn)1024

.性能調(diào)整:

maxconn ?:設(shè)定每個(gè)haproxy進(jìn)程所能接受的最大并發(fā)連接數(shù),一般3000比較合適,可以設(shè)置在defaults和frontend配置段里

maxconnrate :設(shè)置每個(gè)進(jìn)程每秒種所能建立的最大連接數(shù)量

maxsessrate :設(shè)置每個(gè)進(jìn)程每秒種所能建立的最大會(huì)話數(shù)量

會(huì)話和連接的區(qū)別是,一個(gè)連接可以包括多個(gè)會(huì)話。同時(shí),一個(gè)連接里也可以沒有會(huì)話

maxsslconn :每進(jìn)程支持SSL的最大連接數(shù)量

spread-checks <0..50, inpercent>健康檢測(cè)延遲時(shí)長(zhǎng)比,建議2-5之間。一般不是同時(shí)發(fā)送,錯(cuò)開檢測(cè),把負(fù)載均攤在不同的時(shí)間里,放在給haproxy服務(wù)器造成負(fù)擔(dān),這里就是定義錯(cuò)開的時(shí)間,2表示2%.

4.2綁定監(jiān)聽端口配置

.bind:指定一個(gè)或多個(gè)前端偵聽地址和端口,應(yīng)用于frontend和listen

bind ?[]: ?[, ...] [param*]

.示例:

listen http_proxy

bind ?:80,:443?#綁定多個(gè)ip或端口,用逗號(hào)隔開,注意,綁定的端口不能和當(dāng)前haproxy服務(wù)器的其他服務(wù)混用,如果和其他服務(wù)沖突,建議更改其他服務(wù)的默認(rèn)端口

bind?10.0.0.1:10080,10.0.0.1:10443

bind?/var/run/ssl-frontend.sock??user?root?mode?600?accept-proxy

#這是socket,對(duì)內(nèi)用的,沒有實(shí)際應(yīng)用的意義。

以下寫法等價(jià)于如下的配置,實(shí)現(xiàn)功能一樣,但是listen是一對(duì)一,直接指定前端和后端,F(xiàn)rontend和Backend區(qū)分前端和后端的好處是比較靈活,可以交叉調(diào)用,所以建議用前端和后端交叉寫

寫法一

frontend??http

bind?*:80

default_backend????websrv

backend?websrv

balance????roundrobin

server?????web6e?172.18.50.65:80?check

server?????web7e?172.18.50.75:80?check

寫法二

listen?http

bind?:80

balance?roundrobin

server?????web6e?172.18.50.65:80?check

server?????web7e?172.18.50.75:80?check

4.3??定義后端主機(jī)的各服務(wù)器及其選項(xiàng)

.server ? ?[:[port]] [param*]

server ?[:port] ?[settings ...]

default-server ?[settings ...]

為backend中的各server設(shè)定默認(rèn)選項(xiàng)

:服務(wù)器在haproxy上的內(nèi)部名稱;出現(xiàn)在日志及警告信息

:服務(wù)器地址,支持使用主機(jī)名

[:[port]]:端口映射;省略時(shí),表示同bind中綁定的端口

[param*]:參數(shù),有以下三類:

weight:權(quán)重,默認(rèn)為1

例子server web1 172.18.50.65:80 check weight2

maxconn:當(dāng)前server的最大并發(fā)連接數(shù),這里設(shè)置5000就很大。

backlog?:當(dāng)server的連接數(shù)達(dá)到上限后的后援隊(duì)列長(zhǎng)度,當(dāng)rs的并發(fā)達(dá)到maxconn,就放到等待的隊(duì)列

backup:設(shè)定當(dāng)前server為備用服務(wù)器,相當(dāng)于sorryserver,這里要求本臺(tái)服務(wù)器要有http服務(wù)。需要健康檢查后端都失敗了才會(huì)啟用

例子:server? sorryserver? 172.18.50.63:9527? backup

.default_backend? ,當(dāng)沒有被use_backend匹配時(shí),使用默認(rèn)的backend,用于frontend中

.disabled設(shè)置

標(biāo)記主機(jī)為不可用,這個(gè)是臨時(shí)的策略,如后端機(jī)器需要維護(hù)時(shí),可以把這個(gè)機(jī)器設(shè)為disabled,就不會(huì)調(diào)度到對(duì)應(yīng)的機(jī)器。

例子

server??web7e?172.18.50.75:80?check??disabled

redir設(shè)置

redir? :將發(fā)往此server的所有GET和HEAD類的請(qǐng)求重定向至指定的URL,重定向到另一臺(tái)機(jī)器上,注意網(wǎng)絡(luò)要通

例子

server??web7e?172.18.50.75:80?check?redir?http://172.18.50.61:80

測(cè)試

for?i?in?{1..10};docurl?-L?172.18.50.63;done

4.4? compression設(shè)置

.為指定的MIME類型啟用壓縮傳輸功能

compressionalgo ...:?jiǎn)⒂胔ttp協(xié)議的壓縮機(jī)制,指明壓縮算法gzip, deflate

compressiontype ? ...:指明壓縮的MIMI類型

4.5? 健康狀態(tài)檢測(cè)

.check

對(duì)當(dāng)前server做健康狀態(tài)檢測(cè),只用于四層檢測(cè)

注意:httpchk,“smtpchk”, “mysql-check”,“pgsql-check” and “ssl-hello-chk”用于定義應(yīng)用層檢測(cè)方法

addr:檢測(cè)時(shí)使用的IP地址,可以檢查同一機(jī)器上的不同地址

port:針對(duì)此端口進(jìn)行檢測(cè)

inter :連續(xù)兩次檢測(cè)之間的時(shí)間間隔,默認(rèn)為2000ms

rise :連續(xù)多少次檢測(cè)結(jié)果為“成功”才標(biāo)記服務(wù)器為可用;默認(rèn)為2

fall :連續(xù)多少次檢測(cè)結(jié)果為“失敗”才標(biāo)記服務(wù)器為不可用;默認(rèn)為3

例子:

server web1 172.18.50.65:80 check weight 2? addr?192.168.32.65? port 80? inter 3000 rise 2 fall 2

其中:addr? 192.168.32.65?port 80可以不是提供服務(wù)的ip和端口,只要和能確定后端服務(wù)的狀態(tài)的ip就可以了

httpchk

.對(duì)后端服務(wù)器做http協(xié)議的健康狀態(tài)檢測(cè):通常用于backend。工作原理是發(fā)http請(qǐng)求,獲取到對(duì)應(yīng)的頁(yè)面,表示健康,所以后端服務(wù)器log會(huì)有相應(yīng)的大量訪問記錄

option httpchk默認(rèn)為:/OPTIONS HTTP/1.0

option httpchk?

option httpchk ?

option httpchk ? ?

定義基于http協(xié)議的7層健康狀態(tài)檢測(cè)機(jī)制

例子,構(gòu)造GET的檢測(cè)報(bào)文例子如下

option?httpchk?GET?/index.htmlHTTP/1.1\r\nhost:www.sunny.com

http-check expect [!]

http協(xié)議健康狀態(tài)檢測(cè)響應(yīng)內(nèi)容或指定響應(yīng)碼,希望得到的狀態(tài)碼

默認(rèn)狀態(tài)碼200是正常的,以下改成得到404狀態(tài)碼時(shí)為正常,配置如下

option?httpchk

http-checkexpect?status?404

4.6cookie配置

cookie :為當(dāng)前server指定cookie值,實(shí)現(xiàn)基于cookie的會(huì)話黏性

.cookie ? [ rewrite | insert | prefix ] [ indirect] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain ]* [ maxidle ] [ maxlife ]

:cookie名稱,用于實(shí)現(xiàn)持久連接

rewrite:重寫

insert:插入,把cookie信息插入到響應(yīng)報(bào)文里

prefix:前綴

nocache表示cookie信息不緩存

配置示例

.基于cookie的session sticky的實(shí)現(xiàn):

backend websrvs

cookie?WEBSRV ?insert ?nocache

#WEBSRV是cookie的鍵,值是其他命令指定,如以下的srv1和srv2就是對(duì)應(yīng)的值

server?srv1?172.16.100.6:80?weight?2?check?rise?1?fall?2?maxconn?3000?cookie?cksrv1

#調(diào)度到server1那么cookie值就是cksrv1,這個(gè)就是對(duì)應(yīng)客戶拿到的cookie值

server??srv2?172.16.100.7:80?weight?1?check?rise?1?fall?2?maxconn?3000?cookie?cksrv2

測(cè)試

在瀏覽器中測(cè)試,第一次在請(qǐng)求報(bào)文里沒有cookie值,響應(yīng)報(bào)文里都有cookie值.

響應(yīng)報(bào)頭有如下的內(nèi)容,WEBSRV為cookie的鍵,cksrv1為cookie的值

Set-Cookie: WEBSRV=cksrv1; path=/

另外,curl命令訪問時(shí),默認(rèn)不帶cookie值,需要通過選項(xiàng)-b實(shí)現(xiàn),命令如下

curl? -b WEBSRV=cksrv1172.18.50.63

4.7工作模式

.mode ?{ tcp|http|health}

定義haproxy的工作模式,有三個(gè):tcp|http|health,不支持UDP模式

tcp:基于layer4實(shí)現(xiàn)代理;可代理mysql, pgsql, ssh,ssl等協(xié)議,https時(shí)使用此模式

http:僅當(dāng)代理協(xié)議為http時(shí)使用,centos實(shí)際默認(rèn)模式

health:工作為健康狀態(tài)檢查的響應(yīng)模式,當(dāng)連接請(qǐng)求到達(dá)時(shí)回應(yīng)“OK”后即斷開連接,較少使用,可用于測(cè)試環(huán)境

TCP模式示例

默認(rèn)是http模式,如果是用frontend或者backend來(lái)定義,則兩個(gè)配置段都要寫入mode? tcp.

listen?ssh

bind?:22222

balance?leastconn

mode?tcp

server?sshsrv1?172.16.100.6:22?check

server?sshsrv2?172.16.100.7:22?check

如果在centos6上基于tcp的調(diào)度,重啟haproxy出現(xiàn)如下的報(bào)錯(cuò),可以忽略,或者是把默認(rèn)的兩個(gè)選項(xiàng)option為httplog和forwardfor注釋掉即可,重啟服務(wù)測(cè)試一下調(diào)度,已經(jīng)可以正常調(diào)度。

Stopping haproxy:?????????????????????????????????????????[? OK? ]

Starting haproxy: [WARNING] 305/173945 (6553) : parsing[/etc/haproxy/haproxy.cfg:46] : 'option httplog' not usable with proxy 'ssh'(needs 'mode http'). Falling back to 'option tcplog'.[WARNING] 305/173945(6553) : config : 'option forwardfor' ignored for proxy 'ssh' as it requiresHTTP mode.[WARNING] 305/173945 (6553) : parsing [/etc/haproxy/haproxy.cfg:46] :'option httplog' not usable with proxy 'mysql' (needs 'mode http'). Fallingback to 'option tcplog'.[WARNING] 305/173945 (6553) : config : 'optionforwardfor' ignored for proxy 'mysql' as it requires HTTP mode.??????? ??????????????[?OK? ]

如果是ssh的調(diào)度。建議先更改ssh的服務(wù)為其他端口,或者直接綁定ssh服務(wù)在某一特定的ip上.另外,同一個(gè)ip上有不同的mac導(dǎo)致認(rèn)為安全性驗(yàn)證失敗,提示:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!,如61機(jī)器要ssh連接73機(jī)器,73為HA調(diào)度器,出現(xiàn)報(bào)錯(cuò),此時(shí),需要把61下/root/.ssh/known_host關(guān)于73上信息刪掉,才可以再次被調(diào)度,這樣造成的問題可能是同一臺(tái)機(jī)器,如果調(diào)度器是輪詢調(diào)度,而且權(quán)重都是1:1,如果只有一臺(tái)機(jī)器進(jìn)行ssh,那么該機(jī)器永遠(yuǎn)會(huì)被調(diào)度到同一臺(tái)機(jī)器上,因?yàn)楫?dāng)該機(jī)器正常ssh連接的時(shí)候,為一次調(diào)度,要進(jìn)行下一次ssh前,需要清空61上/root/.ssh/known_host關(guān)于73上信息,然后在進(jìn)行下一次的ssh,否則下一次就會(huì)出現(xiàn)mac信息的錯(cuò)誤。

4.8錯(cuò)誤頁(yè)配置

設(shè)置在backend配置段

.errorfile? 自定義錯(cuò)誤頁(yè)

:HTTPstatus code.支持200,400, 403, 408, 500, 502, 503, 504.注意,只有指定的這幾個(gè)code支持

:錯(cuò)誤頁(yè)文件路徑

.示例:

errorfile??400?/etc/haproxy/errorfiles/400badreq.http

errorfile??408?/dev/null?#?workaround?Chrome?pre-connectbug

errorfile??403?/etc/haproxy/errorfiles/403forbid.http

errorfile?503/etc/haproxy/errorfiles/503sorry.http

errorloc

根據(jù)code執(zhí)行相應(yīng)跳轉(zhuǎn)

格式

errorloc? ?

例子

errorloc?503?http://wwww.sunny.com/

4.9修改報(bào)文首部

在frontend配置段里添加

格式:reqadd? [{if | unless} ]

在請(qǐng)求報(bào)文尾部添加指定首部,可以用于排錯(cuò),確定該請(qǐng)求是從哪臺(tái)haproxy轉(zhuǎn)發(fā)過來(lái)的

例子

HA上。注意寫法,頭部后面一定要有冒號(hào)

reqadd?sunny-x-via:haproxy6c

RS上的http服務(wù)器上定義log格式

ogFormat?"%h?%l?%u?%t?\"%r\"?%>s?%b\"%{Referer}i\"?\"%{User-Agent}i\"??\"%{sunny-x-via}i\""?combined

在響應(yīng)報(bào)文尾部添加指定首部,客戶端得到的響應(yīng)報(bào)文會(huì)添加上對(duì)應(yīng)的報(bào)頭,

格式:rspadd? [{if | unless}]

例子

rspadd??Server:Sunny-proxy6c

從請(qǐng)求報(bào)文中刪除匹配正則表達(dá)式的首部,

.reqdel???[{if?|?unless}?]

.reqidel???[{if?|?unless}?]?(ignore?case)?小寫字母i表示不分大小寫

從響應(yīng)報(bào)文中刪除匹配正則表達(dá)式的首部

.rspdel????[{if?|?unless}?]

.rspide??l??[{if?|?unless}?]?(ignore?case)?不分大小寫

其中i是指忽略大小寫,如果這里先通過rspdel Server刪掉首部,然后再rspadd? Server:Sunny-proxy6c添加首部,可以偽造首部Server的內(nèi)容

4.10連接超時(shí)

以下的時(shí)間設(shè)置要根據(jù)企業(yè)的業(yè)務(wù)實(shí)際情況設(shè)置,如游戲,一般設(shè)置時(shí)間長(zhǎng)一點(diǎn)。

.timeout?client??:客戶端最長(zhǎng)空閑連接超時(shí)時(shí)長(zhǎng)默認(rèn)單位是毫秒

.timeout??server??:后端服務(wù)器最長(zhǎng)空閑連接超時(shí)時(shí)長(zhǎng)

.timeout?http-keep-alive??:持久連接的持久時(shí)長(zhǎng)

.timeout?http-request:一次完整的HTTP請(qǐng)求的最大等待時(shí)長(zhǎng)

.timeout?connect?:成功連接后端服務(wù)器的最大等待時(shí)長(zhǎng)

.timeout?client-fin?:客戶端半連接的空閑時(shí)長(zhǎng),四次揮手只完成了前兩次揮手

.timeout?server-fin?:后端服務(wù)器半連接的空閑時(shí)長(zhǎng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 目錄: HAProxy是什么 HAProxy的核心能力和關(guān)鍵特性 HAProxy的安裝和運(yùn)行 使用HAProxy搭...
    kelgon閱讀 80,048評(píng)論 9 159
  • 互聯(lián)網(wǎng)架構(gòu)基礎(chǔ)知識(shí) 一、網(wǎng)站常見架構(gòu) 負(fù)載層 頁(yè)面緩存層 web層 數(shù)據(jù)層 二、運(yùn)維法則 緩存為王 盡量在前端(緩...
    魏鎮(zhèn)坪閱讀 4,856評(píng)論 0 9
  • 參考文檔: 1.haproxy:http://www.haproxy.org/ 本文涉及haproxy的安裝,并做...
    Netonline閱讀 2,448評(píng)論 1 51
  • HAProxy簡(jiǎn)介HAProxy配置ACL配置TCP轉(zhuǎn)發(fā)SSL轉(zhuǎn)發(fā) 一、HAProxy簡(jiǎn)介: (一)HAProxy...
    哈嘍別樣閱讀 1,574評(píng)論 0 0
  • Haproxy是既可以工作在7層也能工作在4層的反代工具.Haproxy的功能: 路由HTTP請(qǐng)求到后端服務(wù)器,基...
    uangianlap閱讀 1,590評(píng)論 0 1