haproxy的負載均衡功能、基於cookie的session持久、haproxy自帶的健康頁面及其動靜分離的實現

實驗前提:php

一、本次實驗是在RHEL 6.4(64bit)系統上完成的。css

二、實驗前確保每臺服務器同步html

三、本次實驗有3臺主機,其中haproxy做爲反向代理地址爲192.168.108.232,後面2臺的httpd服務器爲192.168.108.230192.168.108.231.(我這裏在虛擬機上使用的是橋接的方式,也可使用僅主機方式,不過使用僅主機方式haproxy上須要2快網卡)linux

四、測試時請關閉防火牆和selinuxnginx

 

實驗拓撲結構:web

 

wKioL1Ujk1Swy5BcAABQ4XgAQUQ005.jpg

 

 

 

安裝步驟:redis

一、配置web1算法

首先須要安裝httpd服務(須要事先配置好yum)vim

# yum -y install  httpd後端

 

而後修改httpd的根目錄下的index.html文件,修改內容以下:

# echo  「I am a web1,my ip is  192.168.108.230」  >  /var/www/html/index.html

 

啓動httpd服務

# service httpd start

 

二、配置web2

安裝httpd服務

# yum -y install  httpd

 

而後修改httpd的根目錄下的index.html文件,修改內容以下:

# echo  「I am a web1,my ip is  192.168.108.231」  >  /var/www/html/index.html

 

啓動httpd服務

# service httpd start

 

 

後端的2httpd服務配置完成以後最後測試一下,httpd是否能夠正常工做。若是能夠,則繼續下面的步驟。

 

 

三、配置haproxy

RHEL 6.4上面有自帶的RPM包,所以在這裏咱們直接使用RPM包的方式進行安裝。

# yum -y install haproxy

 

配置完成以後,而後在編輯其配置文件爲以下內容:

# vim /etc/haproxy/haproxy.cfg

global

    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

 

defaults

    mode                    http

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    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                 3000

 

frontend  first

    bind *:80

    mode http

    log global

    option httpclose

    option logasap

    capture  request header Host len 20

    capture  request header referer  len 60

    default_backend             webserver

 

 

backend webserver

    balance     roundrobin 採用加權輪調算法

    server      web1 192.168.108.230:80  check inter 1000 rise 1 fall 2  maxconn 2000

    server      web2 192.168.108.231:80  check inter 1000 rise 1 fall 2  maxconn 2000

 

 

 

 

四、測試負載均衡功能是否生效

訪問http://192.168.108.233,顯示結果爲:

wKiom1UjkPfgn1ghAADCglPtrt8002.jpg

 


而後在刷新該頁面,顯示結果爲:

wKiom1UjkQaQJF4SAACrdvwC1NQ354.jpg

 

因爲採用的是加權輪調算法,所以,每一個用戶請求都會均勻的分發給後端的服務器。

 

五、定義備份服務器

定義備份服務器的好處在於,當後端的全部服務器都不可用時,將啓動備份服務器,此時備份服務器一般不是用來提供服務的,而是返回一些提示信息給用戶,好比「網站正在維護中,請您稍好訪問...」等之類的信息。

在backend段中在添加一個server,而且在這個server後面加上參數backup便可。好比:

 backend webserver

                server localweb  127.0.0.1 backup


而後在本機上安裝httpd,並啓動該服務器。

# yum -y install httpd

echo "<h1>sorry,Site is weihu</h1>" > /var/www/html/index.html


而後啓動httpd服務便可

# service httpd start




六、定製日誌文件

haproxy的特性之一就是能夠將日誌文件定義到其餘服務器上。

在haproxy配置文件中,在global中添加以下信息,如:

globa 

        log 192.168.108.231 daemon info

說明:daemon必須是rsyslog系統上的標準facility之一。


global端配置完成以後,還須要在default段中添加log global等參數。如:

default 

        log global

        option httplog


而後重載haproxy服務

# service haproxy reload


此時,在配置文件定義完成以後,還須要在日誌服務器上(這裏爲192.168.108.231)的日誌服務配置文件添加以下信息:

# vim /etc/rsyslog.conf

daemon.*                                                /var/log/haproxy.log


此時重啓日誌系統服務

#  service rsyslog restart


測試訪問http://192.168.108.232,並查看日誌文件/var/log/haproxy.log中的日誌信息。其日誌內容大概爲以下信息:

Dec 25 09:54:38 www.xsl.com haproxy[2449]: 192.168.108.15:58371 [25/Dec/2015:09:54:38.691] first webserver/web1 5/0/1/1/7 200 286 - - ---- 2/2/0/1/0 0/0 "GET / HTTP/1.1"

Dec 25 09:54:38 www.xsl.com haproxy[2449]: 192.168.108.15:58371 [25/Dec/2015:09:54:38.699] first webserver/web2 19/0/1/2/22 404 472 - - ---- 2/2/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"


若是不加參數option httplog參數時,其日誌文件中的內容大概爲以下內容:

Dec 25 05:26:49 www.xsl.com haproxy[2312]: Connect from 192.168.106.15:65116 to 192.168.108.232:80 (first/HTTP)

Dec 25 05:26:49 www.xsl.com haproxy[2312]: Connect from 192.168.106.15:65117 to 192.168.108.232:80 (first/HTTP)


一般,若是將某日誌文件定義在一臺日誌服務器上時,咱們還應該在日誌文件中記錄是由哪臺服務器發送來的日誌信息,以便分析使用。在global段中添加log-send-hostname指令便可。如

global 

    log-send-hostname "director" (引號中的內容能夠自行定義,默認爲當前主機名)


定義完成以後,其日誌內容大概爲:

Dec 25 10:16:52 www.xsl.com "director" haproxy[2578]: 192.168.108.15:51016 [25/Dec/2015:10:16:52.110] first webserver/web2 814/0/1/1/816 404 472 - - ---- 1/1/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"

Dec 25 10:16:53 www.xsl.com "director" haproxy[2578]: 192.168.108.15:51016 [25/Dec/2015:10:16:52.927] first webserver/web1 127/0/1/1/129 404 472 - - ---- 1/1/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"


七、session保持機制

session保持方式通常說來有四種:

(1)、基於ip的綁定。這種方式不利用負載均衡,好比nat服務器後的全部用戶將會被調度到後端的同一個服務器上。lvs、nginx、haproxy均提供了此功能。

(2)、基於cookie綁定。這種作法可使得每一個用戶的請求被調度到不通的後端服務器,從而實現負載功能。而咱們的haproxy提供了此功能。

(3)、session集羣或session複製,這種作法會使得服務器資源消耗太大,而且集羣服務器之間的session信息相互複製,會增大網絡io。

(4)、使用一臺單獨的服務器做爲session服務器,當須要某個客戶端的session信息時,直接從這臺session服務器上獲取便可。可是這種作法須要爲session服務器提供高可用服務,不然session服務器故障了,則全部的session信息不可用。


在這裏只介紹如何使用cookie來實現會話保持功能

如在配置文件中添加以下內容:

backend  webserver

        balance roundrobin

        cookie SERVERID insert nocache

        server  web1 192.168.108.230:80 cookie websession1 check inter 10 fall 2 rise 1

        server  web2 192.168.108.231:80 cookie websession2 check inter 10 fall 2 rise 1


而後重載haproxy服務

# service haproxy reload


而後測試訪問http://192.168.108.232,第一次訪問時將會在響應報文中出現一個set-cookie的首部信息,其值爲相應後端服務器返回的value,這裏爲websession1。如:

wKiom1aOk4Pi3xlRAAAwIb9tYkg434.png

當用戶下一次請求時,請求報文中將會新增一個cookie首部,如:

wKioL1aOlB3Sh9NeAAA_7-ml-iI360.png




八、啓用統計報告功能,使用web界面來管理其haproxy的狀態鏈接等信息

須要在其配置文件中添加以下信息:

listen stats

        mode http

        bind *:8080

        stats enable

        stats  hide-version

        stats uri /haproxyadmin?stats

        stats realm  "hello\ proxy"

        stats auth  xsl:xsl

        stats admin if TRUE表示只有認證經過後才能夠管理其統計信息

 

建立認證用戶和密碼

# useradd  xsl

# passwd  xsl    (密碼也爲xsl

 

而後在重啓haproxy服務

# service haproxy restart

 

測試,在瀏覽器中輸入:http://192.168.108.232:8080/haproxyadmin?stats

顯示結果爲:

wKioL1Ujkl_hsPQEAAD-dB45GSY355.jpg

 

將用戶名xsl和密碼xsl輸入進去以後,顯示結果爲:

wKioL1aRFuyDmOW1AAGkluE7meo171.png


這個界面裏面包含了各類haproxy的狀態、鏈接、會發、宕機時長等信息。其中這些參數的意思以下:

Queue顯示的是一些隊列的參數

Cur:當前的隊列數

Max:最大隊列數

Limit:隊列的限制數

Session rate顯示的是與會話速率相關的參數

Cur:表示當前每秒的會話數,也是當前每秒的請求數。

Max:表示當前每秒最大的會話數。也是指的是最大併發數。

Limit:限制每秒的會話數。

Session顯示的是與會話統計相關的參數

Cur:當前的會話數

Max:某一時刻的最大會話總數

Limit:會話限制數

Total:總的鏈接數或者總的session數

Lbtot: total number of times a server was selected,從後端選擇一臺服務器所花的時間。

Last:表示上一次會話到如今所通過的時間。若是此參數太大了,表示該服務器一致處於空閒狀態。

Byte:顯示的請求和響應的字節數

In:表示進來的字節數

Out:表示出去的字節數

Denied:拒絕的字節數

Req:表示請求被拒絕的字節數

Resp:響應被拒絕的字節數

Error:表示與錯誤相關的參數

Req:表示錯誤的請求數

Conn:錯誤的鏈接數

Resp:錯誤的響應數

Warnings:與提示相關的參數

Retr:表示從新嘗試鏈接的次數

Redis:從新發送的次數

server:與服務器狀態相關的參數

status:顯示的後端服務器的狀態,及其由一種狀態轉換爲另外一種狀態的時間。服務器狀態只有up或down。

LastChk:表示是經過4層仍是經過7層方式來檢查後端服務器的健康情況。con表示鏈接被拒絕,所以,監測失敗。ok表示檢測成功。

Weight:後端服務器的權重

Act:是不是活動主機。Y表示yes。

Bct:是不是備份主機。

Chk:後端服務器的健康情況監測失敗的次數。

Dwn:後端服務器宕過的次數。

Dwntme:宕機的總時間


九、haproxy實現請求的動靜分離

一般,在一箇中上等規模的網站架構中,須要將靜態資源和動態資源分開進行處理。即靜態內容由一臺或多臺服務器進行處理;而動態內容由另外的一臺或多臺服務器進行處理。這樣靜態和動態內容實現分離響應。haproxy能夠利用acl來完成請求資源的動靜分離。

其架構設計以下:

wKioL1aSZB3QzVFCAAA-ab64Spk039.png

在這個圖中,全部靜態資源有static site站點處理,而全部的動態資源則由dynamic site站點處理。

其中haproxy的ip地址爲192.168.108.230

static site ip爲192.168.108.51

dynamic site ip爲192.168.108.52


動靜分離的配置以下:

frontend  webproxy *:8080

        acl url_static path_beg -i /static /img /p_w_picpaths /css

        acl url_static path_end -i .html .xml .css .txt .png .gif .js .gpg

        acl url_dynamic  path_end -i .php

        use_backend static  if url_static

        use_backend dynamic if url_dynamic

        default_backend static


backend static

        balance roundrobin

        option httpchk HEAD /test.html (定義7層檢測方法,默認是經過4層來檢測的)

        server static  192.168.108.51:80 check inter 5 fall 2 rise 1 weight 1 maxconn 2000


backend dynamic

        balance roundrobin

        option httpchk HEAD /test.html

        server dynamic 192.168.108.52:80 check inter 5 fall 2 rise 1 weight 1 maxconn 1000


在後端服務器192.168.108.51上,添加以下文件:

# echo "<h1>hello,static site<h1>"  > /var/www/html/index.html

# echo "This is the static site..." > /var/www/html/index.php

啓動httpd服務

# server httpd start


在後端服務器192.168.108.52上,添加以下文件:

# echo "<h1>hello,dynamic site<h1>"  > /var/www/html/index.html

# echo "This is the dynamic site..." > /var/www/html/index.php

啓動httpd服務

# server httpd start


訪問http://192.168.108.230:8080/index.html,訪問結果以下:

wKiom1aSZsvxnviyAABMRdokyUs241.png




訪問http://192.168.108.230:8080/index.php,訪問結果以下:

wKioL1aSZxPCCQarAABFK-zUKeA875.png 

至此,請求資源的動靜分離已經實現了。

相關文章
相關標籤/搜索