20171101 HAProxy

  • 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
  • 性能調(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之間

(二)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>)
(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)為3

  • cookie <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 page

  • stats uri<prefix>
    自定義stats page uri,默認(rèn)為/haproxy?statsuri

  • stats auth<user>:<passwd>
    認(rèn)證時(shí)的賬號(hào)和密碼钓株,可使用多次

  • stats realm <realm>
    認(rèn)證時(shí)的realm

  • stats 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í)切換指定backend

  • block { 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é)議信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末空盼,一起剝皮案震驚了整個(gè)濱河市书幕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揽趾,老刑警劉巖台汇,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異篱瞎,居然都是意外死亡苟呐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)俐筋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牵素,“玉大人,你說(shuō)我怎么就攤上這事澄者“蚀簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵粱挡,是天一觀的道長(zhǎng)赠幕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)询筏,這世上最難降的妖魔是什么榕堰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮嫌套,結(jié)果婚禮上逆屡,老公的妹妹穿的比我還像新娘。我一直安慰自己灌危,他們只是感情好康二,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著勇蝙,像睡著了一般沫勿。 火紅的嫁衣襯著肌膚如雪挨约。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天产雹,我揣著相機(jī)與錄音诫惭,去河邊找鬼。 笑死蔓挖,一個(gè)胖子當(dāng)著我的面吹牛夕土,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘟判,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼怨绣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拷获?” 一聲冷哼從身側(cè)響起篮撑,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匆瓜,沒(méi)想到半個(gè)月后赢笨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驮吱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年茧妒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片左冬。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桐筏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出又碌,到底是詐尸還是另有隱情九昧,我是刑警寧澤绊袋,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布毕匀,位于F島的核電站,受9級(jí)特大地震影響癌别,放射性物質(zhì)發(fā)生泄漏皂岔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一展姐、第九天 我趴在偏房一處隱蔽的房頂上張望躁垛。 院中可真熱鬧,春花似錦圾笨、人聲如沸教馆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)土铺。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悲敷,已是汗流浹背究恤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留后德,地道東北人部宿。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓢湃,于是被迫代替她去往敵國(guó)和親理张。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 互聯(lián)網(wǎng)架構(gòu)基礎(chǔ)知識(shí) 一绵患、網(wǎng)站常見(jiàn)架構(gòu) 負(fù)載層 頁(yè)面緩存層 web層 數(shù)據(jù)層 二涯穷、運(yùn)維法則 緩存為王 盡量在前端(緩...
    魏鎮(zhèn)坪閱讀 4,788評(píng)論 0 9
  • 一.HAProxy介紹 HAProxy: 是法國(guó)人Willy Tarreau開(kāi)發(fā)的一個(gè)開(kāi)源軟件,是 一款應(yīng)對(duì)客戶端...
    楠人幫閱讀 1,096評(píng)論 0 2
  • Haproxy是既可以工作在7層也能工作在4層的反代工具.Haproxy的功能: 路由HTTP請(qǐng)求到后端服務(wù)器,基...
    uangianlap閱讀 1,536評(píng)論 0 1
  • 1、HAProxy簡(jiǎn)介 HAProxy 是一款高性能TCP/HTTP 反向代理負(fù)載均衡服務(wù)器掘殴,具有如下功能: 根據(jù)...
    貳零壹柒_fc10閱讀 2,008評(píng)論 0 0
  • 這又是美好的一周奏寨,每天清晨起意,陽(yáng)光照在臉上,呼吸著清新的空氣病瞳,我就覺(jué)得美妙無(wú)比揽咕。 這周,我的補(bǔ)習(xí)班有的已經(jīng)完了套菜,...
    百合花張博涵閱讀 222評(píng)論 0 0