Haproxy學習總結

1、Haproxy介紹

一、實現了一種事件驅動,單一進程模型,支持數萬計的併發鏈接,用於爲tcp和http應用程序提供高可用,負載均衡和代理服務的解決方案,尤爲適用於高負載且須要持久鏈接或7層處理機制的web站點javascript

二、代理(http)做用: web緩存(加速)、反向代理、內容路由(根據流量及內容類型等將請求轉發至特定服務器)、轉碼器(將後端服務器的內容壓縮後傳輸給client端)-在代理服務器上添加Via首部;css

  • 正向代理:
  • 反向代理:

三、緩存的做用:減小冗餘內容傳輸,節省帶寬、緩解網絡瓶頸,下降了對原始服務器的請求壓力,下降了傳輸延遲html

四、負載均衡做用:支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機,特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理前端

五、負載均衡對比java

LVS:
一、抗負載能力強。抗負載能力強、性能高,能達到F5硬件的60%;對內存和cpu資源消耗比較低
二、工做在網絡4層,經過vrrp協議轉發(僅做分發之用),具體的流量由linux內核處理,所以沒有流量的產生。
二、穩定性、可靠性好,自身有完美的熱備方案;(如:LVS+Keepalived)
三、應用範圍比較廣,能夠對全部應用作負載均衡;
四、不支持正則處理,不能作動靜分離。
五、支持負載均衡算法:rr(輪循)、wrr(帶權輪循)、lc(最小鏈接)、wlc(權重最小鏈接)
六、配置 複雜,對網絡依賴比較大,穩定性很高。

Ngnix:
一、工做在網絡的7層之上,能夠針對http應用作一些分流的策略,好比針對域名、目錄結構;
二、Nginx對網絡的依賴比較小,理論上能ping通就就能進行負載功能;
三、Nginx安裝和配置比較簡單,測試起來比較方便;
四、也能夠承擔高的負載壓力且穩定,通常能支撐超過1萬次的併發;
五、對後端服務器的健康檢查,只支持經過端口來檢測,不支持經過url來檢測。
六、Nginx對請求的異步處理能夠幫助節點服務器減輕負載;
七、Nginx僅能支持http、https和Email協議,這樣就在適用範圍較小。
八、不支持Session的直接保持,但能經過ip_hash來解決。、對Big request header的支持不是很好,
九、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、Ip-hash(Ip哈希)
十、Nginx還能作Web服務器即Cache功能。

HAProxy的特色是:
一、支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機;
二、可以補充Nginx的一些缺點好比Session的保持,Cookie的引導等工做
三、支持url檢測後端的服務器出問題的檢測會有很好的幫助。
四、更多的負載均衡策略好比:動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash)已經實現
五、單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度。
六、HAProxy能夠對Mysql進行負載均衡,對後端的DB節點進行檢測和負載均衡。
九、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie)
十、不能作Web服務器即Cache。

2、Haproxy安裝

一、簡單的架構圖python

 二、環境(說明):mysql

HAProxy:192.168.1.157
web1:192.168.1.110
web2:192.168.1.184linux

三、安裝步驟web

(1)關閉Selinux和防火牆redis

(2)yum -y install haproxy

(3)主配置文件/etc/haproxy/haproxy.cfg---如下是負載的配置

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
 log 127.0.0.1 local2   ###[err warning info debug] 
 chroot /usr/local/haproxy
 pidfile /var/run/haproxy.pid ###haproxy的pid存放路徑,啓動進程的用戶必須有權限訪問此文件 
 maxconn 4000     ###最大鏈接數,默認4000
 user haproxy
 group haproxy
 daemon       ###建立1個進程進入deamon模式運行。此參數要求將運行模式設置爲"daemon"
  
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will 
# use if not designated in their block
#---------------------------------------------------------------------
defaults
 mode http    ###默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
 log global   ###採用全局定義的日誌
 option dontlognull  ###不記錄健康檢查的日誌信息
 option httpclose  ###每次請求完畢後主動關閉http通道 
 option httplog   ###日誌類別http日誌格式 
 option forwardfor  ###若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從Http Header中得到客戶端ip 
 option redispatch  ###serverId對應的服務器掛掉後,強制定向到其餘健康的服務器
 timeout connect 10000 #default 10 second timeout if a backend is not found
 timeout client 300000 ###客戶端鏈接超時
 timeout server 300000 ###服務器鏈接超時
 maxconn  60000  ###最大鏈接數
 retries  3   ###3次鏈接失敗就認爲服務不可用,也能夠經過後面設置 
####################################################################
#啓用haproxy的狀態監控頁配置以下 listen stats bind 0.0.0.0:1080 #監聽端口 stats refresh 30s #統計頁面自動刷新時間 stats uri /stats #統計頁面url stats realm Haproxy Manager #統計頁面密碼框上提示文本 stats auth admin:admin #統計頁面用戶名和密碼設置 #stats hide-version #隱藏統計頁面上HAProxy的版本信息 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main bind 0.0.0.0:80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js
#動態靜態頁面的分離 use_backend static if url_static ###知足策略要求,則響應策略定義的backend頁面 default_backend dynamic ###不知足則響應backend的默認頁面 #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- #靜態頁面服務器 backend static balance roundrobin ###負載均衡模式輪詢 server static 127.0.0.1:80 check ###後端服務器定義
#動態頁面服務器 backend dynamic balance roundrobin server websrv1 192.168.1.110:80 check maxconn 2000 server websrv2 192.168.1.184:80 check maxconn 2000 #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- #errorloc 503 http://www.osyunwei.com/404.html errorfile 403 /etc/haproxy/errorfiles/403.http errorfile 500 /etc/haproxy/errorfiles/500.http errorfile 502 /etc/haproxy/errorfiles/502.http errorfile 503 /etc/haproxy/errorfiles/503.http errorfile 504 /etc/haproxy/errorfiles/504.http

 (4)設置HAProxy日誌

vi /etc/syslog.conf #編輯,在最下邊增長
 
# haproxy.log
 
local2.*   /var/log/haproxy.log

  local2.*  定義haproxy的日誌記錄位置,service rsyslog restart 重啓日誌服務

   (5)啓用haproxy的狀態監控頁配置以下

####################################################################
listen stats
  bind 0.0.0.0:1080   #監聽端口 
  stats refresh 30s   #統計頁面自動刷新時間 
  stats uri /stats   #統計頁面url 
  stats realm Haproxy Manager #統計頁面密碼框上提示文本 
  stats auth admin:admin  #統計頁面用戶名和密碼設置 
  #stats hide-version   #隱藏統計頁面上HAProxy的版本信息
#---------------------------------------------------------------------

 (6)重啓並訪問

service haproxy start #啓動
 
service haproxy stop #關閉
 
service haproxy restart #重啓

 

3、配置的講解

   一、haproxy 配置中分紅五部份內容,分別以下:

    • global:參數是進程級的,一般是和操做系統相關。這些參數通常只設置一次,若是配置無誤,就不須要再次進行修改
    • defaults:配置默認參數,這些參數能夠被用到frontend,backend,Listen組件
    • frontend:接收請求的前端虛擬節點,Frontend能夠更加規則直接指定具體使用後端的backend
    • backend:後端服務集羣的配置,是真實服務器,一個Backend對應一個或者多個實體服務器
    • Listen Fronted和backend的組合體

  二、haproxy 經過acl功能根據http請求報文中的請求方法實現對後端不一樣服務器組的調度

read 定義acl的名字, method匹配請求報文中首部Request Method的值

 if write 若是匹配write這條acl 就使用tag_engine這個服務器組(if後面若是給了多個名字則要同時知足)

   三、動靜態頁面分離

 acl url_static path_beg -i /static /images /javascript /stylesheets
 acl url_static path_end -i .jpg .gif .png .css .js
  
#動態靜態頁面的分離
 use_backend static if url_static  ###知足策略要求,則響應策略定義的backend頁面
 default_backend dynamic   ###不知足則響應backend的默認頁面

 四、haproxy 負載均衡MySQL服務的配置示例

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
defaults
    mode                    tcp
    log                     global
    option                  httplog
    option                  dontlognull
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 600
listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE
frontend mysql
    bind *:3306
    mode tcp
    log global
    default_backend mysqlservers
backend mysqlservers
    balance leastconn
    server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
    server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

 五、反向代理的配置

       haproxy代理https有兩種方式:

1)haproxy服務器自己提供ssl證書,後面的web服務器走正常的http 
2)haproxy服務器自己只提供代理,後面的web服務器走https(配置ssl證書)

第一種方式:haproxy服務器自己提供ssl證書
注意:
須要編譯haproxy的時候支持ssl
編譯參數: 
#make TARGET=linux26 USE_OPENSSL=1 ADDLIB=-lz
#ldd haproxy | grep ssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007fb0485e5000)
配置參數(修改haproxy.cfg文件)

frontend https_frontend
   bind *:443 ssl crt /etc/ssl/certs/servername.pem
   mode http
   option httpclose
   option forwardfor
   reqadd X-Forwarded-Proto:\ https
   default_backend web_server

backend web_server
  mode http
  balance roundrobin
  cookie SERVERID insert indirect nocache
  server s1 192.168.1.150:80 check cookie s1
  server s2 192.168.1.151:80 check cookie s2
-----------------------------------------------------------
注意:這裏的pem 文件是下面兩個文件合併而成:
#cat servername.crt servername.key |tee servername.pem
-----------------------------------------------------------

 
第二種方式:haproxy服務器自己只提供代理,沒有ssl證書 (通常咱們經常使用的就是這種方式)
這種方式,haproxy不須要從新編譯支持ssl,簡單方便,只須要後面的web服務器配置好ssl便可。
配置參數(修改haproxy.cfg文件)


frontend https_frontend
  bind *:443
  mode tcp
  default_backend web_server

backend web_server
  mode tcp
balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server s1 192.168.1.150:443
  server s2 192.168.1.151:443
---------------------------------------------------------
注意,這種模式下mode 必須是tcp 模式

 五、正向向代理的配置

        配置文件幾乎跟反向代理差很少,修改下代理的ip的地址,前端爲內部地址,後端爲外部地址

   六、 acl <aclname> <criterion> [flags] [operator] <value> .

  #用法1、容許10.0.0.0/24的用戶訪問,其餘用戶將禁止  

acl  goodguys  src  10.0.0.0/24  
tcp-request content  accept  if  goodguys  
tcp-request  content  reject  
tcp-request content accept [{if | unless} <condition>]  
Accept a connection if/unless a content inspection condition is matched  

  #用法2、將源IP爲172.16.254.52的用戶禁止、將403的錯誤重定向到其餘服務器;  

acl  badguy  src  172.16.254.52  
block if badguy  
errorloc  403  http://www.afwing.com/  

  #用法3、當用戶訪問172.16.1.100時,重定向到http://www.afwing.com  

acl  dstipaddr  hdr(Host) 172.16.1.100  
redirect  location   http://www.afwing.com if  dstipaddr  

 #用法4、限制某個IP訪問的路徑(文件) 

acl  badguy  src  172.16.254.52  
acl  denyfile  path  /index.html  
http-request deny if denyfile  badguy  

#用法5、讀寫、動靜分離(見上面)

 

參考文獻

https://www.cnblogs.com/linuxboke/p/5425914.html

http://www.jb51.net/article/101996.htm

相關文章
相關標籤/搜索