HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。php
HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。css
HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中, 同時能夠保護你的web服務器不被暴露到網絡上。html
HAProxy實現了一種事件驅動, 單一進程模型,此模型支持很是大的併發鏈接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,不多能處理數千併發鏈接。事件驅動模型由於在有更好的資源和時間管理的用戶空間(User-Space) 實現全部這前端
些任務,因此沒有這些問題。此模型的弊端是,在多核系統上,這些程序一般擴展性較差。這就是爲何他們必須進行優化以 使每一個CPU時間片(Cycle)作更多的工做。linux
#下載 wget http://fossies.org/linux/misc/haproxy-1.6.9.tar.gz #解壓 tar -zxvf haproxy-1.6.9.tar.gz cd haproxy-1.6.9 #安裝 make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy #參數說明 TARGET=linux26 #內核版本,使用uname -r查看內核,如:2.6.18-371.el5,此時該參數就爲linux26;kernel 大於2.6.28的用:TARGET=linux2628 ARCH=x86_64 #系統位數 PREFIX=/usr/local/haprpxy #/usr/local/haprpxy爲haprpxy安裝路徑
【/usr/local/haproxy/haproxy.cfg】nginx
###########全局配置######### global log 127.0.0.1 local0 #[日誌輸出配置,全部日誌都記錄在本機,經過local0輸出] log 127.0.0.1 local1 notice #定義haproxy 日誌級別[error warringinfo debug] daemon #之後臺形式運行harpoxy nbproc 1 #設置進程數量 maxconn 4096 #默認最大鏈接數,需考慮ulimit-n限制 #user haproxy #運行haproxy的用戶 #group haproxy #運行haproxy的用戶所在的組 #pidfile /var/run/haproxy.pid #haproxy 進程PID文件 #ulimit-n 819200 #ulimit 的數量限制 #chroot /usr/share/haproxy #chroot運行路徑 #debug #haproxy 調試級別,建議只在開啓單進程的時候調試 #quiet ########默認配置############ defaults log global mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK option httplog #日誌類別,採用httplog option dontlognull #不記錄健康檢查日誌信息 retries 2 #兩次鏈接失敗就認爲是服務器不可用,也能夠經過後面設置 #option forwardfor #若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從Http Header中得到客戶端ip option httpclose #每次請求完畢後主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現 #option redispatch #當serverId對應的服務器掛掉後,強制定向到其餘健康的服務器,之後將不支持 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接 maxconn 4096 #默認的最大鏈接數 timeout connect 5000ms #鏈接超時 timeout client 30000ms #客戶端超時 timeout server 30000ms #服務器超時 #timeout check 2000 #心跳檢測超時 #timeout http-keep-alive10s #默認持久鏈接超時時間 #timeout http-request 10s #默認http請求超時時間 #timeout queue 1m #默認隊列超時時間 balance roundrobin #設置默認負載均衡方式,輪詢方式 #balance source #設置默認負載均衡方式,相似於nginx的ip_hash #balnace leastconn #設置默認負載均衡方式,最小鏈接數 ########統計頁面配置######## listen stats bind 0.0.0.0:1080 #設置Frontend和Backend的組合體,監控組的名稱,按須要自定義名稱 mode http #http的7層模式 option httplog #採用http日誌格式 #log 127.0.0.1 local0 err #錯誤日誌記錄 maxconn 10 #默認的最大鏈接數 stats refresh 30s #統計頁面自動刷新時間 stats uri /stats #統計頁面url stats realm XingCloud\ Haproxy #統計頁面密碼框上提示文本 stats auth admin:admin #設置監控頁面的用戶和密碼:admin,能夠設置多個用戶名 stats auth Frank:Frank #設置監控頁面的用戶和密碼:Frank stats hide-version #隱藏統計頁面上HAProxy的版本信息 stats admin if TRUE #設置手工啓動/禁用,後端服務器(haproxy-1.4.9之後版本) ########設置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切換到其餘機器就不能訪問了。 acl web hdr(host) -i www.abc.com #acl後面是規則名稱,-i爲忽略大小寫,後面跟的是要訪問的域名,若是訪問www.abc.com這個域名,就觸發web規則,。
acl img hdr(host) -i img.abc.com #若是訪問img.abc.com這個域名,就觸發img規則。 use_backend webserver if web #若是上面定義的web規則被觸發,即訪問www.abc.com,就將請求分發到webserver這個做用域。 use_backend imgserver if img #若是上面定義的img規則被觸發,即訪問img.abc.com,就將請求分發到imgserver這個做用域。
default_backend dynamic #不知足則響應backend的默認頁面
########backend後端配置############## backend webserver #webserver做用域 mode http balance roundrobin #balance roundrobin 負載輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數 option httpchk /index.html HTTP/1.0 #健康檢查, 檢測文件,若是分發到後臺index.html訪問不到就再也不分發給它 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次正確認爲服務器可用,fall 3是3次失敗認爲服務器不可用,weight表明權重 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
1、roundrobin,表示簡單的輪詢,每一個服務器根據權重輪流使用,在服務器的處理時間平均分配的狀況下這是最流暢和公平的算法。該算法是動態的,對於實例啓動慢的服務器權重會在運行中調整。 2、static-rr,表示根據權重,建議關注;每一個服務器根據權重輪流使用,相似roundrobin,但它是靜態的,意味着運行時修改權限是無效的。另外,它對服務器的數量沒有限制。 3、leastconn,表示最少鏈接者先處理,建議關注;leastconn建議用於長會話服務,例如LDAP、SQL、TSE等,而不適合短會話協議。如HTTP.該算法是動態的,對於實例啓動慢的服務器權重會在運行中調整。 4、source,表示根據請求源IP,建議關注;對請求源IP地址進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。 只要服務器正常,同一個客戶端IP地址老是訪問同一個服務器。若是哈希的結果隨可用服務器數量而變化,那麼客戶端會定向到不一樣的服務器; 該算法通常用於不能插入cookie的Tcp模式。它還能夠用於廣域網上爲拒絕使用會話cookie的客戶端提供最有效的粘連; 該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。 5、uri,表示根據請求的URI;表示根據請求的URI左端(問號以前)進行哈希,用可用服務器的權重總數除以哈希值,根據結果進行分配。 只要服務器正常,同一個URI地址老是訪問同一個服務器。 通常用於代理緩存和反病毒代理,以最大限度的提升緩存的命中率。該算法只能用於HTTP後端; 該算法通常用於後端是緩存服務器; 該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。 6、url_param,表示根據請求的URl參數'balance url_param' requires an URL parameter name 在HTTP GET請求的查詢串中查找<param>中指定的URL參數,基本上能夠鎖定使用特製的URL到特定的負載均衡器節點的要求; 該算法通常用於將同一個用戶的信息發送到同一個後端服務器; 該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。 7、hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求; 在每一個HTTP請求中查找HTTP頭<name>,HTTP頭<name>將被看做在每一個HTTP請求,並針對特定的節點; 若是缺乏頭或者頭沒有任何值,則用roundrobin代替; 該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。 8、rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。 爲每一個進來的TCP請求查詢並哈希RDP cookie<name>; 該機制用於退化的持久模式,可使同一個用戶或者同一個會話ID老是發送給同一臺服務器。 若是沒有cookie,則使用roundrobin算法代替; 該算法默認是靜態的,因此運行時修改服務器的權重是無效的,可是算法會根據「hash-type」的變化作調整。 #其實這些算法各有各的用法,咱們平時應用得比較多的應該是roundrobin、source和lestconn。
########ACL策略定義######################### 一、#若是請求的域名知足正則表達式返回true -i是忽略大小寫 acl denali_policy hdr_reg(host) -i ^(www.inbank.com|image.inbank.com)$ 二、#若是請求域名知足www.inbank.com 返回 true -i是忽略大小寫 acl tm_policy hdr_dom(host) -i www.inbank.com 三、#在請求url中包含sip_apiname=,則此控制策略返回true,不然爲false acl invalid_req url_sub -i sip_apiname=#定義一個名爲invalid_req的策略 四、#在請求url中存在timetask做爲部分地址路徑,則此控制策略返回true,不然返回false acl timetask_req url_dir -i timetask 五、#當請求的header中Content-length等於0時返回 true acl missing_cl hdr_cnt(Content-length) eq 0 #########acl策略匹配相應################### 一、#當請求中header中Content-length等於0 阻止請求返回403 block if missing_cl 二、#block表示阻止請求,返回403錯誤,當前表示若是不知足策略invalid_req,或者知足策略timetask_req,則阻止請求。 block if !invalid_req || timetask_req 三、#當知足denali_policy的策略時使用denali_server的backend use_backend denali_server if denali_policy 四、#當知足tm_policy的策略時使用tm_server的backend use_backend tm_server if tm_policy 五、#reqisetbe關鍵字定義,根據定義的關鍵字選擇backend reqisetbe ^Host:\ img dynamic reqisetbe ^[^\ ]*\ /(img|css)/ dynamic reqisetbe ^[^\ ]*\ /admin/stats stats 六、#以上都不知足的時候使用默認mms_server的backend default_backend mms
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
http://192.168.1.22:1080/stats #說明: #1080即haproxy配置文件中監聽端口 s#tats 即haproxy配置文件中的監聽名稱