HAProxy安裝配置詳解
簡介
HAProxy提供高可用性蹂析、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理舔示,支持虛擬主機(jī),它是免費(fèi)电抚、快速并且可靠的一種解決方案惕稻。
HAProxy特別適用于那些負(fù)載特大的web站點(diǎn),這些站點(diǎn)通常又需要會話保持或七層處理蝙叛。
HAProxy運(yùn)行在當(dāng)前的硬件上俺祠,完全可以支持?jǐn)?shù)以萬計(jì)的并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中借帘, 同時可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上蜘渣。
HAProxy實(shí)現(xiàn)了一種事件驅(qū)動, 單一進(jìn)程模型,此模型支持非常大的并發(fā)連接數(shù)肺然。多進(jìn)程或多線程模型受內(nèi)存限制 蔫缸、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制,很少能處理數(shù)千并發(fā)連接际起。事件驅(qū)動模型因?yàn)樵谟懈玫馁Y源和時間管理的用戶空間(User-Space) 實(shí)現(xiàn)所有這
些任務(wù)拾碌,所以沒有這些問題吐葱。此模型的弊端是,在多核系統(tǒng)上校翔,這些程序通常擴(kuò)展性較差弟跑。這就是為什么他們必須進(jìn)行優(yōu)化以 使每個CPU時間片(Cycle)做更多的工作。
安裝
下載
wget http://mirrors.jsqix.com/soft/haproxy-1.7.5.tar.gz
解壓
tar -zxvf haproxy-1.7.5.tar.gz
cd haproxy-1.7.5
安裝
make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
參數(shù)說明
TARGET=linux26 #內(nèi)核版本防症,使用uname -r查看內(nèi)核孟辑,如:2.6.18-371.el5,此時該參數(shù)就為linux26告希;kernel 大于2.6.28的用:TARGET=linux2628
ARCH=x86_64 #系統(tǒng)位數(shù)
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy為haprpxy安裝路徑
配置(自己創(chuàng)建)
【/usr/local/haproxy/haproxy.cfg】
###########全局配置#########
global
log 127.0.0.1 local0 #[日志輸出配置扑浸,所有日志都記錄在本機(jī)烧给,通過local0輸出]
log 127.0.0.1 local1 notice #定義haproxy 日志級別[error warringinfo debug]
daemon #以后臺形式運(yùn)行harpoxy
nbproc 1 #設(shè)置進(jìn)程數(shù)量
maxconn 4096 #默認(rèn)最大連接數(shù),需考慮ulimit-n限制
#user haproxy #運(yùn)行haproxy的用戶
#group haproxy #運(yùn)行haproxy的用戶所在的組
#pidfile /var/run/haproxy.pid #haproxy 進(jìn)程PID文件
#ulimit-n 819200 #ulimit 的數(shù)量限制
#chroot /usr/share/haproxy #chroot運(yùn)行路徑
#debug #haproxy 調(diào)試級別燕偶,建議只在開啟單進(jìn)程的時候調(diào)試
#quiet
########默認(rèn)配置############
defaults
log global
mode http #默認(rèn)的模式mode { tcp|http|health },tcp是4層础嫡,http是7層指么,health只會返回OK
option httplog #日志類別,采用httplog
option dontlognull #不記錄健康檢查日志信息
retries 2 #兩次連接失敗就認(rèn)為是服務(wù)器不可用,也可以通過后面設(shè)置
#option forwardfor #如果后端服務(wù)器需要獲得客戶端真實(shí)ip需要配置的參數(shù)榴鼎,可以從Http Header中獲得客戶端ip
option httpclose #每次請求完畢后主動關(guān)閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實(shí)現(xiàn)
#option redispatch #當(dāng)serverId對應(yīng)的服務(wù)器掛掉后伯诬,強(qiáng)制定向到其他健康的服務(wù)器,以后將不支持
option abortonclose #當(dāng)服務(wù)器負(fù)載很高的時候巫财,自動結(jié)束掉當(dāng)前隊(duì)列處理比較久的鏈接
maxconn 4096 #默認(rèn)的最大連接數(shù)
timeout connect 5000ms #連接超時
timeout client 30000ms #客戶端超時
timeout server 30000ms #服務(wù)器超時
#timeout check 2000 #心跳檢測超時
#timeout http-keep-alive10s #默認(rèn)持久連接超時時間
#timeout http-request 10s #默認(rèn)http請求超時時間
#timeout queue 1m #默認(rèn)隊(duì)列超時時間
balance roundrobin #設(shè)置默認(rèn)負(fù)載均衡方式盗似,輪詢方式
#balance source #設(shè)置默認(rèn)負(fù)載均衡方式,類似于nginx的ip_hash
#balnace leastconn #設(shè)置默認(rèn)負(fù)載均衡方式平项,最小連接數(shù)
########統(tǒng)計(jì)頁面配置########
listen stats
bind 0.0.0.0:1080 #設(shè)置Frontend和Backend的組合體赫舒,監(jiān)控組的名稱,按需要自定義名稱
mode http #http的7層模式
option httplog #采用http日志格式
#log 127.0.0.1 local0 err #錯誤日志記錄
maxconn 10 #默認(rèn)的最大連接數(shù)
stats refresh 30s #統(tǒng)計(jì)頁面自動刷新時間
stats uri /stats #統(tǒng)計(jì)頁面url
stats realm XingCloud\ Haproxy #統(tǒng)計(jì)頁面密碼框上提示文本
stats auth admin:admin #設(shè)置監(jiān)控頁面的用戶和密碼:admin,可以設(shè)置多個用戶名
stats auth Frank:Frank #設(shè)置監(jiān)控頁面的用戶和密碼:Frank
stats hide-version #隱藏統(tǒng)計(jì)頁面上HAProxy的版本信息
stats admin if TRUE #設(shè)置手工啟動/禁用闽瓢,后端服務(wù)器(haproxy-1.4.9以后版本)
########設(shè)置haproxy 錯誤頁面#####
#errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
#errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
#errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
#errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
#errorfile 504 /home/haproxy/haproxy/errorfiles/504.http
########frontend前端配置##############
frontend main
bind *:80 #這里建議使用bind *:80的方式接癌,要不然做集群高可用的時候有問題,vip切換到其他機(jī)器就不能訪問了扣讼。
acl web hdr(host) -i www.abc.com #acl后面是規(guī)則名稱缺猛,-i為忽略大小寫,后面跟的是要訪問的域名椭符,如果訪問www.abc.com這個域名荔燎,就觸發(fā)web規(guī)則,销钝。
acl img hdr(host) -i img.abc.com #如果訪問img.abc.com這個域名有咨,就觸發(fā)img規(guī)則。
use_backend webserver if web #如果上面定義的web規(guī)則被觸發(fā)曙搬,即訪問www.abc.com摔吏,就將請求分發(fā)到webserver這個作用域鸽嫂。
use_backend imgserver if img #如果上面定義的img規(guī)則被觸發(fā),即訪問img.abc.com征讲,就將請求分發(fā)到imgserver這個作用域据某。
default_backend dynamic #不滿足則響應(yīng)backend的默認(rèn)頁面
########backend后端配置##############
backend webserver #webserver作用域
mode http
balance roundrobin #balance roundrobin 負(fù)載輪詢,balance source 保存session值诗箍,支持static-rr癣籽,leastconn,first滤祖,uri等參數(shù)
option httpchk /index.html HTTP/1.0 #健康檢查, 檢測文件筷狼,如果分發(fā)到后臺index.html訪問不到就不再分發(fā)給它
server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3
server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3
#cookie 1表示serverid為1,check inter 1500 是檢測心跳頻率
#rise 2是2次正確認(rèn)為服務(wù)器可用匠童,fall 3是3次失敗認(rèn)為服務(wù)器不可用埂材,weight代表權(quán)重
backend imgserver
mode http
option httpchk /index.php
balance roundrobin
server img01 192.168.137.101:80 check inter 2000 fall 3
server img02 192.168.137.102:80 check inter 2000 fall 3
backend dynamic
balance roundrobin
server test1 192.168.1.23:80 check maxconn 2000
server test2 192.168.1.24:80 check maxconn 2000
listen tcptest
bind 0.0.0.0:5222
mode tcp
option tcplog #采用tcp日志格式
balance source
#log 127.0.0.1 local0 debug
server s1 192.168.100.204:7222 weight 1
server s2 192.168.100.208:7222 weight 1
負(fù)載均衡算法
一、roundrobin汤求,表示簡單的輪詢俏险,每個服務(wù)器根據(jù)權(quán)重輪流使用,在服務(wù)器的處理時間平均分配的情況下這是最流暢和公平的算法扬绪。該算法是動態(tài)的竖独,對于實(shí)例啟動慢的服務(wù)器權(quán)重會在運(yùn)行中調(diào)整。
二挤牛、static-rr莹痢,表示根據(jù)權(quán)重,建議關(guān)注墓赴;每個服務(wù)器根據(jù)權(quán)重輪流使用竞膳,類似roundrobin,但它是靜態(tài)的竣蹦,意味著運(yùn)行時修改權(quán)限是無效的顶猜。另外,它對服務(wù)器的數(shù)量沒有限制痘括。
三长窄、leastconn,表示最少連接者先處理纲菌,建議關(guān)注挠日;leastconn建議用于長會話服務(wù),例如LDAP翰舌、SQL嚣潜、TSE等,而不適合短會話協(xié)議椅贱。如HTTP.該算法是動態(tài)的懂算,對于實(shí)例啟動慢的服務(wù)器權(quán)重會在運(yùn)行中調(diào)整只冻。
四、source计技,表示根據(jù)請求源IP喜德,建議關(guān)注;對請求源IP地址進(jìn)行哈希垮媒,用可用服務(wù)器的權(quán)重總數(shù)除以哈希值舍悯,根據(jù)結(jié)果進(jìn)行分配。
只要服務(wù)器正常睡雇,同一個客戶端IP地址總是訪問同一個服務(wù)器萌衬。如果哈希的結(jié)果隨可用服務(wù)器數(shù)量而變化,那么客戶端會定向到不同的服務(wù)器它抱;
該算法一般用于不能插入cookie的Tcp模式秕豫。它還可以用于廣域網(wǎng)上為拒絕使用會話cookie的客戶端提供最有效的粘連;
該算法默認(rèn)是靜態(tài)的抗愁,所以運(yùn)行時修改服務(wù)器的權(quán)重是無效的馁蒂,但是算法會根據(jù)“hash-type”的變化做調(diào)整呵晚。
五蜘腌、uri,表示根據(jù)請求的URI饵隙;表示根據(jù)請求的URI左端(問號之前)進(jìn)行哈希撮珠,用可用服務(wù)器的權(quán)重總數(shù)除以哈希值,根據(jù)結(jié)果進(jìn)行分配金矛。
只要服務(wù)器正常芯急,同一個URI地址總是訪問同一個服務(wù)器。
一般用于代理緩存和反病毒代理驶俊,以最大限度的提高緩存的命中率娶耍。該算法只能用于HTTP后端;
該算法一般用于后端是緩存服務(wù)器饼酿;
該算法默認(rèn)是靜態(tài)的榕酒,所以運(yùn)行時修改服務(wù)器的權(quán)重是無效的,但是算法會根據(jù)“hash-type”的變化做調(diào)整故俐。
六想鹰、url_param,表示根據(jù)請求的URl參數(shù)'balance url_param' requires an URL parameter name
在HTTP GET請求的查詢串中查找<param>中指定的URL參數(shù)药版,基本上可以鎖定使用特制的URL到特定的負(fù)載均衡器節(jié)點(diǎn)的要求辑舷;
該算法一般用于將同一個用戶的信息發(fā)送到同一個后端服務(wù)器;
該算法默認(rèn)是靜態(tài)的槽片,所以運(yùn)行時修改服務(wù)器的權(quán)重是無效的何缓,但是算法會根據(jù)“hash-type”的變化做調(diào)整肢础。
七、hdr(name)碌廓,表示根據(jù)HTTP請求頭來鎖定每一次HTTP請求乔妈;
在每個HTTP請求中查找HTTP頭<name>,HTTP頭<name>將被看作在每個HTTP請求氓皱,并針對特定的節(jié)點(diǎn)路召;
如果缺少頭或者頭沒有任何值,則用roundrobin代替波材;
該算法默認(rèn)是靜態(tài)的股淡,所以運(yùn)行時修改服務(wù)器的權(quán)重是無效的,但是算法會根據(jù)“hash-type”的變化做調(diào)整廷区。
八唯灵、rdp-cookie(name),表示根據(jù)據(jù)cookie(name)來鎖定并哈希每一次TCP請求隙轻。
為每個進(jìn)來的TCP請求查詢并哈希RDP cookie<name>埠帕;
該機(jī)制用于退化的持久模式,可以使同一個用戶或者同一個會話ID總是發(fā)送給同一臺服務(wù)器玖绿。
如果沒有cookie敛瓷,則使用roundrobin算法代替;
該算法默認(rèn)是靜態(tài)的斑匪,所以運(yùn)行時修改服務(wù)器的權(quán)重是無效的呐籽,但是算法會根據(jù)“hash-type”的變化做調(diào)整。
其實(shí)這些算法各有各的用法蚀瘸,我們平時應(yīng)用得比較多的應(yīng)該是roundrobin狡蝶、source和lestconn。
ACL規(guī)則定義
########ACL策略定義#########################
1贮勃、#如果請求的域名滿足正則表達(dá)式返回true -i是忽略大小寫
acl denali_policy hdr_reg(host) -i ^(www.inbank.com|image.inbank.com)$
2贪惹、#如果請求域名滿足www.inbank.com 返回 true -i是忽略大小寫
acl tm_policy hdr_dom(host) -i www.inbank.com
3、#在請求url中包含sip_apiname=寂嘉,則此控制策略返回true,否則為false
acl invalid_req url_sub -i sip_apiname=#定義一個名為invalid_req的策略
4奏瞬、#在請求url中存在timetask作為部分地址路徑,則此控制策略返回true,否則返回false
acl timetask_req url_dir -i timetask
5垫释、#當(dāng)請求的header中Content-length等于0時返回 true
acl missing_cl hdr_cnt(Content-length) eq 0
#########acl策略匹配相應(yīng)###################
1丝格、#當(dāng)請求中header中Content-length等于0 阻止請求返回403
block if missing_cl
2、#block表示阻止請求棵譬,返回403錯誤显蝌,當(dāng)前表示如果不滿足策略invalid_req,或者滿足策略timetask_req,則阻止請求曼尊。
block if !invalid_req || timetask_req
3酬诀、#當(dāng)滿足denali_policy的策略時使用denali_server的backend
use_backend denali_server if denali_policy
4、#當(dāng)滿足tm_policy的策略時使用tm_server的backend
use_backend tm_server if tm_policy
5骆撇、#reqisetbe關(guān)鍵字定義瞒御,根據(jù)定義的關(guān)鍵字選擇backend
reqisetbe ^Host:\ img dynamic
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic
reqisetbe ^[^\ ]*\ /admin/stats stats
6、#以上都不滿足的時候使用默認(rèn)mms_server的backend
default_backend mms
啟動
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
查看狀態(tài)
http://192.168.1.22:1080/stats
說明:
#1080即haproxy配置文件中監(jiān)聽端口
s#tats 即haproxy配置文件中的監(jiān)聽名稱