HAProxy 之 概念和配置介紹

本文索引

1? 概述

2? HAProxy功能

3? HAProxy組成

4? 相關(guān)配置

4.1? global配置

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

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

4.4? compression設(shè)置

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

4.6? cookie配置

4.7? 工作模式

4.8? 錯誤頁配置

4.9? 修改報文首部

4.10 連接超時

1? 概述

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

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

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

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

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

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

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

.可以在雙向添加,修改或刪除HTTP報文首部

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

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

.支持http反向代理

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

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

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


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

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

4? 相關(guān)配置

4.1? global配置

.global配置參數(shù):

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

nbproc :要啟動的haproxy的進(jìn)程數(shù)量,這個是和內(nèi)核有關(guān),單核的系統(tǒng)默認(rèn)單進(jìn)程,如果是兩核,默認(rèn)是兩個,要求使用daemon模式,不建議設(shè)置太多數(shù)量,因為涉及到上下文

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

daemon后端方式運行,建議使用

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

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

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

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

.性能調(diào)整:

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

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

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

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

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

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

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

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

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

.示例:

listen http_proxy

bind ?:80,:443?#綁定多個ip或端口,用逗號隔開,注意,綁定的端口不能和當(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,對內(nèi)用的,沒有實際應(yīng)用的意義。

以下寫法等價于如下的配置,實現(xiàn)功能一樣,但是listen是一對一,直接指定前端和后端,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ù)器及其選項

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

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

default-server ?[settings ...]

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

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

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

[:[port]]:端口映射;省略時,表示同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á)到上限后的后援隊列長度,當(dāng)rs的并發(fā)達(dá)到maxconn,就放到等待的隊列

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

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

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

.disabled設(shè)置

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

例子

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

redir設(shè)置

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

例子

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

測試

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

4.4? compression設(shè)置

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

compressionalgo ...:啟用http協(xié)議的壓縮機(jī)制,指明壓縮算法gzip, deflate

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

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

.check

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

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

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

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

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

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

fall :連續(xù)多少次檢測結(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

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

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

option httpchk?

option httpchk ?

option httpchk ? ?

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

例子,構(gòu)造GET的檢測報文例子如下

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

http-check expect [!]

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

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

option?httpchk

http-checkexpect?status?404

4.6cookie配置

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

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

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

rewrite:重寫

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

prefix:前綴

nocache表示cookie信息不緩存

配置示例

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

backend websrvs

cookie?WEBSRV ?insert ?nocache

#WEBSRV是cookie的鍵,值是其他命令指定,如以下的srv1和srv2就是對應(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,這個就是對應(yīng)客戶拿到的cookie值

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

測試

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

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

Set-Cookie: WEBSRV=cksrv1; path=/

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

curl? -b WEBSRV=cksrv1172.18.50.63

4.7工作模式

.mode ?{ tcp|http|health}

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

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

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

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

TCP模式示例

默認(rèn)是http模式,如果是用frontend或者backend來定義,則兩個配置段都要寫入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)如下的報錯,可以忽略,或者是把默認(rèn)的兩個選項option為httplog和forwardfor注釋掉即可,重啟服務(wù)測試一下調(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上.另外,同一個ip上有不同的mac導(dǎo)致認(rèn)為安全性驗證失敗,提示:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!,如61機(jī)器要ssh連接73機(jī)器,73為HA調(diào)度器,出現(xiàn)報錯,此時,需要把61下/root/.ssh/known_host關(guān)于73上信息刪掉,才可以再次被調(diào)度,這樣造成的問題可能是同一臺機(jī)器,如果調(diào)度器是輪詢調(diào)度,而且權(quán)重都是1:1,如果只有一臺機(jī)器進(jìn)行ssh,那么該機(jī)器永遠(yuǎn)會被調(diào)度到同一臺機(jī)器上,因為當(dāng)該機(jī)器正常ssh連接的時候,為一次調(diào)度,要進(jìn)行下一次ssh前,需要清空61上/root/.ssh/known_host關(guān)于73上信息,然后在進(jìn)行下一次的ssh,否則下一次就會出現(xiàn)mac信息的錯誤。

4.8錯誤頁配置

設(shè)置在backend配置段

.errorfile? 自定義錯誤頁

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

:錯誤頁文件路徑

.示例:

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修改報文首部

在frontend配置段里添加

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

在請求報文尾部添加指定首部,可以用于排錯,確定該請求是從哪臺haproxy轉(zhuǎn)發(fā)過來的

例子

HA上。注意寫法,頭部后面一定要有冒號

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)報文尾部添加指定首部,客戶端得到的響應(yīng)報文會添加上對應(yīng)的報頭,

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

例子

rspadd??Server:Sunny-proxy6c

從請求報文中刪除匹配正則表達(dá)式的首部,

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

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

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

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

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

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

4.10連接超時

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

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

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

.timeout?http-keep-alive??:持久連接的持久時長

.timeout?http-request:一次完整的HTTP請求的最大等待時長

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容