- HAProxy簡(jiǎn)介
- HAProxy配置
- ACL配置
- TCP轉(zhuǎn)發(fā)
- SSL轉(zhuǎn)發(fā)
一师痕、HAProxy簡(jiǎn)介:
(一)HAProxy的主要功能
- http反向代理
- tcp轉(zhuǎn)發(fā)
- 負(fù)載均衡垦垂,健康性檢查
- 雙向修改参萄、添加逃延、刪除http報(bào)文首部
(二)程序環(huán)境
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
(三)配置文件結(jié)構(gòu)
(1)global:全局配置段
- 進(jìn)程及安全配置相關(guān)的參數(shù)
- 性能調(diào)整相關(guān)參數(shù)
- Debug參數(shù)
(2)proxies:代理配置段
- defaults:為frontend, backend, listen提供默認(rèn)配置
- fronted:前端捕虽,相當(dāng)于nginx的server {}
- backend:后端纺裁,相當(dāng)于nginx的upstream {}
- listen:同時(shí)擁有前端和后端蜜自,適用于一對(duì)一環(huán)境憨募,不建議使用
二、HAProxy配置:
(一)global全局配置
(1)進(jìn)程及安全管理:chroot, deamon, user, group, uid, gid
nbproc <number>
要啟動(dòng)的haproxy的進(jìn)程數(shù)量(建議小于等于CPU核心數(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 <address> [len<length>] <facility> [max level [min level]]
定義全局的syslog服務(wù)器;最多可以定義兩個(gè)
address:rsyslog服務(wù)器地址
len:記錄日志的長(zhǎng)度荞彼,默認(rèn)1024實(shí)驗(yàn)1:實(shí)現(xiàn)haproxy輪詢模式的http反向代理并且將日志信息記錄在遠(yuǎn)程主機(jī)(192.168.136.133)上
實(shí)驗(yàn)環(huán)境:
haproxy服務(wù)器IP:192.168.136.230
后端RS1的IP:192.168.136.229
后端RS2的IP:192.168.136.129
// 1. 配置haproxy
vim /etc/haproxy/haproxy.cfg
// global配置段下冈敛,日志設(shè)置
log 192.168.136.133 local2
// proxies配置段下,反向代理設(shè)置
frontend web 172.18.58.230:80
default_backend webservs
backend webservs
balance roundrobin
server websrv1 192.168.136.229:80 check
server websrv2 192.168.136.129:80 check
systemctl restart haproxy
// 2. 配置RS
echo RS1 homepage > /var/www/http/index.html // RS1上操作
echo RS2 homepage > /var/www/http/index.html // RS2上操作
service httpd start
// 3. 配置日志記錄主機(jī)
vim /etc/rsyslog.conf
// 打開(kāi)UDP 514端口監(jiān)聽(tīng)
$ModLoad imudp
$UDPServerRun 514
// 設(shè)置日志存放目錄
local2.* /var/log/haproxy.log
systemctl restart rsyslog
測(cè)試結(jié)果顯示反向代理成功運(yùn)行鸣皂,日志成功生成
(2)日志系統(tǒng)
三種格式:
log global:使用global設(shè)置
log <address> [len<length>] <facility> [<level> [<minlevel>]]:具體設(shè)置
no log:不記錄日志
log-format <string>:設(shè)置日志格式-
將特定信息記錄在日志中
- capture cookie <name> len <length>
捕獲請(qǐng)求和響應(yīng)報(bào)文中的cookie并記錄日志 - capture request header <name> len<length>
捕獲請(qǐng)求報(bào)文中指定的首部并記錄日志
e.g.capture request header X-Forwarded-For len15
- capture response header <name> len<length>
捕獲響應(yīng)報(bào)文中指定的首部并記錄日志
e.g.capture response header Content-length len 9
- capture cookie <name> len <length>
-
性能調(diào)整:
- maxconn <number>
設(shè)定每個(gè)haproxy進(jìn)程所能接受的最大并發(fā)連接數(shù) - maxconnrate <number>
設(shè)置每個(gè)進(jìn)程每秒種所能建立的最大連接數(shù)量 - maxsessrate <number>
設(shè)置每個(gè)進(jìn)程每秒種所能建立的最大會(huì)話數(shù)量 - maxsslconn <number>
每進(jìn)程支持SSL的最大連接數(shù)量 - spread-checks <0..50, in percent>
健康檢測(cè)延遲時(shí)長(zhǎng)比抓谴,建議2-5之間
- maxconn <number>
(二)proxies 代理配置
- 代理配置部分結(jié)構(gòu)
defaults段:默認(rèn)設(shè)置
frontend段:指定接收客戶端連接偵聽(tīng)套接字設(shè)置
backend段:指定將連接請(qǐng)求轉(zhuǎn)發(fā)至后端服務(wù)器的相關(guān)設(shè)置
listen段:指定完整的前后端設(shè)置,只對(duì)TCP 有效
(1) bind:指定一個(gè)或多個(gè)前端偵聽(tīng)地址和端口
- 語(yǔ)法:bind [<address>]:<port_range> [, ...] [param*]
- 使用的段范圍:frontend, listen
(2)balance:后端服務(wù)器組內(nèi)的服務(wù)器調(diào)度算法
語(yǔ)法:
balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post]使用的段范圍:defaults, listen, backend
-
調(diào)度算法:
- roundrobin
基于權(quán)重輪詢寞缝,動(dòng)態(tài)算法癌压,支持權(quán)重的運(yùn)行時(shí)調(diào)整,支持慢啟動(dòng)荆陆;每個(gè)后端backend中最多支持4095個(gè)server
server options: weight #
- 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 - first
根據(jù)服務(wù)器在列表中的位置贱除,自上而下進(jìn)行調(diào)度;前面服務(wù)器的連接數(shù)達(dá)到上限稚新,新請(qǐng)求才會(huì)分配給下一臺(tái)服務(wù),很少使用 - source
源地址hash跪腹,新連接先按權(quán)重分配褂删,后續(xù)連接按source分配請(qǐng)求;調(diào)度的粒度過(guò)粗冲茸,不推薦使用 - 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>
- url_param
對(duì)用戶請(qǐng)求的uri中的<params>部分中的參數(shù)的值作hash計(jì)算难衰,并由服務(wù)器總權(quán)重相除以后派發(fā)至某挑出的服務(wù)器;通常用于追蹤用戶逗栽,以確保來(lái)自同一個(gè)用戶的請(qǐng)求始終發(fā)往同一個(gè)backend server - hdr (<name>)
對(duì)于每個(gè)http請(qǐng)求盖袭,此處由<name>指定的http首部將會(huì)被取出做hash計(jì)算;并由服務(wù)器總權(quán)重相除以后派發(fā)至某挑出的服務(wù)器彼宠;無(wú)有效值的會(huì)被輪詢調(diào)度
e.g. hdr (Cookie) - rdp-cookie 遠(yuǎn)程桌面相關(guān)
rdp-cookie (<name>)
- roundrobin
(3)hash-type:哈希算法
語(yǔ)法:hash-type <method> <function> <modifier>
使用的段范圍:defaults, listen, backend
method
map-based:除權(quán)取余法鳄虱,哈希數(shù)據(jù)結(jié)構(gòu)是靜態(tài)數(shù)組
consistent:一致性哈希,哈希數(shù)據(jù)結(jié)構(gòu)是一棵樹(shù)<function> : 哈希函數(shù)
sdbm, djb2, wt6
(4)default_backend <backend>
使用的段范圍:defaults, frontend, listen
無(wú)use_backend匹配時(shí)凭峡,使用默認(rèn)的backend拙已,用于frontend中
(5)default-server [param*]
使用的段范圍:defaults, listen, backend
為backend中的各server設(shè)定默認(rèn)選項(xiàng)
(6)server:定義后端主機(jī)的各服務(wù)器及其選項(xiàng)
使用的段范圍:listen, backend
-
語(yǔ)法:server <name> <address>[:[port]] [param*]
- <name>:服務(wù)器在haproxy上的內(nèi)部名稱(chēng);出現(xiàn)在日志及警告信息
- <address>:服務(wù)器地址摧冀,支持使用主機(jī)名
- [:[port]]:端口映射倍踪;省略時(shí),表示同bind中綁定的端口
- [param*]:參數(shù)
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
disabled:標(biāo)記為不可用
redir <prefix>:將發(fā)往此server的所有GET和HEAD類(lèi)的請(qǐng)求重定向至指定的URL
check:server參數(shù)建车,對(duì)當(dāng)前server做健康狀態(tài)檢測(cè),只用于四層檢測(cè)
注意:httpchk, smtpchk, mysql-check, pgsql-check, 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)為3cookie <value>:為當(dāng)前server指定cookie值框产,實(shí)現(xiàn)基于cookie的會(huì)話黏性
語(yǔ)法:
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache] [ postonly] [ preserve ] [ httponly] [ secure ] [ domain <domain> ]* [ maxidle<idle> ] [ maxlife<life> ]
<name>:cookie名稱(chēng)凄杯,用于實(shí)現(xiàn)持久連接
rewrite:重寫(xiě)
insert:插入
prefix:前綴實(shí)驗(yàn)2:在實(shí)驗(yàn)1的基礎(chǔ)上错洁,實(shí)現(xiàn)
(1)調(diào)度算法為加權(quán)輪詢,權(quán)重RS1:RS2=3:2戒突,RS1和RS2的最大并發(fā)連接分別為5000, 3000屯碴,默認(rèn)健康監(jiān)測(cè)間隔3000ms
(2)在后端RS全部不能提供服務(wù)時(shí),haproxy服務(wù)器本機(jī)充當(dāng)sorry server
// haproxy服務(wù)器上安裝httpd服務(wù)膊存,并配置
yum -y install httpd
vim /etc/httpd/conf/httpd.conf
Listen 8001 // haproxy監(jiān)聽(tīng)80端口导而,故sorry server服務(wù)需要通過(guò)其他端口提供服務(wù)
echo sorry page > /var/www/html/index.html
systemctl start httpd
// haproxy服務(wù)器上修改haproxy配置
vim /etc/haproxy/haproxy.cfg
frontend web 172.18.58.230:80
default_backend webservs
backend webservs
default-server inter 3000 weight 2 // 默認(rèn)server的健康監(jiān)測(cè)間隔3000ms,權(quán)重2
balance roundrobin
server websrv1 192.168.136.229:80 weight 3 maxconn 5000 check
server websrv2 192.168.136.129:80 maxconn 3000 check
server sorrysrv 192.168.136.230:8001 backup
systemctl restart haproxy
// 測(cè)試
for i in {1..10}; do curl 172.18.58.230; done
確實(shí)按照設(shè)置的權(quán)重轉(zhuǎn)發(fā)
關(guān)閉RS1和RS2的httpd服務(wù)后隔崎,轉(zhuǎn)至sorry server
- 實(shí)驗(yàn)3:在實(shí)驗(yàn)2的基礎(chǔ)上今艺,實(shí)現(xiàn)基于cookie的會(huì)話綁定
// haproxy服務(wù)器上修改haproxy配置
vim /etc/haproxy/haproxy.cfg
frontend web 172.18.58.230:80
default_backend webservs
backend webservs
default-server inter 3000 weight 2
cookie WEBSRV insert nocache // 響應(yīng)報(bào)文添加cookie,不進(jìn)行緩存
balance roundrobin
server websrv1 192.168.136.229:80 weight 3 maxconn 5000 check cookie srv1
server websrv2 192.168.136.129:80 maxconn 3000 check cookie srv2
server sorrysrv 192.168.136.230:8001 backup
systemctl restart haproxy
// 測(cè)試
curl -I 172.18.58.230
curl -b WEBSRV=srv1 172.18.58.230
curl -b WEBSRV=srv2 172.18.58.230
第一次登錄后的響應(yīng)報(bào)文中包含了cookie信息
curl命令指定不同的cookie信息爵卒,會(huì)被轉(zhuǎn)發(fā)至指定的RS
瀏覽器會(huì)在之后的請(qǐng)求報(bào)文中包含第一次響應(yīng)報(bào)文中的cookie信息虚缎,從而實(shí)現(xiàn)轉(zhuǎn)發(fā)綁定
(三)統(tǒng)計(jì)接口啟用相關(guān)參數(shù)
使用的段范圍:defaults, frontend, listen, backend
stats enable
啟用統(tǒng)計(jì)頁(yè);基于默認(rèn)的參數(shù)啟用stats pagestats uri<prefix>
自定義stats page uri,默認(rèn)為/haproxy?statsuristats auth<user>:<passwd>
認(rèn)證時(shí)的賬號(hào)和密碼钓株,可使用多次stats realm <realm>
認(rèn)證時(shí)的realmstats hide-version
隱藏版本stats refresh <delay>
設(shè)定自動(dòng)刷新時(shí)間間隔stats admin { if | unless } <cond>
啟用stats page中的管理功能實(shí)驗(yàn)4:實(shí)現(xiàn)通過(guò)瀏覽器頁(yè)面查看haproxy統(tǒng)計(jì)信息实牡,具體要求如下:
(1)通過(guò)內(nèi)網(wǎng)192.168.136.230:8888訪問(wèn)
(2)uri為/hastats
(3)賬戶認(rèn)證,提示信息"haproxy auth"轴合,賬戶:hatest1创坞,密碼:centos
(4)統(tǒng)計(jì)信息頁(yè)面隱藏版本信息
(5)自動(dòng)隔5s刷新一次
(6)啟用統(tǒng)計(jì)頁(yè)面的管理功能
vim /etc/haproxy/haproxy.cfg
listen hastats
bind 192.168.136.230:8888
stats enable
stats uri /hastats
stats auth hatest1:centos
stats realm "haproxy auth"
stats hide-version
stats refresh 5
stats admin if TRUE
systemctl restart haproxy
瀏覽器登錄http://192.168.136.230:8888/hastats
(四)maxconn <conns>
為指定的frontend定義其最大并發(fā)連接數(shù);默認(rèn)為3000
使用的段范圍:defaults, backend, listen
(五)mode { tcp | http | health}
定義haproxy的工作模式
使用的段范圍:defaults, backend, listen
tcp:基于layer4實(shí)現(xiàn)代理受葛;可代理mysql, pgsql, ssh, ssl, https等協(xié)議题涨,默認(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)連接携栋,較少使用
(六)options httpchk
- 對(duì)后端服務(wù)器做http協(xié)議健康狀態(tài)檢測(cè):通常用于backend
- 語(yǔ)法:
option httpchk
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>
(七)options forwardfor
語(yǔ)法:
option forwardfor [ except <network> ] [ header <name> ] [ if-none ]在由haproxy發(fā)往后端主機(jī)的請(qǐng)求報(bào)文中添加“X-Forwarded-For”首部,其值為前端客戶端的地址咳秉;用于向后端主發(fā)送真實(shí)的客戶端IP
[ except <network> ]:請(qǐng)求報(bào)請(qǐng)來(lái)自此處指定的網(wǎng)絡(luò)時(shí)不予添加此首部婉支,如haproxy自身所在網(wǎng)絡(luò)
[ header <name> ]:使用自定義的首部名稱(chēng),而非“X-Forwarded-For”
[ if-none ]:如果沒(méi)有首部才添加首部澜建,如果有使用默認(rèn)值實(shí)驗(yàn)5:實(shí)現(xiàn)后端RS1的日志記錄中源iP為真實(shí)客戶端IP而非LB的iP
// 配置haproxy
vim /etc/haproxy/haproxy.cfg
option forwardfor except 127.0.0.0/8 // 此行在defaults語(yǔ)句段已經(jīng)存在
// 配置httpd
vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
service httpd restart
查看/var/log/httpd/access_log向挖,可以看到httpd服務(wù)重啟前后的日志記錄格式的不同。之前日志記錄的源IP為L(zhǎng)B在內(nèi)網(wǎng)的IP炕舵,修改配置后的日志記錄的源IP為真實(shí)發(fā)起連接的客戶端IP地址何之。
(八)為指定的MIME類(lèi)型啟用壓縮傳輸功能
- compression algo <algorithm> ...
啟用http協(xié)議的壓縮機(jī)制,指明壓縮算法gzip, deflate - compression type <mime type> ...
指明壓縮的MIME類(lèi)型
(九)errorfile, errorloc 自定義錯(cuò)誤頁(yè)
語(yǔ)法:errorfile <code> <file>
<code>:HTTP status code
支持200, 400, 403, 408, 500, 502, 503, 504.
<file>:錯(cuò)誤頁(yè)文件路徑語(yǔ)法:errorloc <code> <url>
相當(dāng)于errorloc302 <code> <url>咽筋,利用302重定向至指定URL
(十)修改報(bào)文首部
在請(qǐng)求報(bào)文尾部添加指定首部
reqadd <string> [{if | unless} <cond>]在響應(yīng)報(bào)文尾部添加指定首部
rspadd <string> [{if | unless} <cond>]從請(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ě)實(shí)驗(yàn)6:實(shí)現(xiàn)在請(qǐng)求報(bào)文添加指定首部"X-via"溶推,在響應(yīng)報(bào)文中添加指定首部"Y-via",在響應(yīng)報(bào)文中刪除服務(wù)器程序信息
// 配置haproxy服務(wù)
vim /etc/haproxy/haproxy.cfg
// 在frontend, listen, backend段中均可以設(shè)置
reqadd x-via:\ host_node1
rspadd y-via:\ host_node2
rspdel Server
systemctl restart haproxy
// 配置RS的httpd服務(wù)
vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{x-via}i\"" combined
CustomLog logs/access_log combined
service httpd restart
// 測(cè)試
tail -f /var/log/httpd/access_log // RS端執(zhí)行
curl -I 172.18.58.230 // 客戶端執(zhí)行
日志文件中顯示了添加的請(qǐng)求報(bào)文信息
響應(yīng)報(bào)文中顯示添加的信息,并且服務(wù)器程序信息被刪除
(十一)連接超時(shí)
timeout client <timeout>
客戶端最長(zhǎng)空閑連接超時(shí)時(shí)長(zhǎng)蒜危,默認(rèn)單位是毫秒timeout server <timeout>
后端服務(wù)器最長(zhǎng)空閑連接超時(shí)時(shí)長(zhǎng)timeout http-keep-alive <timeout>
持久連接的持久時(shí)長(zhǎng)timeout http-request <timeout>
一次完整的HTTP請(qǐng)求的最大等待時(shí)長(zhǎng)timeout connect <timeout>
成功連接后端服務(wù)器的最大等待時(shí)長(zhǎng)timeout client-fin <timeout>
客戶端半連接的空閑時(shí)長(zhǎng)timeout server-fin <timeout>
后端服務(wù)器半連接的空閑時(shí)長(zhǎng)
三虱痕、ACL配置:
訪問(wèn)控制列表(ACL)提供了一個(gè)靈活的解決方案來(lái)執(zhí)行內(nèi)容交換,通撤蓿基于從請(qǐng)求中提取的內(nèi)容部翘、響應(yīng)或任何環(huán)境狀態(tài)進(jìn)行決策
-
定義acl的語(yǔ)法:
acl <aclname> <criterion> [flags] [operator] [<value>] ...- aclname:ACL名稱(chēng),區(qū)分字符大小寫(xiě)
- criterion:比較的標(biāo)準(zhǔn)和條件
(一) value的類(lèi)型:
- boolean
- integer or integer range
- IP address / network
- string (exact, substring, suffix, prefix, subdir, domain)
- regular expression
- hex block
(二) flags的選項(xiàng)
- -i:不區(qū)分大小寫(xiě)
- -m:使用指定的pattern匹配方法
- -n:不做DNS解析
- -u:強(qiáng)制每個(gè)ACL必須唯一ID响委,否則多個(gè)同名ACL或關(guān)系
- --:強(qiáng)制flag結(jié)束. 當(dāng)字符串和某個(gè)flag相似時(shí)使用
(三)operator
匹配整數(shù)值:eq新思、ge、gt赘风、le夹囚、lt
匹配字符串:
-exact match (-m str)
字符串必須完全匹配模式
-substring match (-m sub)
在提取的字符串中查找模式,如果其中任何一個(gè)被發(fā)現(xiàn)邀窃,ACL將匹配
-prefix match (-m beg)
在提取的字符串首部中查找模式荸哟,如果其中任何一個(gè)被發(fā)現(xiàn),ACL將匹配
-suffix match (-m end)
將模式與提取字符串的尾部進(jìn)行比較蛔翅,如果其中任何一個(gè)匹配敲茄,則ACL進(jìn)行匹配
-subdir match (-m dir)
查看提取出來(lái)的用斜線分隔(“/”)的字符串位谋,如果其中任何一個(gè)匹配山析,則ACL進(jìn)行匹配
-domain match (-m dom)
查找提取的用點(diǎn)(“.”)分隔字符串,如果其中任何一個(gè)匹配掏父,則ACL進(jìn)行匹配
(四)criterion
條件
dst:目標(biāo)IP
dst_port:目標(biāo)PORT
src:源IP
src_port:源PORT邏輯關(guān)系
與:隱式(默認(rèn))使用
或:使用“or” 或“||”表示
否定:使用“!” 表示
(五)base string
匹配范圍:第一個(gè)主機(jī)頭和請(qǐng)求的路徑部分的連接(@<host>:<port>/<path>;<params>)笋轨,該請(qǐng)求從第一個(gè)斜杠開(kāi)始,并在問(wèn)號(hào)之前結(jié)束,對(duì)虛擬主機(jī)有用
匹配的操作符
base : exact string match
base_beg : prefix match
base_dir : subdir match
base_dom : domain match
base_end : suffix match
base_len : length match
base_reg : regex match
base_sub : substring match
(六)path string
匹配范圍:提取請(qǐng)求的URL路徑赊淑,該路徑從第一個(gè)斜杠開(kāi)始爵政,并在問(wèn)號(hào)之前結(jié)束(/<path>;<params>),無(wú)主機(jī)部分
匹配的操作符
path : exact string match
path_beg : prefix match
path_dir : subdir match
path_dom : domain match
path_end : suffix match
path_len : length match
path_reg : regex match
path_sub : substring match
(七)url string
匹配范圍:
提取請(qǐng)求中的URL陶缺。一個(gè)典型的應(yīng)用是具有預(yù)取能力的緩存钾挟,以及需要從數(shù)據(jù)庫(kù)聚合多個(gè)信息并將它們保存在緩存中的網(wǎng)頁(yè)門(mén)戶入口匹配的操作符
url:exact string match
url_beg:prefix match
url_dir:subdir match
url_dom:domain match
url_end:suffix match
url_len:length match
url_reg:regex match
url_sub:substring match
(八)hdr string
匹配范圍:提取在一個(gè)HTTP請(qǐng)求報(bào)文的首部
匹配的操作符
hdr([<name>[,<occ>]]) : exact string match
hdr_beg([<name>[,<occ>]]) : prefix match
hdr_dir([<name>[,<occ>]]) : subdir match
hdr_dom([<name>[,<occ>]]) : domain match
hdr_end([<name>[,<occ>]]) : suffix match
hdr_len([<name>[,<occ>]]) : length match
hdr_reg([<name>[,<occ>]]) : regex match
hdr_sub([<name>[,<occ>]]) : substring match
(九) status : integer
- 返回在響應(yīng)報(bào)文中的狀態(tài)碼
(十)預(yù)定義ACL
- TRUE:總是匹配
- FALSE:從不匹配
- HTTP:匹配HTTP協(xié)議
- LOCALHOST:匹配從localhost來(lái)的連接
- METH_CONNECT:匹配http connect 方法
(十一)ACL的使用
use_backend <backend> [{if | unless} <condition>]
當(dāng)基于ACL的條件匹配時(shí)切換指定backendblock { if | unless } <condition>
阻止匹配ACL條件的7層請(qǐng)求http-request { allow | deny | add-header <name> <fmt> |set-header <name> <fmt> } [ { if | unless } <condition> ]
對(duì)7層請(qǐng)求的訪問(wèn)控制實(shí)驗(yàn)7:實(shí)現(xiàn)基于haproxy的動(dòng)靜資源調(diào)度分離
實(shí)驗(yàn)要求:haproxy服務(wù)器(ip: 192.168.136.230)將靜態(tài)資源調(diào)度至RS1(ip: 192.168.136.229),將其他類(lèi)型的資源調(diào)度至RS2(ip: 192.168.136.129)和RS3(ip: 192.168.136.130)
// 配置haproxy
vim /etc/haproxy/haproxy.cfg
frontend web 172.18.58.230:80
acl url_static path_beg -i /images /javascript /static /stylesheets
acl url_static path_end -i .jpg .jpeg .png .gif .html .htm .js .css .txt
use_backend staticsrvs if url_static
default_backend appsrvs
backend staticsrvs
balance roundrobin
server websrv1 192.168.136.229:80 check
backend appsrvs
balance roundrobin
server websrv2 192.168.136.129:80 check
server websrv3 192.168.136.130:80 check
systemctl restart haproxy
// 配置RS1
mkdir /var/www/html/images
cp /usr/share/backgrounds/nature/FreshFlower.jpg /var/www/html/images/a.jpg
echo RS1 page > /var/www/html/index.html
yum -y install php
vim /var/www/html/index.php
node 1
<?php
phpinfo();
?>
service httpd restart
// 配置RS2
mkdir /var/www/html/images
cp /usr/share/backgrounds/nature/Wood.jpg /var/www/html/images/a.jpg
echo RS2 page > /var/www/html/index.html
yum -y install php
vim /var/www/html/index.php
node 2
<?php
phpinfo();
?>
service httpd restart
// 配置RS3
mkdir /var/www/html/images
cp /usr/share/backgrounds/night.jpg /var/www/html/images/a.jpg
echo RS3 page > /var/www/html/index.html
yum -y install php
vim /var/www/html/index.php
node 3
<?php
phpinfo();
?>
systemctl restart httpd
測(cè)試:在瀏覽器上測(cè)試饱岸,當(dāng)輸入http://172.18.58.230/images/a.jpg
掺出,無(wú)論如何強(qiáng)制刷新都是顯示RS1的鮮花照片;證明jpg靜態(tài)文件轉(zhuǎn)發(fā)至RS1
當(dāng)輸入http://172.18.58.230/index.html
苫费,無(wú)論如何強(qiáng)制刷新都是輸出RS1的網(wǎng)頁(yè)信息"RS1 page"汤锨;證明html靜態(tài)文件轉(zhuǎn)發(fā)至RS1
當(dāng)輸入http://172.18.58.230/index.php
,多次刷新交替出現(xiàn)RS2和RS3上的php文件信息百框;證明php動(dòng)態(tài)文件轉(zhuǎn)發(fā)至RS2和RS3
查看RS1的httpd日志文件闲礼,全部請(qǐng)求都是jpg文件和html文件,進(jìn)一步證實(shí)其接受調(diào)度過(guò)來(lái)的全部是靜態(tài)文件
查看RS2和RS3的httpd日志文件,全部請(qǐng)求都是phpl文件柬泽,進(jìn)一步證實(shí)其接受調(diào)度過(guò)來(lái)的全部是動(dòng)態(tài)文件
四慎菲、TCP轉(zhuǎn)發(fā):
tcp轉(zhuǎn)發(fā)與http轉(zhuǎn)發(fā)語(yǔ)法相似,但是需要在frontend, listen, backend中聲明為T(mén)CP模式:
mode tcp
實(shí)驗(yàn)8:實(shí)現(xiàn)mysql轉(zhuǎn)發(fā)
// 配置RS的mysql服務(wù)
yum -y install mysql-server
service mysqld start
mysql_secure_installation
mysql -uroot -pmagedu
mysql> create user test@'192.168.136.%' identified by 'centos';
// 配置haproxy
frontend mysql
bind 172.18.58.230:3306
mode tcp
default_backend mysqlsrvs
backend mysqlsrvs
mode tcp
balance roundrobin
server mysqlsrv1 192.168.136.229:3306 check
server mysqlsrv2 192.168.136.129:3306 check
systemctl restart haproxy
// 測(cè)試
yum -y install mariadb
mysql -utest -pcentos -h172.18.58.230
MySQL [(none)]> show variables like 'hostname';
通過(guò)查詢數(shù)據(jù)庫(kù)的hostname變量名聂抢,確認(rèn)轉(zhuǎn)發(fā)成功
五钧嘶、SSL轉(zhuǎn)發(fā):
支持ssl會(huì)話
bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
crt后證書(shū)文件為PEM格式,且同時(shí)包含證書(shū)和所有私鑰
合并證書(shū)和私鑰文件:
cat demo.crt demo.key > demo.pem把80端口的請(qǐng)求重定向至443
bind *:80
redirect scheme https if !{ ssl_fc }向后端傳遞用戶請(qǐng)求的協(xié)議和端口(frontend或backend)
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }實(shí)驗(yàn)9:配置HAProxy支持https協(xié)議琳疏,實(shí)現(xiàn)自動(dòng)將http連接跳轉(zhuǎn)至https
考慮到性能問(wèn)題有决,https連接轉(zhuǎn)發(fā)到內(nèi)網(wǎng)后采用http連接
// 配置haproxy
cd /etc/pki/tls/certs/
make /etc/haproxy/haproxy.pem // 生成密鑰和證書(shū)文件
vim /etc/haproxy/haproxy.cfg
frontend http
bind 172.18.58.230:80
bind 172.18.58.230:443 ssl crt /etc/haproxy/haproxy.pem
redirect scheme https if !{ ssl_fc } // 設(shè)置http連接自動(dòng)跳轉(zhuǎn)
http-request set-header X-Forwarded-Port %[dst_port] // 請(qǐng)求報(bào)文傳遞端口信息
http-request add-header X-forwarded-Proto https if { ssl_fc } // 請(qǐng)求報(bào)文傳遞協(xié)議信息
default_backend httpsrvs
backend httpsrvs
balance roundrobin
server httpsrv1 192.168.136.229:80 check
server httpsrv2 192.168.136.129:80 check
systemctl restart haproxy
// 配置RS
echo RS1 page > /var/www/html/index.html // RS1上設(shè)置
echo RS2 page > /var/www/html/index.html // RS2上設(shè)置
vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-Port}i\" \"%{X-Forwarded-Proto}i\"" combined
CustomLog logs/access_log combined
service httpd restart
// 測(cè)試
curl -k https://172.18.58.230 // 客戶端測(cè)試https連接轉(zhuǎn)發(fā)情況
curl -kL http://172.18.58.230 // 客戶端測(cè)試http連接是否成功跳轉(zhuǎn)https
tail -f /var/log/httpd/access_log // RS上查看日志是否收到傳遞的客戶端請(qǐng)求協(xié)議和端口信息
https連接轉(zhuǎn)發(fā)成功
http連接自動(dòng)跳轉(zhuǎn)為https連接,并且轉(zhuǎn)發(fā)成功
日志信息中顯示了客戶端請(qǐng)求的端口號(hào)和協(xié)議信息