1. 程式人生 > >haproxy介紹及基本配置

haproxy介紹及基本配置

haproxy認證 haproxy 讀寫分離 haproxy動靜分離

一 簡介:

1 haproxy 介紹

HAProxy是一個使用C語言編寫的自由及開放源代碼軟件[1],其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。
HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動, 單一進程模型,此模型支持非常大的並發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千並發連接。事件驅動模型因為在有更好的資源和時間管理的用戶空間(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是為什麽他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。

2 haproxy與LVS的異同:

1 兩者都是負載均衡產品,但LVS是基於Linux操作系統的一種負載均衡,而haproxy 是基於第三方應用實現的軟負載均衡
2 LVS是基於四層IP負載均衡技術,而haproxy是基於七層和四層技術,可以提供TCP和http應用的負載均衡總和解決方案
3 haproxy在狀態檢測方面功能強大,可支持端口、URL、腳本等多種檢測方式
4 haproxy處理能力低於四層的LVS負載均衡,四層性能接近於硬件的性能。

二 實驗環境:

主機名 IP地址 作用
server2 192.168.122.20 用於配置haproxy,以實現對後端設備的負載均衡
server4 192.168.122.40 後端web服務器
server5 192.168.122.50 後端web服務器

三 實驗:

一 haproxy 安裝

1 安裝rpmbuild 來獲取rpm包
1 解決依賴關系
技術分享圖片
技術分享圖片
2 進行rpmbulid -tb 進行產生rpm包
技術分享圖片

技術分享圖片

安裝並復制到server3 上:(目前server3 不應用)
技術分享圖片

二 後端節點配置

1 安裝HTTPd服務並設置網頁
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

三:配置haproxy

一 復制配置文件

技術分享圖片

二 基本配置

1 配置監聽IP地址和默認網頁
技術分享圖片
技術分享圖片
參數講解:
1 bind*:80
bind:此選項只能在frontend和listen部分進行定義,用於定義一個或集合鑒定的套接字,bind 使用格式

Bind[<address>:<port_range>] interface <interface>
其中address是可選,可以設置主機名或IP地址,如果設置為"*"或0.0.0.0 ,將監聽當前系統的所有IPV4地址(作為監聽負載均衡的服務,應該監聽所有的IP地址),port_range可以是一個特定的TCP端口,也可以是一個端口的範圍,小於1024的端口需要有特點通過的權限的用戶才能使用,interface 是可選,用來指定網絡接口的名稱,只能在Linux上使用
2 mode :
指定haproxy實例運行模式。可為tcp、http。tcp為4層代理模式,不會對協議進行任何分析,只是單純地轉發數據包,如HTTPS/MYSQL等,http為7層代理模式。如果所有配置區段都沒有設置mode,則默認為tcp模式。
3 log
為每個實例啟用事件和流量日誌,因此可用於所有區段。每個實例最多可以指定兩個log參數。配置方法和意義同前文 全局配置參數 的log。
如果使用log global,則表示從全局繼承日誌設置。另外,如果全局已經定義過兩個log了,此處除引用global外還自定義了一個log,則此自定義的log失效,因為只支持兩個日誌設置。
4 Option httplog
在默認情況下,haproxy 日誌是不記錄HTTP請求的,通過此選項可以啟用日誌記錄HTTP請求
5 Option forwardfor
如果後端服務器需要獲得客戶端的真實IP,就需要配置此參數,由於haproxy工作於反向代理模式,因此發往後端真實服務器的請求中的客戶端IP均為haproxy主機的IP,而非真正訪問客戶端的IP,通過使用forwardfor選項,haproxy 就額可以向沒和發往後端真實服務器的請求添加“X-forwarded-for ”記錄,這樣後端真實服務器日誌可以通過"x-forwarded-for"信息來記錄客戶端來源IP,後端服務器需要打開此設置
6 maxconn <conns>
不能用於backend區段
設定一個前端的最大並發連接數??對於大型站點來說,可以盡可能提高此值以便讓haproxy管理連接隊列,從而避免無法應答用戶請求。當然,此最大值不能超出"global"段中的定義。此外,haproxy會為每個連接維持兩個緩沖,每個緩沖的大小為8KB,再加上其它的數據,每個連接將大約占用17KB的RAM空間。這意味著經過適當優化後,有著1GB的可用RAM空間時將能維護40000-50000並發連接。
如果為指定了一個過大值,極端場景下,其最終占據的空間可能會超出當前主機的可用內存,這可能會帶來意想不到的結果;因此,將其設定了一個可接受值方為明智決定。默認為2000。
7 status_uri :
定義haproxy訪問的網頁。
8 default_backend
在沒有匹配的"use_backend"規則時為實例指定默認後端。在"frontend"和"backend"之間進行內容交換時,通常使用"use-backend"定義匹配規則;而沒有被規則匹配到的請求將由此參數指定的後端接收。
2 配置靜態網頁的後端調度並註釋動態網頁
技術分享圖片
參數講解:
1 Balance roundrobin
此關鍵字用來定義負載均衡算法
roundrobin:是基於權重進行輪叫的調度算法,在服務器性能分布比較均勻時,這是一種公平的合理的算法
Static-rr:是基於權重進行輪叫調度的算法,不過此算法是靜態算法,在運行時調整服務器權重不會生效
source:是基於請求源IP的算法,此算法先對請求的源IP進行hash,然後將結果與後端服務器的權重總數相除後轉發至某個匹配的後端服務器,這種方式可以使用同一個客戶端IP的請求始終被轉發到特定的後臺服務器
leastconn:此算法會將新的連接請求轉發到具有最少連接數目的後端服務器,在會話時間較長的場景中推薦使用此算法,
uri:此算法會對部分或整個URI進行hash運算,在經過與服務器的總權重相除,最後轉發到某臺特定的後端服務器上
uri_param:此算法會根據URL路徑中的參數進行轉發,可以保證在後端真實服務器數量不變時,同一個用戶的請求始終分發到同一臺機器上
hdr(<name>):此算法會根據HTTP頭進行轉發, 如果指定的http頭名不存在,則使用rondrobin算法進行策略轉發
2 option redispatch
在backend服務器組啟用cookie功能,以便實現cookie綁定。需要同時設置server指令中的cookie選項。
後端為靜態服務器設置:
cookie NAME insert nocache
PHP做後端時設置:
cookie SESSION_COOKIE insert indirect nocache
當客戶端綁定cookie對應的後端服務器宕機後,應該為此客戶端重新調度一個後端server,否則將打不開頁面。這時需要使用option redispatch,表示當找不到cookie對應的服務器時分配新的服務器給客戶端。
3 超時時間相關
timeout http-request
haproxy等待客戶端請求發送完整的超時時長。如果一開始發送了一部分,後續沒有再發送,或者後續發送的一直是請求的某一部分,等達到超時時間將斷開此連接。這可以防止DoS攻擊。
timeout queue
當調度的後端服務器已經滿負載了,即達到了該backend的最大並發連接數時,後續要調度到此backend的請求將進入隊列等待後端服務器釋放可用。該超時時間設置的就是某一請求在隊列中的最大等待時長,當達到此時長後將被認為該請求永遠無法到達服務端,haproxy會丟棄該請求並向客戶端返回503狀態碼。
timeout connect 和retries
haproxy要和後端服務器建立連接時等待超時時間。一般如果haproxy和後端服務器處於局域網中,建立連接是瞬間的,所以該值可以設置的小一些。
retries表示和服務端建立連接失敗時重試連接的次數。
timeout client
客戶端和haproxy之間非活動連接保持的最大時長,達到此時長haproxy將斷開和此客戶端的連接。非活動表示客戶端沒有請求報文發送給haproxy。
timeout server
服務端和haproxy之間非活動連接保持的最大時長,達到此時長haproxy將斷開和此服務器的連接。非活動表示服務端沒有響應報文發送給haproxy。
timeout http-keep-alive
等待出現http請求報文出現的最大時長,即和客戶端保持長連接的時長。建議設置小一些,以盡快釋放連接,例如設置為2-3秒鐘。
如果此項未設置,則使用timeout http-request值,如果timeout http-request也沒設置,則使用timeout client的值。
timeout check
在和服務端建立連接後,健康狀況檢查判斷的超時時長。
4 Server 這個關鍵字用來定義後端真實的服務器,不能用戶defaults和frontend部分,格式:
Server<name><address>[:port][param*]
其中。每個參數的含義如下:
<name>,後端真實服務器制定一個內部名稱,隨便定義
<address>後端真實服務器的IP地址或主機名
<port>:指定連接請求發往真實服務器的目標端口,在未設定時,將使用與客戶端請求的同一個端口。
[param*]:為後端服務器設定的一系列參數,
check:表示啟用對後端服務器執行健康狀態檢查
inter:設置健康狀態檢查的時間間隔,單位為毫秒
rise:設置從故障狀態轉換至正常狀態需要成功檢查的次數,
fall:設置後端服務器從正常轉臺轉換為不可用狀態需要檢查的次數
cookie:為指定後端服務器設定cookie值,此處指定的值將在請求入棧是被檢查,第一次為此值挑選後端服務器將在後續的請求中一致被選中,目的在於實現持久化鏈接的功能。前面必須啟用cookie。
Weight : 設置後端真實服務器的權重,默認為1,最大值為256,設置為0表示不參與負載均衡
backup:設置後端真實服務器的備份服務器,僅僅在後端所有真實服務器均不可用的情況下才啟動。

三 重啟服務並觀察

技術分享圖片
技術分享圖片
測試:
實現了調度
技術分享圖片
當server4down 機後:
技術分享圖片
服務沒有中斷
技術分享圖片

四 配置backup 服務器

因為此時haproxy 監控的是80 端口,因此要用本機來做backup則需要修改本機httpd 的監聽端口為8080
技術分享圖片

1 安裝HTTPd服務
技術分享圖片
修改監聽端口
技術分享圖片
啟動服務
技術分享圖片
添加網頁提示
技術分享圖片
5 重啟haproxy
技術分享圖片
當server5 也down 掉之後:
技術分享圖片
技術分享圖片

五 開啟日誌記錄功能

添加haproxy 訪問日誌默認其是local0
技術分享圖片
打開日誌記錄功能:
技術分享圖片
技術分享圖片
技術分享圖片技術分享圖片
技術分享圖片
訪問並查看:
技術分享圖片
技術分享圖片

六 配置認證和密碼:

配置認證,用戶名為admin,密碼為root
技術分享圖片技術分享圖片
技術分享圖片
查看是否生效:
技術分享圖片

七 配置ACL規則

ACL 語法:
acl <aclname> <criterion> [flags] [operator] [<value>] ...
aclname:指定acl的名稱,在引用時區分大小寫。可隨意指定,且多個acl指令可以指定同一個aclname,這表示"或"的邏輯關系。

flags:可選項,表示標識位。一般會用到的標識位只有"-i",表示不區分大小寫。

operator:可選項,某些操作符,有"eq"、"ge"、"gt"、"le"、"lt",表示數學上的等於、大於、小於。

<criterion>:指定檢查標準,即檢查方法。見下文給出的常用4層標準和7層標準

value:根據criterion的不同,值的類型不同。

(1).4層常用檢查標準,官方手冊: https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#7.3.3
src <ip_addr>
src_port <PORT or PORT_ranges>
dst <ip_addr>
dst_port <PORT or PORT_ranges>
其中src、src_port、dst和dst_port就是檢查標準creiterion,其後的值就是value。
例如:
acl accept_clients src 192.168.100.0/24
acl reject_clients src 172.16.0.0/16
tcp-request content accept if accept_clients
tcp-request content reject if reject_clients
tcp-request content reject # 此項表明不匹配前兩項的默認都拒絕
(2).7層常用檢查標準,官方手冊: https://cbonte.github.io/haproxy-dconv/1.9/configuration.html#7.3.6
hdr(HEADER):檢查首部字段的值是否為指定的值,如hdr(Connection) -i close表示首部字段Connection的值是否為不區分大小寫的close。hdr(Host) -i www.linuxidc.com表示首部字段Host的值是否為www.linuxidc.com,即請求的主機是否是指定的值。
hdr_reg(HEADER):檢查首部字段是否匹配指定的模式。如hdr_reg(Host) -i .*.linuxidc.com。
http_first_req:當正處理的請求是第一個請求時返回true。
method:請求的方法為指定的方法時返回方法對應的數值,也就表示true。例如"method GET"。
acl valid_method method GET
http-request deny if ! valid_method
path:匹配uri的path部分,一般用來匹配精確的文件資源。例如path -i /a.png。
path_beg:匹配path的前綴部分。
path_end:匹配path的後綴部分。
path_reg:使用正則表達式來匹配path。
url:對整個url進行匹配。
url_beg:對url的前綴進行匹配。
還有很多很多檢查方法,更多的查詢官方手冊,太多了。一般4層的檢查標準和7層對路徑path和首部hdr的標準就夠了。
多個條件使用"AND"、"OR"、"!"操作符表示邏輯與、邏輯或和取反,不寫時默認的操作符是"AND"。
啟動後端服務器:
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
進行訪問查看
技術分享圖片

配置頁面跳轉:
技術分享圖片

技術分享圖片
技術分享圖片
直接將某個客戶端IP訪問進行重定向
技術分享圖片
技術分享圖片
效果是一樣的
技術分享圖片

八 配置網頁的動靜分離:

技術分享圖片
在50上安裝php ,以提供動態網頁
技術分享圖片

技術分享圖片
技術分享圖片

在靜態網頁的網站服務器上配置:
技術分享圖片
重啟服務
技術分享圖片
測試:
其默認訪問的是動態網頁
技術分享圖片
當以/images 結尾的文件時,是跳轉到靜態網頁的服務器中去了
技術分享圖片

haproxy介紹及基本配置