1. 程式人生 > >Haproxy 基礎詳解及動靜分離配置

Haproxy 基礎詳解及動靜分離配置

haproxy 動靜分離

haproxy 介紹

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

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

haproxy特性

haproxy 當前版本為1.3 1.4,下面我們介紹1.4版本的特性

# 客戶端側的長連接(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.eu


haproxy 架構圖

技術分享圖片

haproxy.cfg 配置文件詳解

 安裝  
 # yum inistall haproxy -y
 配置文件路徑
 /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調整
調度方法的使用總結
#1、調度眾多的MySQL從服務器,用什麽調度方法?
   leastconn
#2、調度web圖片服務器組,用什麽調度方法?
   roundrobin
#3、調度web圖片服務器組,用什麽調度方法?
   source 或者 cookie
#4、調度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 /images  /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 動靜分離的實現


架構圖

技術分享圖片


1、 環境配置

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

2、 安裝配置haproxy

# yum install haproxy -y   安裝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

3、 客戶端測試

技術分享圖片

技術分享圖片

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

4、啟用全局日誌功能

(一)編輯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

技術分享圖片


接下來讓我們來拓展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

技術分享圖片

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


6、基於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

技術分享圖片

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


7、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路徑

技術分享圖片


8、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 /images /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) 客戶端測試 動靜分離

技術分享圖片

技術分享圖片

如圖所示:靜態頁面由server1服務器顯示,動態頁面由server2 顯示。

Haproxy 基礎詳解及動靜分離配置