haproxy實現反向代理和負載均衡

反向代理服務器功能:web緩存(加速)、反向代理、內容路由(根據流量及內容類型等將請求轉發至特定服務器)、轉碼器

緩存:減少冗餘內容傳輸;節省帶寬、緩解網絡瓶頸;降低了對原始服務器的請求壓力;降低了傳輸延遲,公共緩存每個人都可以使用,帶有敏感數據的私有緩存則只對限定某類或某個人使用

nginx可實現緩存功能,haproxy不能實現緩存功能,這裏只說明其反向代理功能和負載均衡功能

yum install haproxy
主配置文件haproxy.cfg
開啓日誌功能:
編輯/etc/rsyslog.conf文件
$ModLoad imudp
$UDPServerRun 514  #開啓udp514端口
local2.*                                                /var/log/haproxy.log
編輯/etc/haproxy/haproxy.cfg文件:
log         127.0.0.1 local2

配置負載均衡後端主機:
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000  定義面向客戶端的總的最大連接數(面向客戶端那一面)
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80  #第一種方式
#        bind *:80    #第二種方式
#        bind *:8080    #只能用於frontend, listen; 
#        maxconn  也可以定義在這裏或listen後,定義了單個實例的最大併發連接數,如果在global段定義就是所有實例總的
   default_backend             websrvs
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend websrvs
    balance     roundrobin
    server  web1 192.168.20.7:80 check #定義的名字web1會被加到請求首部發到後端,當後端有虛擬主機時很有用
    server  web2 192.168.20.8:80 check

幾種調度算法:

balance: 指明調度算法;
    動態:權重可動態調整
    靜態:調整權重不會實時生效
        roundrobin: 輪詢,動態算法,每個後端主機最多支持4128個連接;
        static-rr: 輪詢,靜態算法,每個後端主機支持的數量無上限;
        leastconn: 根據後端主機的負載數量進行調度;僅適用長連接的會話;動態;
hash-type:
    map-based:取模法;靜態;
    consistent:一致性哈希法;動態;

下面的四種調度算法都基於上面的兩種hash-type

        source:
        uri:對uri的左半部分(?標記之前的部分)或者整個uri做hash,除以後端服務器總權重後綁定到後端服務器
        url_param: 根據url中的指定的參數的值進行調度;把值做hash計算,併除以總權重;
        hdr(<name>)    :根據請求報文中指定的header(如use_agent, referer, hostname)進行調度;把指定的header的值做hash計算得值除以總權重;
示例:

backend websrvs
    balance     hdr(User-Agent)
    hash-type consistent
    server  web1 192.168.20.7:80 check
    server  web2 192.168.20.8:80 check

測試:

wKioL1Y4epeRl-WVAACLgXcUsIs267.jpg

mode: 健康狀態檢測時基於何種協議
    HAProxy的工作模式;默認爲tcp;有三種:tcp, http, health

    只有客戶端和前端,後端都是用http通信纔可以使用http模式

在front段也可以指定log:

frontend  main *:80 
    log global
     log         127.0.0.2 local3

使用use_backend 和acl定義後段

use_backend     dynamic  if  url_dyn
use_backend     static   if  url_css url_img extension_img

server段後可加的參數:

backup:設定爲備用服務器,僅在負載均衡場景中的其它server均不可用於啓用此server;
check:啓動對此server執行健康狀態檢查,其可以藉助於額外的其它參數完成更精細的設定,如:
  inter <delay>:設定健康狀態檢查的時間間隔,單位爲毫秒,默認爲2000;也可以使用fastinter和downinter來根據服務器端狀態優化此時間延遲;
  rise <count>:設定健康狀態檢查中,某離線的server從離線狀態轉換至正常狀態需要成功檢查的次數;
  fall <count>:確認server從正常狀態轉換爲不可用狀態需要檢查的次數;
cookie <value>:爲指定server設定cookie值,此處指定的值將在請求入站時被檢查,第一次爲此值挑選的server將在後續的請求中被選中,其目的在於實現持久連接的功能;
maxconn <maxconn>:指定此服務器接受的最大併發連接數;如果發往此服務器的連接數目高於此處指定的值,其將被放置於請求隊列,以等待其它連接被釋放;
maxqueue <maxqueue>:設定請求隊列的最大長度;
observe <mode>:通過觀察服務器的通信狀況來判定其健康狀態,默認爲禁用,其支持的類型有“layer4”和“layer7”,“layer7”僅能用於http代理場景;
redir <prefix>:啓用重定向功能,將發往此服務器的GET和HEAD請求均以302狀態碼響應;需要注意的是,在prefix後面不能使用/,且不能使用相對地址,以免造成循環;例如:
  server srv1 172.16.100.6:80 redir http://p_w_picpathserver.magedu.com check
weight <weight>:權重,默認爲1,最大值爲256,0表示不參與負載均衡;

定義健康檢查方式可以使用option:

option httpchk
option httpchk <uri>
option httpchk <method> <uri>  
例如:
backend https_relay
    mode tcp
    option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.lee123.com
    server apache1 192.168.1.1:443 check port 80
使用案例:
server first  172.16.100.7:1080 cookie first  check inter 1000
server second 172.16.100.8:1080 cookie second check inter 1000

基於瀏覽器cookie實現session sticky:

要點:
(1) 每個server有自己惟一的cookie標識;
(2) 在backend中定義爲用戶請求調度完成後操縱其cookie
backend websrvs
    balance     roundrobin
    cookie SERVERID insert nocache indirect
    server  web1 192.168.20.7:80 check cookie websrv1
    server  web2 192.168.20.8:80 check cookie websrv2

測試:注意到cookie頭部的websrv1關鍵字了麼?

wKioL1Y4qbmzOZf2AAIwdL1Eqd0065.jpg

開啓統計頁面:

listen statistics
        bind *:9090
        stats enable
        stats hide-version
        #stats scope .
        stats uri /haproxyadmin?stats
        stats realm "HAPorxy\ Statistics"
        stats auth admin:mageedu
        stats admin if TRUE

wKiom1Y4rQLD9KOkAAViXWw2_QI398.jpg

向日志中記錄額外信息:
    capture request header
    capture response header

當mode爲http時,記錄豐富的日誌信息:
    option httplog----默認是開啓的

錯誤頁面重定向:
    errorfile: 使用haproxy主機本地文件進行響應;
    errorloc, errorloc302: 使用指定的url進行響應,響應狀態碼爲302;不適用於GET以外的其它請求方法;
    errorloc303:返回303狀態碼;

添加請求或響應報文首部:
    reqadd
    rspadd

frontend  main
        bind *:80
        bind *:8080
    rspadd  Via:\ node1.lee.com
    default_backend             websrvs

出現了Via:

wKiom1Y4vFPgmX6qAAIDhluDxZE046.jpg

動靜分離的示例:
frontend  main
    bind *:80
    bind *:8080
    acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js

    use_backend static          if url_static
    default_backend             appsrvs

#---------------------------------------------------------------------
# static backend for serving up p_w_picpaths, stylesheets and such
#---------------------------------------------------------------------
    backend static
       balance roundrobin
       server static1 192.168.20.7 check
       server static2 192.168.20.8 check

    backend appsrvs
       balance     roundrobin
       option forwardfor except 127.0.0.1 header X-Client
       option httpchk
       cookie SERVERID insert indirect nocache
       server  web1 192.168.20.7:80 check cookie web1
       server  web2 192.168.20.8:80 check cookie web2


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章