一.HAProxy介紹
- HAProxy: 是法國人Willy Tarreau開發(fā)的一個(gè)開源軟件,是 一款應(yīng)對客戶端10000以上的同時(shí)連接的高性能的TCP和 HTTP負(fù)載均衡器。其功能是用來提供基于cookie的持久性, 基于內(nèi)容的交換,過載保護(hù)的高級流量管制,自動(dòng)故障切換 ,以正則表達(dá)式為基礎(chǔ)的標(biāo)題控制運(yùn)行時(shí)間,基于Web的報(bào) 表,高級日志記錄以幫助排除故障的應(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)境 ?
可以針對HTTP請求添加cookie,進(jìn)行路由后端服務(wù)器 ?
可平衡負(fù)載至后端服務(wù)器,并支持持久連接 ?
支持基于cookie進(jìn)行調(diào)度 ?
支持所有主服務(wù)器故障切換至備用服務(wù)器 ?
支持專用端口實(shí)現(xiàn)監(jiān)控服務(wù) ?
支持不影響現(xiàn)有連接情況下停止接受新連接請求 ?
可以在雙向添加,修改或刪除HTTP報(bào)文首部 ?
支持基于pattern實(shí)現(xiàn)連接請求的訪問控制 ?
通過特定的URI為授權(quán)用戶提供詳細(xì)的狀態(tài)信息
支持http反向代理 ?
支持動(dòng)態(tài)程序的反向代理 ?
支持基于數(shù)據(jù)庫的反向代理
(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í)擁有前端和后端,適用于一對一環(huán)境
簡單的配置練習(xí):vim /etc/haproxy/haproxy.cfg
image.png
在客戶端上使用curl 172.18.254.242來測試
image.png
- 有關(guān)globe配置設(shè)置
image.png
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)程可打開的最大文件 數(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: 記錄日志的長度,默認(rèn)1024log日志功能
在globe中l(wèi)og對應(yīng)的地址為本地地址,且記錄在/var/log/haproxy.log文件中
在/etc/rsyslog中設(shè)置
image.png
image.png
在客戶端上測試查看日志
image.png
也可以將本地地址改為遠(yuǎn)程地址,在遠(yuǎn)程上進(jìn)行日志記錄
例如: log 192.168..136.134 local2
并在134這個(gè)服務(wù)器端的日志配置文件中做相同操作
設(shè)置完成后在客戶端再進(jìn)行測試查看日志記錄
image.png
也就是說日志可以記錄在本機(jī)也可以記錄在遠(yuǎn)程服務(wù)器上
二.proxy配置段介紹
配置參數(shù):
(1)bind:指定一個(gè)或多個(gè)前端偵聽地址和端口
image.png
也可以監(jiān)聽多個(gè)端口或地址
bind :80, :8008
或者bind 172.18.254.22:80,172.254.243:80
(2)Listen設(shè)置:不區(qū)分前段后端,屬于一一對應(yīng)關(guān)系
image.png
將前端和后端結(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ù)量無上限 ?
leastconn:加權(quán)最少連接,動(dòng)態(tài)算法,最少連接的后端服務(wù)器優(yōu)先分 配接收新連接,相同連接時(shí)輪詢,推薦在較長會(huì)話的場景使用,例如 MySQL、LDAP等,不適合http ?
3.first:根據(jù)服務(wù)器在列表中的位置,自上而下進(jìn)行調(diào)度;前面服務(wù)器 的連接數(shù)達(dá)到上限,新請求才會(huì)分配給下一臺服務(wù) ?
4.source:源地址hash,新連接先按權(quán)重分配,后續(xù)連接按source分配 請求
5.uri: 對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> ?
image.png
在客戶端測試:
image.png
6.url_param: 對用戶請求的uri中的<params>部分中的參數(shù)的值作hash計(jì)算 ,并由服務(wù)器總權(quán)重相除以后派發(fā)至某挑出的服務(wù)器;通常用于追蹤 用戶,以確保來自同一個(gè)用戶的請求始終發(fā)往同一個(gè)Backend Server
7.hdr(<name>):對于每個(gè)http請求,此處由<name>指定的 http首部將會(huì)被取出做hash計(jì)算; 并由服務(wù)器總權(quán)重相除以 后派發(fā)至某挑出的服務(wù)器;無有效值的會(huì)被輪詢調(diào)度 hdr(Cookie)
在客戶端上vim /etc/hosts
image.png
通過訪問Host的首部進(jìn)行hash計(jì)算并被調(diào)度
image.png
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ì) 列長度 backup:設(shè)定當(dāng)前server為備用服務(wù)器Sorry Server
image.png
在haproxy服務(wù)器上將監(jiān)聽端口改為9527,將客戶端全部停掉Http服務(wù),此時(shí)sorryserver提供服務(wù)
(4)健康狀態(tài)檢測
check:對當(dāng)前server做健康狀態(tài)檢測,只用于四層檢測
注意:httpchk,“smtpchk”, “mysql-check”, “pgsqlcheck” and “ssl-hello-chk” 用于定義應(yīng)用層檢測方法
addr :檢測時(shí)使用的IP地址
port :針對此端口進(jìn)行檢測
inter <delay>:檢測之間的時(shí)間間隔,默認(rèn)為2000ms
rise <count>:連續(xù)多少次檢測結(jié)果為“成功”才標(biāo)記服 務(wù)器為可用;默認(rèn)為2
fall <count>:連續(xù)多少次檢測結(jié)果為“失敗”才標(biāo)記服 務(wù)器為不可用;默認(rèn)為3 ?
image.png
在rs服務(wù)器上設(shè)置一個(gè)另外一個(gè)地址133的地址,檢測機(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類的請 求重定向至指定的URL
image.png
在客戶端上curl -L 172.18.254.242只要訪問rs2就會(huì)被調(diào)度到haproxy服務(wù)器上
image.png
(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:重寫
insert:插入
prefix:前綴
image.png
在客戶端curl -I 172.18.254.242
image.png
實(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ì)頁;基于默認(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í)的賬號和密碼,可使用多次 ? stats realm <realm> 認(rèn)證時(shí)的realm ?
stats hide-version 隱藏版本
image.png
image.png
演示示例:
image.png
顯示結(jié)果:
image.png
(6)工作模式
maxconn <conns>:為指定的frontend定義其最大并發(fā)連接 數(shù);默認(rèn)為3000 ?
image.png
image.png
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)連接請求到 達(dá)時(shí)回應(yīng)“OK”后即斷開連接,較少使用
(7)健康狀態(tài)檢測
對后端服務(wù)器做http協(xié)議健康狀態(tài)檢測:
通常用于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)檢測機(jī)制
http-check expect [!] <match> <pattern> http協(xié)議健康狀態(tài)檢測響應(yīng)內(nèi)容或指定響應(yīng)碼
image.png
tail -f /var/log/httpd/access_log
image.png
當(dāng)將某個(gè)rs服務(wù)器端的index.html刪除,通過haproxy的代理服務(wù)器的檢查,將不會(huì)再往該服務(wù)器上調(diào)度
因?yàn)閔aproxy代理服務(wù)器默認(rèn)訪問的是rs服務(wù)器上的index.html頁面
image.png
(8)forwardfor配置
option forwardfor [ except <network> ] [ header <name> ] [ if-none ] 在由haproxy發(fā)往后端主機(jī)的請求報(bào)文中添加“X-ForwardedFor”首部,其值為前端客戶端的地址;用于向后端主發(fā)送真實(shí)的客戶 端IP
[ except <network> ]:請求報(bào)請來自此處指定的網(wǎng)絡(luò)時(shí)不予 添加此首部,如haproxy自身所在網(wǎng)絡(luò)
[ header <name> ]:使用自定義的首部名稱,而非“XForwarded-For”
[ if-none ] 如果沒有首部才添加首部,如果有使用默認(rèn)值 ?
為指定的MIME類型啟用壓縮傳輸功能
compression algo <algorithm> ...:啟用http協(xié)議的壓縮機(jī) 制,指明壓縮算法gzip, deflate
compression type <mime type> ...:指明壓縮的MIMI類型
實(shí)驗(yàn):自定義首部信息
在客戶端httpd.conf文件中修改指定的默認(rèn)日志記錄格式,內(nèi)容如下圖
image.png
并將默認(rèn)的訪問日志格式改為haformat
在haproxy服務(wù)器上將默認(rèn)的forwardfor的首部信息進(jìn)行修改,修改如圖
image.png
在客戶端進(jìn)行訪問觀察日記的記錄的格式
或者在日志文件中修改為
image.png
顯示結(jié)果如下
image.png
(9)錯(cuò)誤頁配置
errorfile <code> <file> 自定義錯(cuò)誤頁
<code>:HTTP status code.
支持200, 400, 403, 408, 500, 502, 503, 504.
image.png
<file>:錯(cuò)誤頁文件路徑 ?
示例:
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
image.png
(10)修改報(bào)文首部
在請求報(bào)文尾部添加指定首部 reqadd <string> [{if | unless} <cond>]
image.png
在響應(yīng)報(bào)文尾部添加指定首部 rspadd <string> [{if | unless} <cond>]
示例:rspadd X-Via:\ HAPorxy ?
從請求報(bào)文中刪除匹配正則表達(dá)式的首部
reqdel <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>] 不分大小寫從響應(yīng)報(bào)文中刪除匹配正則表達(dá)式的首部
rspdel <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>] 不分大小寫 示例: rspidel server.*
image.png
image.png
(11)ACL
以實(shí)例舉例來進(jìn)行說明
image.png
拒絕該地址的訪問
image.png
如果寫成unless代表用||代表或
image.png
image.png
image.png
根據(jù)路徑來拒絕訪問
image.png
image.png
阻止圖片的訪問,其他的不阻止
image.png
實(shí)驗(yàn):實(shí)現(xiàn)簡單的動(dòng)靜分離訪問
當(dāng)訪問靜態(tài)頁面時(shí)如圖片或是js,css,.html等就只往rs2上調(diào)度,如果訪問的是.php頁面就往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
測試結(jié)果如圖:
image.png
只要訪問.html和.jpg就往staticsrvs2上調(diào)度
image.png
image.png
實(shí)現(xiàn)通過域名的訪問調(diào)度機(jī)制(提取http協(xié)議請求報(bào)文)
image.png
在客戶端測試
image.png
拒絕訪問頭部信息
image.png
image.png
拒絕用戶訪問首部信息 curl -i命令被禁止
image.png
取反命令應(yīng)用
image.png
通過curl命令訪問拒絕,但是用過curl -I訪問允許
注意:image.png
image.png
(12)配置
tcp-request connection {accept|reject} [{if | unless} <condition>]
根據(jù)第4層條件對傳入連接執(zhí)行操作
實(shí)驗(yàn)加以說明:通過tcp協(xié)議訪問mysql數(shù)據(jù)頁面
vim /etc/haproxy/haproxy.cfg
frontend mysql
bind 172.18.254.242:3306
mode tcp ——一定要寫因?yàn)椴辉偈褂媚J(rèn)的httpd協(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
然后打開mysql,創(chuàng)建遠(yuǎn)程登錄用戶
image.png
image.png
在客戶端進(jìn)行測試: mysql -uroot -pcentos -h172.18.254.242
image.png
image.png
測試結(jié)果如圖:實(shí)現(xiàn)輪詢調(diào)度訪問數(shù)據(jù)庫
image.png
實(shí)現(xiàn)基于tcp協(xié)議的ssh命令的訪問調(diào)度
image.png
vim /etcssh/sshd_config
image.png
在客戶端測試 ssh 172.18.254.242
(13)https協(xié)議
支持ssl會(huì)話
首先在haproxy的服務(wù)端上生成自簽名證書
cd /etc/pki/tls/certs
make /etc/haproxy/haproxy.pem——將證書和私鑰在一起生成
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
在客戶端測試
image.png
把80端口的請求重向定443 訪問不加密的http協(xié)議時(shí)會(huì)自動(dòng)跳轉(zhuǎn)到https協(xié)議上
bind 172.18.254.242:80 redirect scheme https if !{ ssl_fc }
image.png
客戶端上進(jìn)行測試
image.png
在后端服務(wù)器上修改日志格式,在haproxy服務(wù)器上設(shè)置首部添加信息,顯示訪問的端口信息
image.png
顯示客戶端的訪問端口
image.png



































































