HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。
HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中, 同時能夠保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動, 單一進程模型,此模型支持很是大的併發鏈接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,不多能處理數千併發鏈接。事件驅動模型由於在有更好的資源和時間管理的用戶空間(User-Space) 實現全部這些任務,因此沒有這些問題。此模型的弊端是,在多核系統上,這些程序一般擴展性較差。這就是爲何他們必須進行優化以 使每一個CPU時間片(Cycle)作更多的工做。前端
配置文件: /etc/haproxy/haproxy.cfg #yum安裝haproxy的主配置文件web
代理配置段:分四個區段: defaults、frontend、listen、backend;redis
defaults name 用於爲listen/frontend/backend提供默認值,其name是可選參數,只是爲了更好的閱讀。算法
listen name 經過關聯先後端定義一個完整的代理服務器apache
frontend name 定義監聽的套接字,用於接收客戶端請求並與之鏈接vim
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併發鏈接。
若是爲conns指定了一個過大值,極端場景下,其最終佔據的空間可能會超出當前主機的可用內存,這可能會帶來意想不到的結果;所以,將其設定了一個可接受值方爲明智決定。其默認爲2000。後端
log address facility [level [ minlevel ]]
爲每一個實例啓用事件和流量日誌,所以可用於全部區段。每一個實例最多能夠指定兩個log參數,不過,若是使用了「log global」且"global"段已經定了兩個log參數時,多餘了log參數將被忽略。安全
global:當前實例的日誌系統參數同"global"段中的定義時,將使用此格式;每一個實例僅能定義一次「log global」語句,且其沒有任何額外參數;服務器
address:定義日誌發往的位置,其格式之一能夠爲IPv4_address:PORT,其中的port爲UDP協議端口,默認爲514;格式之二爲Unix套接字文件路徑,但須要留心chroot應用及用戶的讀寫權限;cookie
facility:能夠爲syslog系統的標準facility之一;
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格式兼容的請求都會被拒絕;
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 main *:80 default_backend apache_groups
use_backend: 調用指定的後端主機(定義在frontend和listen中);
語法: use_backend backend [{if | unless} condition]
condition 條件多爲acl的名稱
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 algorithm [ arguments ]
algorithm用於在負載均衡場景中挑選一個server,其僅應用於持久信息不可用的條件下或須要將一個鏈接從新派發至另外一個服務器時。
支持的算法有:
roundrobin:基於權重進行輪叫,在服務器的處理時間保持均勻分佈時,這是最平衡、最公平的算法。此算法是動態的,這表示其權重能夠在運行時進行調整,不過,在設計上,每一個後端服務器僅能最多接受4128個鏈接;
static-rr:基於權重進行輪叫,與roundrobin相似,可是爲靜態方法,在運行時調整其服務器權重不會生效;不過,其在後端服務器鏈接數上沒有限制;
leastconn:新的鏈接請求被派發至具備最少鏈接數目的後端服務器;在有着較長時間會話的場景中推薦使用此算法,如LDAP、SQL等,其並不太適用於較短會話的應用層協議,如HTTP;此算法是動態的,能夠在運行時調整其權重;
語法: server name address [param ]
name:爲此服務器指定的內部名稱,其將出如今日誌及警告信息中;若是設定了"http-send-server-name",它還將被添加至發往此服務器的請求首部中;
address:此服務器的的IPv4地址,也支持使用可解析的主機名,只不過在啓動時須要解析主機名至相應的IPv4地
址;
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表示不參與負載均衡;
[root@Haproxy ~]# yum install -y haproxy #直接使用RPM來安裝
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg #haproxy的主配置文件
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 執行命令