HAProxy的使用和配置文件詳解
HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。
HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動, 單一進程模型,此模型支持非常大的並發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千並發連接。事件驅動模型因為在有更好的資源和時間管理的用戶空間(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是為什麽他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。
配置文件: /etc/haproxy/haproxy.cfg #yum安裝haproxy的主配置文件
代理配置段:分四個區段: defaults、frontend、listen、backend;
-
defaults name 用於為listen/frontend/backend提供默認值,其name是可選參數,只是為了更好的閱讀。
-
listen name 通過關聯前後端定義一個完整的代理服務器
-
frontend name 定義監聽的套接字,用於接收客戶端請求並與之連接
- backend name 定義後端服務器組,用於處理frontend轉發來的請求 註:name可使用大小寫字母、數字、
Global段說明
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
-
maxconn conns
設定一個前端的最大並發連接數,因此其不能用於backend區段。對於大型站點來說,可以盡可能提高此值以便讓haproxy管理連接隊列,從而避免無法應答用戶請求。當然,此最大值不能超出“global”段中的定義。此外,需要留心的是,haproxy會為每個連接維持兩個緩沖,每個緩沖的大小為8KB,再加上其它的數據,每個連接將大約占用17KB的RAM空間。這意味著經過適當優化後,有著1GB的可用RAM空間時將能維護40000-50000並發連接。 -
log address facility [level [ minlevel ]]
為每個實例啟用事件和流量日誌,因此可用於所有區段。每個實例最多可以指定兩個log參數,不過,如果使用了“log global”且"global"段已經定了兩個log參數時,多余了log參數將被忽略。 -
global:當前實例的日誌系統參數同"global"段中的定義時,將使用此格式;每個實例僅能定義一次“log global”語句,且其沒有任何額外參數;
-
address:定義日誌發往的位置,其格式之一可以為IPv4_address:PORT,其中的port為UDP協議端口,默認為514;格式之二為Unix套接字文件路徑,但需要留心chroot應用及用戶的讀寫權限;
-
facility:可以為syslog系統的標準facility之一;
- level:定義日誌級別,即輸出信息過濾器,默認為所有信息;指定級別時,所有等於或高於此級別的日誌信息將會被發送;
Defaults 段說明
defaults
mode http #默認的模式mode{tcp|http|health},health只會返回OK
#retries 2 #兩次連接失敗就認為是服務器不可用,也可以通過後面設置
option redispatch #當serverId對應的服務器掛掉後,強制定向到其他健康的服務器
option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接
timeout connect 5000ms #連接超時
timeout client 30000ms #客戶端超時
timeout server 30000ms #服務器超時
#timeout check 2000 #心跳檢測超時
log 127.0.0.1 local0 err #[err warning info debug]
balance roundrobin #負載均衡算法
option httplog #日誌類別,采用httplog
option httpclose #每次請求完畢後主動關閉http通道,ha-proxy不支持keep-alive,只能模擬這種模式的實現
option dontlognull
option forwardfor #如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip
-
mode { tcp|http|health } 設定實例的運行模式或協議。當實現內容交換時,前端和後端必須工作於同一種模式(一般說來都是HTTP模式),否則將無法啟動實例。
-
tcp:實例運行於純TCP模式,在客戶端和服務器端之間將建立一個全雙工的連接,且不會對7層報文做任何類型的檢查;此為默認模式,通常用於SSL、SSH、SMTP等應用;
-
http:實例運行於HTTP模式,客戶端請求在轉發至後端服務器之前將被深度分析,所有不與RFC格式兼容的請求都會被拒絕;
- health:實例工作於health模式,其對入站請求僅響應“OK”信息並關閉連接,且不會記錄任何日誌信息;此模式將用於響應外部組件的健康狀態檢查請求;目前業講,此模式已經廢棄,因為tcp或http模式中的monitor關鍵字可完成類似功能;
Listen段說明
listen stats
bind 0.0.0.0:8888 #監聽端口
option httplog #采用http日誌格式
stats enable #開啟stats統計頁面
stats uri / #統計頁面訪問的前綴,後通常要加上?stats
stats realm "Haproxy Auth" #開啟認證功能
stats auth admin:admin #認證時的賬號和密碼
stats admin if TRUE #在制定條件下開啟admin功能
stats refresh 3s #統計頁面自動刷新時間間隔
stats show-desc demo #統計頁面顯示的相關描述信息
stats hide-version #隱藏haproxy的版本號
bind 綁定監聽地址
語法:bind [address]:port_range [, ...] interface interface
此指令僅能用於frontend和listen區段,用於定義一個或幾個監聽的套接字。
Frontend段說明
frontend main *:80
default_backend apache_groups
-
use_backend: 調用指定的後端主機(定義在frontend和listen中);
語法: use_backend backend [{if | unless} condition] -
condition 條件多為acl的名稱
- default_backend: 默認調用的後端主機;(定義在frontend,defaults,listen中)
語法:default_backend backend
Backend段說明
backend apache_groups
balance roundrobin
cookie SERVERID insert indirect
server slave2 192.168.1.3:80 check inter 1s rise 2 fall 3 cookie A maxconn 1000
server slave3 192.168.1.4:80 check inter 1s rise 2 fall 3 cookie B maxconn 1000
balance 定義負載均衡算法(可用於“defaults”、“listen”和“backend”)。
語法:balance algorithm [ arguments ]
algorithm用於在負載均衡場景中挑選一個server,其僅應用於持久信息不可用的條件下或需要將一個連接重新派發至另一個服務器時。
支持的算法有:
-
roundrobin:基於權重進行輪叫,在服務器的處理時間保持均勻分布時,這是最平衡、最公平的算法。此算法是動態的,這表示其權重可以在運行時進行調整,不過,在設計上,每個後端服務器僅能最多接受4128個連接;
-
static-rr:基於權重進行輪叫,與roundrobin類似,但是為靜態方法,在運行時調整其服務器權重不會生效;不過,其在後端服務器連接數上沒有限制;
-
leastconn:新的連接請求被派發至具有最少連接數目的後端服務器;在有著較長時間會話的場景中推薦使用此算法,如LDAP、SQL等,其並不太適用於較短會話的應用層協議,如HTTP;此算法是動態的,可以在運行時調整其權重;
- source:將請求的源地址進行hash運算,並由後端服務器的權重總數相除後派發至某匹配的服務器;這可以使得同一個客戶端IP的請求始終被派發至某特定的服務器;不過,當服務器權重總數發生變化時,如某服務器宕機或添加了新的服務器,許多客戶端的請求可能會被派發至與此前請求不同的服務器;常用於負載均衡無cookie功能的基於TCP的協議;其默認為靜態,不過也可以使hash-type修改此特性;
server 定義後端服務器
語法: server name address [param ]
-
name:為此服務器指定的內部名稱,其將出現在日誌及警告信息中;如果設定了"http-send-server-name",它還將被添加至發往此服務器的請求首部中;
-
address:此服務器的的IPv4地址,也支持使用可解析的主機名,只不過在啟動時需要解析主機名至相應的IPv4地
址; - param:為此服務器設定的一系參數;其可用的參數非常多,具體請參考官方文檔中的說明,下面僅說明幾個常用的參數:
disabled:此服務器禁用;
backup:設定為備用服務器,僅在負載均衡場景中的其它server均不可用於啟用此server;
check:啟動對此server執行健康狀態檢查,其可以借助於額外的其它參數完成更精細的設定。
inter delay: 設定監控狀態檢查的時間間隔,單位為毫秒,默認為2000,也可以使用fastinter和downinter來根據服務器端專題優化此事件延遲
rise count:設定檢查狀態檢查中,某離線的server從離線狀態轉換至正常狀態需要成功檢查的次數
fall count:設定檢查狀態檢查中,某server從正常狀態轉換至離線狀態需要成功檢查的次數
cookie value:為指定server設定cookie值,此處指定的值將在請求入站時被檢查,第一次為此值挑選的server將在後續的請求中被選中,其目的在於實現持久連接的功能;
maxconn maxconn:指定此服務器接受的最大並發連接數;如果發往此服務器的連接數目高於此處指定的值,其將被放置於請求隊列,以等待其它連接被釋放;
maxqueue maxqueue:設定請求隊列的最大長度;0表示無上限;
weight weight:權重,默認為1,最大值為256,0表示不參與負載均衡;
yum安裝haproxy
[root@Haproxy ~]# yum install -y haproxy #直接使用RPM來安裝
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg #haproxy的主配置文件
https代理的示例:
listen proxytofirehose :443
mode tcp
balance roundrobin
stick-table type ip size 200k expire 30m
stick on src
server firehose 192.168.122.2:443 check
curl -x 192.168.122.172:80 www.wo.com.cn 此命令使用192.168.122.172:80這個代理服務器IP和端口訪問站點www.wo.com.cn參數說明 -x 設置代理,格式為host[:port],port的缺省值為1080
wget -Y on -e "http_proxy=http://192.168.122.172:9201" "www.wo.com.cn" 此命令使用192.168.122.172:9201這個代理服務器IP和端口訪問站點www.wo.com.cn 參數說明 -Y 是否使用代理 -e 執行命令
HAProxy的使用和配置文件詳解