haproxy 基礎詳解 及 動靜分離的實現

haproxy 介紹javascript


 1 工做在ISO 七層 根據http協議(或者工做在ISO四層 根據tcp協議) 提供web服務的負載均衡調度器php

   

負載均衡調度器分類
工做在四層:
#  lvs
工做在七層:
#  nginx   (web,http reverse proxy,cache)
#  haproxy (http reverse proxy,tcp proxy)
#     tcp:  實現MySQL的讀寫中讀的負載均衡
#  ats     (apache traffic  server)
#  perlbal
#  pound
#  squid
#  varnish
  以上程序均可以實現服務的向外拓展;

   

haproxy特性css


    haproxy 當前版本爲1.3  1.4,下面咱們介紹1.4版本的特性html

 

# 客戶端側的長鏈接(client-side keep-alive)
# TCP加速(TCP speedups)
#  響應池(response buffering)
#  RDP協議
#  基於源的粘性(source-based stickiness)
#  更好的統計數據接口(a much better stats interfaces)
#  更詳細的健康狀態檢測機制(more verbose health checks)
#  基於流量的健康評估機制(traffic-based health)
#  支持HTTP認證
#  服務器管理命令行接口(server management from the CLI)
#  基於ACL的持久性(ACL-based persistence)
#  日誌分析器

     

  官網站點:haproxy.1wt.eujava


haproxy 架構圖node


   wKioL1Np5h_i9MFbAADhowCMXv8632.jpg  


haproxy.cfg 配置文件詳解mysql


   安裝  linux

   #yum -y inistall haproxynginx

   配置文件路徑 git

   /etc/haproxy/haproxy.cfg

   

(1)配置由兩部分組成
 #global settings: 對haproxy進程自身屬性的設定----------全局設定段
 #proxies: 對代理的設定 -----------------代理設定段
  defaults
  frontend
  backend 
  listen 
  其中defaults爲proxies提供默認屬性,frontend接受客戶端的請求,backend鏈接後端的上游服務器(相似於nginx的upstream),listen是特定的frontend與backend的組合 
(2)定義一個完整的代理的方式:
  frontend
  backend
  listen
(3)defaults段分析
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
#  option   httpclose:使用短鏈接
#  option   redispath:使用cookie保持會話,若是後端的server宕機,則使用redispath 重定向另外一個路徑繼續保持會話;
#  option   http-server-close  :當keep-alive超時時,使用該選項在服務器上關閉會話    
#  timeout  connect  :haproxy轉發到後邊upstream server 時等待的時長
#  timeout  client   :客戶端非活動狀態的超時時長
#  timeout  server   :  haproxy和後邊的服務器段保持一個會話,當後臺服務器down掉後,haproxy等待的超時時間
#  timeout-keep-alive:定義保持鏈接模式的超時時長       
#  timeout-check     : 創建狀態檢測時間的超時時間
#  maxconn           :每個server最大併發鏈接數
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

   

       

負載均衡調度方法


   

格式:balance  roundrobin| static-rr| leastconn | source | uri | uri_param | hdr(<name>) | rdp-cookie(name)

     

 

調度方法解析
#roundrobin :屬於加權輪詢 (動態)  支持服務器活動時修改其權重,服務器下線後從新上線時支持慢啓動
#static-rr :  屬於加權輪詢(靜態)不支持服務器活動時修改,須要重啓服務才能生效
#             老服務器從新上線上時,馬上會收到大批量的請求
#leastconn :支持動態修改權重,慢啓動
#source    :默認爲(靜態)方法,hash/ 源ip 取模算法,支持hash-type調整爲動態
#uri       :默認爲(靜態)方法,hash/weight 取模算法,支持hash-type來調整 
#url-params:默認爲(靜態)方法,hash/wgith 算法,支持hash-type調整
#hdr (<name>):默認爲靜態方法, 先對<name>作hash計算而後 hash/weight 計算,支持hash-type調整

 

   

調度方法的使用總結
#一、調度衆多的MySQL從服務器,用什麼調度方法?
   leastconn
#二、調度web圖片服務器組,用什麼調度方法?
   roundrobin
#三、調度web圖片服務器組,用什麼調度方法?
   source 或者 cookie
#四、調度web緩存服務器組,用什麼調度方法?
   uri
    hash-type:
      map-based (默認的靜態的hash表)
      consistent(動態的一致性hash) ---------在後端的cache服務器上使用,不然會致使服務器的加入或者退出時 服務器羣癱瘓



haproxy 的工做模式 (使用mode參數)

 

   

http :http協議  --------haproxy的價值體現於此
#      對應用層數據作深刻分析,所以支持7層的過濾、處理、轉換等機制;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
tcp  :haproxy在客戶端和upstream server之間創建一個全雙工的鏈接
#      不會對應用層協議作任何檢查
#      SSL 、MySQL、SSL等都應該使用此模式;
#      默認模式!



指定haproxy日誌

# log global : 使用全局配置中定義的日誌服務器;
# log <address> <facility> [<level>  [<minlevel>]]
# capture request header <HEADER>  len <LENGTH>
# capture resopense header <HEADER>  len <LENGTH>
實例:在frontend中定義一個日誌
(1)編輯rsyslog.conf
#vim  /etc/rsyslog.conf  在日誌服務器上先定義一個日誌
 local3.*    /var/log/hawebsrv.log
#service rsyslog restart
(2)編輯haproxy.cfg
 #vim /etc/haproxy/haproxy.cfg
  frontend websrv
  log 127.0.0.1 local3
  bind *:80
  default_backend  webservers
 #serivce  haproxy reload
(3)haproxy服務器測試
  #tail /var/log/hawebsrv.log

 

haproxy中的ACL

 

 

格式:acl <aclname>  <criterion> [flags] [oprator] <value>     
                                                                                                                                                                                                                                                                                                                                                                 
      value:   支持整數或者整數範圍
                支持字符串
                支持正則表達式
                支持ip地址和網絡地址


ACL例子
# acl url_static  path_beg  /static /p_w_picpaths  /img /css                 
# acl url_static  path_end  .gif  .png  .jpg  .css .js
# acl host_www    hdr_beg(host) -i  www          
# acl  host_static  hdr_beg(host) -i  img. video. download. ftp.   
# use_backend   static  if  host_static  or host_www or url_static
# use_backend   www  if  host_www

         

   

實現訪問控制      
http-request:7層過濾   (藉助於定義好的acl實現)
tcp-request: 4層過濾    (藉助於定義好的acl實現)

         

haproxy 動靜分離的實現


  架構圖

               

      wKioL1Np89Oik9d1AACXrXOJQ0o808.jpg

 一、 環境配置

         

haproxy服務器配置
 外網網卡
#ifconfig eth0 172.16.13.2/16 up
#route add default gw 172.16.0.1
 內網網卡
#ifconfig eth1 192.168.20.1/24 up
兩臺上游服務器配置
server1 配置
#ifconfig eth0 192.168.20.11/24
#route add default gw 192.168.20.1
 提供頁面
#vim /var/www/html/index.html
 <h1>node1.linux.com</h1>
#service httpd start
server2配置
#ifconfig eth0 192.168.20.12/24 up
#route add default gw 192.168.20.1
 提供頁面
#vim  /var/www/html/index.html
  <h1>node2.linux.com<h1>
#service  httpd start


  二、  安裝配置haproxy

     

# yum -y install haproxy  安裝haproxy
#vim /etc/haproxy/haproxy.cfg  編輯配置文件自定義一個backend和frontend,註釋原有的內容
frontend  websrv *:80         
  default_backend   webservers
backend   webservers
  balance   roundrobin
  server     node1  192.168.20.11:80  check
  server     node2   192.168.20.12:80   check 

       

  三、 客戶端測試


   wKioL1Np9u2halzkAABm4VsD7kk102.jpg

   wKioL1Np9vmQcAb_AABeMbu8jjs173.jpg    

    此時說明 haproxy服務器將客戶的請求以roundrobin算法 反向代理給後端的服務器!

   

   四、啓用全局日誌功能

   

(一)編輯rsyslog.conf
#vim  /etc/rsyslog.conf  開啓以下行
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
添加日誌
local2.*           /var/log/haproxy.log
                                                                                                                                                                                                                                 
#service rsyslog restart 重啓服務
(二)編輯haproxy.cfg
 # vim  /etc/haproxy/haproxy.cfg 開啓以下行
  log         127.0.0.1 local2
 # service  haproxy restart  重啓服務
(三)日誌查看
 #tail -f /var/log/haproxy.log

     wKioL1Np-FvBb0ZpAAHBwD1gOvw836.jpg

     

   接下來讓咱們來拓展haproxy的功能


   5 、調度算法 uri的實現


     

1)後端服務器 server1 與 server2 同時建立多個頁面
server1
#cd /var/www/html/
# for i in {1..10}; do echo "<h1>node1.test$i</h1>"  >  test$i.html; done 
server2 方法同server1
 2)更改haproxy.cfg的配置文件中的調度算法
  balance uri
 3)客戶端測試
# http://172.16.13.2/test1.html


   wKiom1Np-0KQ9ElkAABm9L9x-ZY858.jpg

   基於172.16.13.2/test1.html 該uri,haproxy服務器反向代理至後臺服務器至同一臺服務器server2


  六、基於cookie實現會話綁定


   

1)編輯haproxy.cfg配置文件
#vim  /etc/haproxy/haproxy.cfg  內容以下
frontend websrv
   bind *:80
   default_backend  webservers
backend  webservers
   cookie node insert nocache
   balance roundrobin
   server  node1  192.168.20.11:80 check  cookie node1
   server  node2  192.168.20.12:80 check  cookie node2
2)客戶端測試
#http://172.16.13.2/test1.html


    wKiom1Np_WqxQWcTAAI6ilXivxo518.jpg

       上圖可見,基於cookie實現了客戶端的請求與後端服務器server2的會話綁定

   

     

    七、haproxy管理界面---stats enable


       

#vim /etc/haproxy/haproxy.cfg 增長一個listen段,以下所示
listen statspage
   bind *:8009    -------偵聽端口
   stats enable   -------開啓stats
   stats hide-version -----隱藏版本
   stats auth admin:admin ----登陸驗證信息
   stats admin if TRUE    ----實如今管理界面上對全部backend服務器管理
   stats uri /admin?stats ----登陸的uri路徑


   wKiom1Np_4yADwYaAAedNz5EvyU391.jpg


     八、haproxy動靜分離的實現


     

1)server2 服務器安裝php 
#yum -y install php php-mysql
提供php動態頁面
#vim /var/www/html/index.php
<h1>node2.linux.com</h1>
<?php
     phpinfo();
?>
                                        
2)從新配置haproxy配置文件
#vim  /etc/haproxy/haproxy.cfg   定義frontend  和 backend 
frontend websrvs
    bind *:80
    acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js .html
    acl host_static      hdr_beg(host)  -i img. video. download. ftp. imags. videos.
    acl url_php          path_end       -i .php
    use_backend static          if url_static or host_static
    use_backend dynamic         if url_php
    default_backend             dynamic
         backend static
    balance     roundrobin
    server      node1 192.168.20.11:80  check maxconn 30000    
                                                  
         backend dynamic
    balance     roundrobin
    server  node2 192.168.20.12:80 check maxconn  1000 
# service haproxy restart
3) 客戶端測試 動靜分離



     wKioL1NqALODh5OIAACFP2QLgmk328.jpg

     wKioL1NqAMzBbvqRAAKEJyRnEEo275.jpg

    如圖所示:靜態頁面代理至server1服務器,動態頁面代理至server2 服務器,實現  

   


PS: 我的水平有限,不足之處請指出。關於更多信息請參考haproxy官方網站。

相關文章
相關標籤/搜索