實驗前提:php
一、本次實驗是在RHEL 6.4(64bit)系統上完成的。css
二、實驗前確保每臺服務器同步html
三、本次實驗有3臺主機,其中haproxy做爲反向代理地址爲192.168.108.232,後面2臺的httpd服務器爲192.168.108.230和192.168.108.231.(我這裏在虛擬機上使用的是橋接的方式,也可使用僅主機方式,不過使用僅主機方式haproxy上須要2快網卡)linux
四、測試時請關閉防火牆和selinuxnginx
實驗拓撲結構:web
安裝步驟: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
後端的2個httpd服務配置完成以後最後測試一下,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,顯示結果爲:
而後在刷新該頁面,顯示結果爲:
因爲採用的是加權輪調算法,所以,每一個用戶請求都會均勻的分發給後端的服務器。
五、定義備份服務器
定義備份服務器的好處在於,當後端的全部服務器都不可用時,將啓動備份服務器,此時備份服務器一般不是用來提供服務的,而是返回一些提示信息給用戶,好比「網站正在維護中,請您稍好訪問...」等之類的信息。
在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。如:
當用戶下一次請求時,請求報文中將會新增一個cookie首部,如:
八、啓用統計報告功能,使用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
顯示結果爲:
將用戶名xsl和密碼xsl輸入進去以後,顯示結果爲:
這個界面裏面包含了各類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來完成請求資源的動靜分離。
其架構設計以下:
在這個圖中,全部靜態資源有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,訪問結果以下:
訪問http://192.168.108.230:8080/index.php,訪問結果以下:
至此,請求資源的動靜分離已經實現了。