一.HAProxy介紹
- HAProxy: 是法國(guó)人Willy Tarreau開(kāi)發(fā)的一個(gè)開(kāi)源軟件悼泌,是 一款應(yīng)對(duì)客戶端10000以上的同時(shí)連接的高性能的TCP和 HTTP負(fù)載均衡器松捉。其功能是用來(lái)提供基于cookie的持久性, 基于內(nèi)容的交換馆里,過(guò)載保護(hù)的高級(jí)流量管制隘世,自動(dòng)故障切換 ,以正則表達(dá)式為基礎(chǔ)的標(biāo)題控制運(yùn)行時(shí)間鸠踪,基于Web的報(bào) 表丙者,高級(jí)日志記錄以幫助排除故障的應(yīng)用或網(wǎng)絡(luò)及其他功能
- LB Cluster:
四層:lvs, nginx(stream),haproxy(mode tcp)
七層:http: nginx(http), haproxy(mode http), httpd
(1)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)求的訪問(wèn)控制 ?
通過(guò)特定的URI為授權(quán)用戶提供詳細(xì)的狀態(tài)信息
支持http反向代理 ?
支持動(dòng)態(tài)程序的反向代理 ?
支持基于數(shù)據(jù)庫(kù)的反向代理
(2)HAProxy組成
程序環(huán)境:
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
配置段: ?
global:全局配置段 進(jìn)程及安全配置相關(guān)的參數(shù) 性能調(diào)整相關(guān)參數(shù) Debug參數(shù) ?
proxies:代理配置段
defaults:為frontend, backend, listen提供默認(rèn)配置
fronted:前端,相當(dāng)于nginx, server {}
backend:后端侣集,相當(dāng)于nginx, upstream {}
listen:同時(shí)擁有前端和后端,適用于一對(duì)一環(huán)境
簡(jiǎn)單的配置練習(xí):vim /etc/haproxy/haproxy.cfg
在客戶端上使用curl 172.18.254.242來(lái)測(cè)試
- 有關(guān)globe配置設(shè)置
global配置參數(shù): ?
進(jìn)程及安全管理:chroot, deamon键俱,user, group, uid, gid
nbproc <number>:要啟動(dòng)的haproxy的進(jìn)程數(shù)量,系統(tǒng) 默認(rèn)單進(jìn)程世分,要求使用daemon模式
ulimit-n <number>:每個(gè)haproxy進(jìn)程可打開(kāi)的最大文件 數(shù)编振,系統(tǒng)自動(dòng)會(huì)指定,不建議設(shè)置
daemon 后端方式運(yùn)行臭埋,建議使用
log:定義全局的syslog服務(wù)器踪央;最多可以定義兩個(gè)
log <address> [len <length>] <facility> [max level [min level]]
address: rsyslog服務(wù)器地址
len: 記錄日志的長(zhǎng)度,默認(rèn)1024log日志功能
在globe中l(wèi)og對(duì)應(yīng)的地址為本地地址瓢阴,且記錄在/var/log/haproxy.log文件中
在/etc/rsyslog中設(shè)置
在客戶端上測(cè)試查看日志
也可以將本地地址改為遠(yuǎn)程地址畅蹂,在遠(yuǎn)程上進(jìn)行日志記錄
例如: log 192.168..136.134 local2
并在134這個(gè)服務(wù)器端的日志配置文件中做相同操作
設(shè)置完成后在客戶端再進(jìn)行測(cè)試查看日志記錄
也就是說(shuō)日志可以記錄在本機(jī)也可以記錄在遠(yuǎn)程服務(wù)器上
二.proxy配置段介紹
配置參數(shù):
(1)bind:指定一個(gè)或多個(gè)前端偵聽(tīng)地址和端口
也可以監(jiān)聽(tīng)多個(gè)端口或地址
bind :80, :8008
或者bind 172.18.254.22:80,172.254.243:80
(2)Listen設(shè)置:不區(qū)分前段后端,屬于一一對(duì)應(yīng)關(guān)系
將前端和后端結(jié)合在一起
(3)balance調(diào)度算法
balance:后端服務(wù)器組內(nèi)的服務(wù)器調(diào)度算法
調(diào)度算法: ?
1.roundrobin:基于權(quán)重輪詢荣恐,動(dòng)態(tài)算法液斜,支持權(quán)重的運(yùn)行時(shí)調(diào)整,支 持慢啟動(dòng)叠穆;每個(gè)后端backend中最多支持4095個(gè)server
server options: weight # ?
2.static-rr:基于權(quán)重輪詢少漆,靜態(tài)算法,不支持權(quán)重的運(yùn)行時(shí)調(diào)整及慢 啟動(dòng)硼被;后端主機(jī)數(shù)量無(wú)上限 ?
leastconn:加權(quán)最少連接示损,動(dòng)態(tài)算法,最少連接的后端服務(wù)器優(yōu)先分 配接收新連接嚷硫,相同連接時(shí)輪詢检访,推薦在較長(zhǎng)會(huì)話的場(chǎng)景使用夺溢,例如 MySQL、LDAP等烛谊,不適合http ?
3.first:根據(jù)服務(wù)器在列表中的位置风响,自上而下進(jìn)行調(diào)度;前面服務(wù)器 的連接數(shù)達(dá)到上限丹禀,新請(qǐng)求才會(huì)分配給下一臺(tái)服務(wù) ?
4.source:源地址hash状勤,新連接先按權(quán)重分配,后續(xù)連接按source分配 請(qǐng)求
5.uri: 對(duì)URI的左半部分或整個(gè)uri做hash計(jì)算双泪,并除以服務(wù)器總權(quán) 重取模持搜,以后派發(fā)至某挑出的服務(wù)器,適用于后端緩存服務(wù)器 <scheme>://<user>:<password>@<host>:<port>/<path> ;<params>?<query>#<frag>
左半部分:/<path>;<params>
整個(gè)uri:/<path>;<params>?<query>#<frag> ?
在客戶端測(cè)試:
6.url_param: 對(duì)用戶請(qǐng)求的uri中的<params>部分中的參數(shù)的值作hash計(jì)算 清钥,并由服務(wù)器總權(quán)重相除以后派發(fā)至某挑出的服務(wù)器诸衔;通常用于追蹤 用戶铝阐,以確保來(lái)自同一個(gè)用戶的請(qǐng)求始終發(fā)往同一個(gè)Backend Server
7.hdr(<name>):對(duì)于每個(gè)http請(qǐng)求呵燕,此處由<name>指定的 http首部將會(huì)被取出做hash計(jì)算荷腊; 并由服務(wù)器總權(quán)重相除以 后派發(fā)至某挑出的服務(wù)器付枫;無(wú)有效值的會(huì)被輪詢調(diào)度 hdr(Cookie)
在客戶端上vim /etc/hosts
通過(guò)訪問(wèn)Host的首部進(jìn)行hash計(jì)算并被調(diào)度
8.rdp-cookie 遠(yuǎn)程桌面相關(guān) ?
9.rdp-cookie(<name>)
(3)server配置
weight <weight>:權(quán)重易阳,默認(rèn)為1
maxconn <maxconn>:當(dāng)前后端server的最大并發(fā)連接數(shù)
backlog <backlog>:當(dāng)server的連接數(shù)達(dá)到上限后的后援隊(duì) 列長(zhǎng)度 backup:設(shè)定當(dāng)前server為備用服務(wù)器Sorry Server
在haproxy服務(wù)器上將監(jiān)聽(tīng)端口改為9527贼陶,將客戶端全部停掉Http服務(wù)蟆盹,此時(shí)sorryserver提供服務(wù)
(4)健康狀態(tài)檢測(cè)
check:對(duì)當(dāng)前server做健康狀態(tài)檢測(cè)孩灯,只用于四層檢測(cè)
注意:httpchk,“smtpchk”, “mysql-check”, “pgsqlcheck” and “ssl-hello-chk” 用于定義應(yīng)用層檢測(cè)方法
addr :檢測(cè)時(shí)使用的IP地址
port :針對(duì)此端口進(jìn)行檢測(cè)
inter <delay>:檢測(cè)之間的時(shí)間間隔逾滥,默認(rèn)為2000ms
rise <count>:連續(xù)多少次檢測(cè)結(jié)果為“成功”才標(biāo)記服 務(wù)器為可用峰档;默認(rèn)為2
fall <count>:連續(xù)多少次檢測(cè)結(jié)果為“失敗”才標(biāo)記服 務(wù)器為不可用;默認(rèn)為3 ?
在rs服務(wù)器上設(shè)置一個(gè)另外一個(gè)地址133的地址寨昙,檢測(cè)機(jī)制是檢查133地址而不是134的地址所以當(dāng)133網(wǎng)址關(guān)掉后讥巡,就不會(huì)將往134的服務(wù)器上進(jìn)行調(diào)度,結(jié)果連134的地址都不可用
disabled:標(biāo)記為不可用
臨時(shí)不可用舔哪,在實(shí)際工作中欢顷,當(dāng)某個(gè)服務(wù)器需要維護(hù)或更新時(shí),可以將改地址設(shè)為disabled尸红,這樣就不會(huì)往該服務(wù)器上調(diào)度?
redir <prefix>:將發(fā)往此server的所有GET和HEAD類的請(qǐng) 求重定向至指定的URL
在客戶端上curl -L 172.18.254.242只要訪問(wèn)rs2就會(huì)被調(diào)度到haproxy服務(wù)器上
(5)cookie配置 ?
cookie <value>:為當(dāng)前server指定cookie值吱涉,實(shí)現(xiàn)基于
cookie的會(huì)話黏性
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]
<name>:cookie名稱,用于實(shí)現(xiàn)持久連接
rewrite:重寫(xiě)
insert:插入
prefix:前綴
在客戶端curl -I 172.18.254.242
實(shí)現(xiàn)綁定外里,只會(huì)往rs1調(diào)度
curl -b SRV=srv2 172.18.254.242就會(huì)調(diào)度到rs2上
(5)統(tǒng)計(jì)接口啟用相關(guān)的參數(shù)
stats enable
啟用統(tǒng)計(jì)頁(yè)怎爵;基于默認(rèn)的參數(shù)啟用stats page
- stats uri : /haproxy?stats uri默認(rèn)值
- stats realm : HAProxy\ Statistics
- stats auth : no authentication ?
stats uri <prefix> 自定義stats page uri,默認(rèn)為 ?
stats auth <user>:<passwd> 認(rèn)證時(shí)的賬號(hào)和密碼,可使用多次 ? stats realm <realm> 認(rèn)證時(shí)的realm ?
stats hide-version 隱藏版本
演示示例:
顯示結(jié)果:
(6)工作模式
maxconn <conns>:為指定的frontend定義其最大并發(fā)連接 數(shù)盅蝗;默認(rèn)為3000 ?
mode { tcp|http|health } 定義haproxy的工作模式
tcp:基于layer4實(shí)現(xiàn)代理鳖链;可代理mysql, pgsql, ssh, ssl等協(xié)議,https時(shí)使用此模式,默認(rèn)模式
http:僅當(dāng)代理協(xié)議為http時(shí)使用,centos實(shí)際默認(rèn)模式
health:工作為健康狀態(tài)檢查的響應(yīng)模式,當(dāng)連接請(qǐng)求到 達(dá)時(shí)回應(yīng)“OK”后即斷開(kāi)連接芙委,較少使用
(7)健康狀態(tài)檢測(cè)
對(duì)后端服務(wù)器做http協(xié)議健康狀態(tài)檢測(cè):
通常用于bendend option httpchk 默認(rèn)為:/ OPTIONS HTTP/1.0 option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version> 定義基于http協(xié)議的7層健康狀態(tài)檢測(cè)機(jī)制
http-check expect [!] <match> <pattern> http協(xié)議健康狀態(tài)檢測(cè)響應(yīng)內(nèi)容或指定響應(yīng)碼
tail -f /var/log/httpd/access_log
當(dāng)將某個(gè)rs服務(wù)器端的index.html刪除逞敷,通過(guò)haproxy的代理服務(wù)器的檢查,將不會(huì)再往該服務(wù)器上調(diào)度
因?yàn)閔aproxy代理服務(wù)器默認(rèn)訪問(wèn)的是rs服務(wù)器上的index.html頁(yè)面
(8)forwardfor配置
option forwardfor [ except <network> ] [ header <name> ] [ if-none ] 在由haproxy發(fā)往后端主機(jī)的請(qǐng)求報(bào)文中添加“X-ForwardedFor”首部灌侣,其值為前端客戶端的地址推捐;用于向后端主發(fā)送真實(shí)的客戶 端IP
[ except <network> ]:請(qǐng)求報(bào)請(qǐng)來(lái)自此處指定的網(wǎng)絡(luò)時(shí)不予 添加此首部,如haproxy自身所在網(wǎng)絡(luò)
[ header <name> ]:使用自定義的首部名稱侧啼,而非“XForwarded-For”
[ if-none ] 如果沒(méi)有首部才添加首部牛柒,如果有使用默認(rèn)值 ?
為指定的MIME類型啟用壓縮傳輸功能
compression algo <algorithm> ...:?jiǎn)⒂胔ttp協(xié)議的壓縮機(jī) 制,指明壓縮算法gzip, deflate
compression type <mime type> ...:指明壓縮的MIMI類型
實(shí)驗(yàn):自定義首部信息
在客戶端httpd.conf文件中修改指定的默認(rèn)日志記錄格式痊乾,內(nèi)容如下圖
并將默認(rèn)的訪問(wèn)日志格式改為haformat
在haproxy服務(wù)器上將默認(rèn)的forwardfor的首部信息進(jìn)行修改皮壁,修改如圖
在客戶端進(jìn)行訪問(wèn)觀察日記的記錄的格式
或者在日志文件中修改為
顯示結(jié)果如下
(9)錯(cuò)誤頁(yè)配置
errorfile <code> <file> 自定義錯(cuò)誤頁(yè)
<code>:HTTP status code.
支持200, 400, 403, 408, 500, 502, 503, 504.
<file>:錯(cuò)誤頁(yè)文件路徑 ?
示例:
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
errorfile 408 /dev/null # workaround Chrome preconnect bug errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http ?
errorloc <code> <url>
相當(dāng)于errorloc302 <code> <url>,利用302重定向至指URL errorloc 503 http://www.magedu.com/error_pages/503.html
(10)修改報(bào)文首部
在請(qǐng)求報(bào)文尾部添加指定首部 reqadd <string> [{if | unless} <cond>]
在響應(yīng)報(bào)文尾部添加指定首部 rspadd <string> [{if | unless} <cond>]
示例:rspadd X-Via:\ HAPorxy ?
從請(qǐng)求報(bào)文中刪除匹配正則表達(dá)式的首部
reqdel <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>] 不分大小寫(xiě)從響應(yīng)報(bào)文中刪除匹配正則表達(dá)式的首部
rspdel <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>] 不分大小寫(xiě) 示例: rspidel server.*
(11)ACL
以實(shí)例舉例來(lái)進(jìn)行說(shuō)明
拒絕該地址的訪問(wèn)
如果寫(xiě)成unless代表用||代表或
根據(jù)路徑來(lái)拒絕訪問(wèn)
阻止圖片的訪問(wèn)哪审,其他的不阻止
實(shí)驗(yàn):實(shí)現(xiàn)簡(jiǎn)單的動(dòng)靜分離訪問(wèn)
當(dāng)訪問(wèn)靜態(tài)頁(yè)面時(shí)如圖片或是js,css,.html等就只往rs2上調(diào)度蛾魄,如果訪問(wèn)的是.php頁(yè)面就往rs1調(diào)度
步驟:
vim /etc/haproxy/haproxy.cfg
frontend http
bind 172.18.254.242:80
maxconn 5000
acl staticfile path_end .jpg .js .css .html
acl appfile path_end .php
use_backend staticsrvs2 if staticfile
use_backend appsrvs1 if appfile
default_backend appsrvs1
backend appsrvs1
balance roundrobin
server webserver1 192.168.136.134:80 check weight 1
backend staticsrvs2
balance roundrobin
server webserver2 192.168.136.183:80 check weight 1 maxconn 5000
測(cè)試結(jié)果如圖:
只要訪問(wèn).html和.jpg就往staticsrvs2上調(diào)度
實(shí)現(xiàn)通過(guò)域名的訪問(wèn)調(diào)度機(jī)制(提取http協(xié)議請(qǐng)求報(bào)文)
在客戶端測(cè)試
拒絕訪問(wèn)頭部信息
拒絕用戶訪問(wèn)首部信息 curl -i命令被禁止
取反命令應(yīng)用
通過(guò)curl命令訪問(wèn)拒絕,但是用過(guò)curl -I訪問(wèn)允許
注意:
(12)配置
tcp-request connection {accept|reject} [{if | unless} <condition>]
根據(jù)第4層條件對(duì)傳入連接執(zhí)行操作
實(shí)驗(yàn)加以說(shuō)明:通過(guò)tcp協(xié)議訪問(wèn)mysql數(shù)據(jù)頁(yè)面
vim /etc/haproxy/haproxy.cfg
frontend mysql
bind 172.18.254.242:3306
mode tcp ——一定要寫(xiě)因?yàn)椴辉偈褂媚J(rèn)的httpd協(xié)議湿滓,所以要寫(xiě)明協(xié)議
default_backend mysqlsrvs
backend mysqlsrvs
mode tcp
server mysql1 192.168.136.134:3306
server mysql2 192.168.136.183:3306
在rs服務(wù)器端安裝mysqld或是mariadb
然后打開(kāi)mysql,創(chuàng)建遠(yuǎn)程登錄用戶
在客戶端進(jìn)行測(cè)試: mysql -uroot -pcentos -h172.18.254.242
測(cè)試結(jié)果如圖:實(shí)現(xiàn)輪詢調(diào)度訪問(wèn)數(shù)據(jù)庫(kù)
實(shí)現(xiàn)基于tcp協(xié)議的ssh命令的訪問(wèn)調(diào)度
vim /etcssh/sshd_config
在客戶端測(cè)試 ssh 172.18.254.242
(13)https協(xié)議
支持ssl會(huì)話
首先在haproxy的服務(wù)端上生成自簽名證書(shū)
cd /etc/pki/tls/certs
make /etc/haproxy/haproxy.pem——將證書(shū)和私鑰在一起生成
vim /etc/haproxy/haproxy.cfg
frontend http
bind 172.18.254.242:80
bind 172.18.254.242:443 ssl crt /etc/haproxy/haproxy.pem
maxconn 5500
default_backend appsrvs1
backend appsrvs1
balance roundrobin
server webserver1 192.168.136.134:80 check weight 1
server webserver2 192.168.136.183:80 check weight 1
backend staticsrvs2
balance roundrobin
server webserver2 192.168.136.183:80 check weight 1 maxconn 5000
在客戶端測(cè)試
把80端口的請(qǐng)求重向定443 訪問(wèn)不加密的http協(xié)議時(shí)會(huì)自動(dòng)跳轉(zhuǎn)到https協(xié)議上
bind 172.18.254.242:80 redirect scheme https if !{ ssl_fc }
客戶端上進(jìn)行測(cè)試
在后端服務(wù)器上修改日志格式滴须,在haproxy服務(wù)器上設(shè)置首部添加信息,顯示訪問(wèn)的端口信息
顯示客戶端的訪問(wèn)端口