2017 10-31 haproxy的應(yīng)用

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

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

  • 1 基于LVS-NAT的設(shè)計(jì):實(shí)現(xiàn)nat模式的lvs實(shí)驗(yàn) 搭建環(huán)境:先將各主機(jī)的防火墻策略和selinux關(guān)閉,打...
    楠人幫閱讀 1,282評論 0 0
  • 互聯(lián)網(wǎng)架構(gòu)基礎(chǔ)知識 一、網(wǎng)站常見架構(gòu) 負(fù)載層 頁面緩存層 web層 數(shù)據(jù)層 二、運(yùn)維法則 緩存為王 盡量在前端(緩...
    魏鎮(zhèn)坪閱讀 5,033評論 0 9
  • 1、HAProxy功能 HAProxy是TCP / HTTP反向代理服務(wù)器,尤其適合于高可用性環(huán)境可以針對HTTP...
    張大志的博客閱讀 1,056評論 0 0
  • 一.keepalived介紹 1.keepalived的功能 實(shí)現(xiàn)集群服務(wù)的高可用性(HA),在實(shí)際工作中當(dāng)lvs...
    楠人幫閱讀 628評論 0 1
  • 本文是《圖解HTTP》讀書筆記的第二篇,主要包括此書的第六章內(nèi)容,因?yàn)榈诹碌膬?nèi)容較多,而且比較重要,所以單獨(dú)寫為...
    lijiankun24閱讀 1,502評論 0 6

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