何謂代理?
所謂的代理一般分為兩種,即正向代理和反向代理。正向代理可以實作讓不同的主機通過代理伺服器使用同一個位址和Internet上的其他主機通信,通常在一個區域網路内隻有一個公網IP時都需要用到正向代理,而反向代理則實作的是将來自不同主機的請求發送給後端的其他伺服器就行處理,而自己不負責具體如何去處理。
HAProxy介紹
HAProxy是一款基于Linux平台且開源的反向代理實作軟體,同時支援虛拟主機,可以提供高可用性、負載均衡以及基于TCP和HTTP應用的代理。HAProxy特别适用于負載特别大的web站點,這些站點通常又需要回話保持或七層處理。HAProxy運作在目前的硬體上,完全可以支援數萬計的并發連接配接。
并且它的運作模式使得它可以很簡單安全的整合進您目前的架構中, 同時可以保護你的web伺服器不被暴露到網絡上。
HAProxy實作了一種事件驅動, 單一程序模型,此模型支援非常大的并發連接配接數。多程序或多線程模型受記憶體限制 、系統排程器限制以及無處不在的鎖限制,很少能處理數千并發連接配接。事件驅動模型因為在有更好的資源和時間管理的使用者空間(User-Space) 實作所有這些任務,是以沒有這些問題。此模型的弊端是,在多核系統上,這些程式通常擴充性較差。這就是為什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。
HAProxy實作反向代理的一些配置執行個體
接下來将通過配置HAProxy的形式介紹HAProxy的配置。
實驗位址規劃
主機 | IP | 用途 |
A | 192.168.2.240/24 | 安裝HAProxy |
B | 192.168.2.241/24 | 安裝HTTPD |
192.168.2.242/24 |
準備工作:
在主機A上安裝好HAProxy,主機B上安裝好HTTPD,
配置好yum源後可直接使用yum安裝,并為主機B配置兩個位址,在此就不再贅述
例1:将來自用戶端的請求反向代理至後端兩個不同的web-server
(1)配置虛拟主機
注釋主配置檔案/etc/http/conf/httpd.conf中的DocumentRoot項,然後在/etc/http/conf.d/中建立檔案virtual.conf檔案,并添加如下内容
<VirtualHost 192.168.2.241:80>
DocumentRoot /var/www/test1
ServerName www.test1.com
</VirtualHost>
<VirtualHost 192.168.2.242:80>
DocumentRoot /var/www/test2
ServerName www.test2.com
建立虛拟主機目錄,并提供虛拟主機首頁面檔案
[root@localhost ~]# mkdir /var/www/test1
[root@localhost ~]# mkdir /var/www/test2
[root@localhost ~]# echo "this is test1" >/var/www/test1/index.html
[root@localhost ~]# echo "this is test2" >/var/www/test2/index.html
(2)配置主機A,編輯HAProxy主配置檔案如下
frontend testservers *:80
use_backend web1
backend web1
balance roundrobin
server web1 192.168.2.241:80
server web2 192.168.2.242:80
注釋:配置項說明
frontend :用于定義前端監聽的套接字,使用者通路伺服器時就是通過這些套接字與伺服器通信
use_backend:指定使用哪個後端作為響應,通常後端會通過backend來配置一個或者一組伺服器,用來響應前端代理過來的請求
backend:定義後端一系列伺服器,通常可以通過名字引用,目前端的frontend接收進請求後就會把用戶端的請求發給響應的backend
balance:指定排程算法,排程算法有以下幾類
roundrobin:和lvs中的rr類似,不過該排程算法可在server後面加上相應的權重,加上權重後則成為基于權重的輪詢排程算法,類似于wrr
static-rr:該算法和roundrobin一樣,可基于權重做輪詢,但是roundrobin是動态排程算法,可動态更新伺服器的權重,并實時應用,而static-rr則是靜态的,不會實時應用伺服器權重。
leastconn:最少連接配接排程算法,該算法會把用戶端的請求發給後端負載最小的伺服器,該算法是動态算法,會實時根據每台伺服器權重進行計算,然後動态判斷請求的去向。
source:該算法根會據請求的源位址進行hash計算的結果,把請求轉發給後端伺服器,基于該排程算法,來自同一用戶端IP的請求會始終被發往後端的同一台伺服器。不過,當後端伺服器當機或添加了新的伺服器時,許多的請求可能會被發往與之間請求不同的伺服器,常用語負載均衡無cookie功能的基于TCP的協定,預設為動态,可通過hash-type修改
hash-type:指定hash算法的類型,後可跟如下兩個選項
map-based:取模算法(靜态)
constraint:一緻性hash算法(動态)
uri:對uri的左半部分(“?”标記之前的部分)進行hash運算。并由伺服器的總權重相除後派發至某比對的伺服器。
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:參數,
query:如何向資料庫發起查詢請求
frag:片段
url_param:通過<argument>為URL指定的參數在每個HTTP GET請求中将會被索引,通過找到了指定的參數且其通過等于号“=”被賦予一個值。那麼此值将被執行hash運算并被伺服器的總權重相除後派發至某比對的伺服器,可以使用hash_type指定hash算法類型
her(<name>):對于每個HTTP請求,通過<name>指定的HTTP首部将會被檢索,如果對于那個的首部沒有出現或其沒有有效值,則使用輪詢算法對其想用請求進行排程。此算法預設為靜态,可以使用hash_type修改此特性。
例2:開啟haproxy狀态頁,并要求基于使用者認證後才能通路
編輯配置檔案/etc/haproxy/haproxy.cfg,在backend段内添加如下配置項:
stats enable
stats uri /haproxy-stats
stats realm Haproxy Statistics
stats hide-version
stats scope .
stats auth zhangsan:adminadmin
stats auth lisi:adminadmin
重新開機或重讀配置檔案測試

注釋:
stats enable #:啟用狀态頁功能
stats uri /haproxy-stats #:設定狀态頁的通路路徑
stats realm please-input-secreate #:顯示認證提示資訊
stats hide-version #:影藏首部資訊
stats scope . #:啟用統計報告,并限制統計報告的區域
stats auth zhangsan:adminadmin #:添加認證使用者
stats auth lisi:adminadmin #:添加認證使用者
例3:開啟HAProxy日志記錄功能
編輯配置檔案在frontend段内添加如下參數
log 127.0.0.1:514 local2
編輯rsyslog配置檔案把如下兩項的前面#去掉
$ModLoad imudp
$UDPServerRun 514
重新開機rsyslog和haproxy服務即可
log:記錄日志,可以放在不同frontend或者backend中,用于記錄不同執行個體的日志
格式:log <address><facility>[<level>[<minlevel>]]
adrress:使用的日志伺服器的位址
facility:指定某個日志設施,用于後端日志伺服器記錄日志時調用
level:定義日志級别,對日志資訊進行過濾
minlevel:定義所需記錄日志的最小級别
其他選項都是圍繞其後端代理設定展開,可參考官方文檔:http://cbonte.github.io/haproxy-dconv/configuration-1.4.html