在前端領域做負載均衡,動靜分離的程序有很多,比較常用的是nginx和Haproxy,今天就說一下
Haproxy在這兩方面的表現,文章參考很多網文寫成,再加上自己的實驗成果,文中所有解釋都經過實際環境驗證。
環境介紹:
Centos 6.5
Haproxy 1.7.9
前端 192.168.6.10
後端 192.168.6.20(web1) 192.168.6.21(web2)
圖片服務器 192.168.6.22(img01)
1.安裝Haproxy
wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.9.tar.gz tar -xvf haproxy-1.7.9.tar.gz mkdir /usr/local/haproxy cd haproxy-1.7.9 make TARGET=/usr/local/haproxy make install
2.編輯配置文件
vim /usr/local/haproxy/conf/haproxy.cfg
###########全局配置######### global log 192.168.6.11 local0 info #[日誌輸出配置,info日誌都記錄在遠程服務器,通過local6輸出,不需要ssh驗證機制] log 127.0.0.1 local0 notice #定義haproxy notice日誌記錄在本機 此級別比較常用 #日誌級別 #emerg 0 系統不可用 #alert 1 必須馬上採取行動的事件 #crit 2 關鍵的事件 #err 3 錯誤事件 #warning 4 警告事件 #notice 5 普通但重要的事件 #info 6 有用的信息 daemon #以後臺形式運行harpoxy nbproc 1 #設置進程數量 pidfile /home/haproxy/haproxy/conf/haproxy.pid #haproxy 進程PID文件 ulimit-n 819200 #ulimit 的數量限制 maxconn 4096 #默認最大連接數,需考慮ulimit-n限制 #chroot /usr/share/haproxy #chroot運行路徑 uid 99 #運行haproxy 用戶 UID 99是nobody用戶 gid 99 #運行haproxy 用戶組gid #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-alive 10s #默認持久連接超時時間 #timeout http-request 10s #默認http請求超時時間 #timeoutqueue 1m #默認隊列超時時間 balance roundrobin #設置默認負載均衡方式,輪詢方式 #balance source #設置默認負載均衡方式,類似於nginx的ip_hash #balnace leastconn #設置默認負載均衡方式,最小連接數 ########統計頁面配置######## listen admin_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 20s #統計頁面自動刷新時間 stats uri /666-stats #統計頁面url stats realm XingCloud\ Haproxy #統計頁面密碼框上提示文本 #stats realm Haproxy\ Statistics #統計頁面密碼框上提示文本 stats auth admin:admin123 #設置監控頁面的用戶和密碼: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/503.hh #文件名和後綴可隨便起,瀏覽器都可以正常顯示 #errorfile 504 /home/haproxy/haproxy/errorfiles/504.http #errorloc 404 /home/haproxy/404.htm errorloc 503 /home/haproxy/503.hh #後端有一臺報錯,直接跳轉到此頁面 ########frontend前端配置############## bind *:80 #這裏建議使用bind *:80的方式,要不然做集羣高可用的時候有問題,vip切換到其他機器就不能訪問了。 acl webserver hdr(host) -i www.abc.com #acl後面是規則名稱,-i是要訪問的域名, acl url_static path_beg -i /upload/ acl url_static path_end -i .jpg .jpeg .gif .png .css .js .html use_backend imgserver if url_static #如果匹配靜態規則就跳轉到imgserver default_backend webserver #默認規則 #如果訪問www.abc.com這個域名就分發到下面的webserver 的作用域。 #如果訪問img.abc.com.cn就分發到imgserver這個作用域。 #use_backend webserver if web #設置了默認規則,這裏可以不設置 #use_backend imgserver if img ########backend後端配置############## backend webserver #webserver作用域 cookie srv insert nocache #插入一個cookie,在下次用戶登錄時登錄到同樣的後端 balance roundrobin #banlance roundrobin 輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數 option httpchk GET /index.html #HTTP/1.0 #健康檢查 #檢測文件,如果分發到後臺index.html訪問不到就不再分發給它 server web1 192.168.6.20:80 cookie web1 weight 5 check inter 2000 rise 2 fall 3 server web2 192.168.6.21:80 cookie web2 weight 3 check inter 2000 rise 2 fall 3 #cookie web1表示cookie名稱爲web1,check inter 1500 是檢測心跳頻率 #rise 2是2次正確認爲服務器可用,fall 3是3次失敗認爲服務器不可用,weight代表權重 backend imgserver option httpchk /upload/ #檢測文件夾是否存在 balance roundrobin server img01 192.168.6.22:80 check inter 2000 fall 3
3.增加Haproxy日誌存放位置
Haproxy日誌默認是存放在/var/log/message,但是message裏信息較多,建議分離出自己想要的部分到別的日誌文件中
①vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r -m 0 -c 2"
②vim /etc/rsyslog.conf
去掉以下兩行的註釋:
$ModLoad imudp $UDPServerRun 514
添加一行:
local5.* /var/log/haproxy/haproxy.log #級別爲5的日誌存放位置,各級文件夾必須存在
③重啓rsyslog
service rsyslog restart
完成後Message和haproxy.log中會同時存在日誌,因級別不同,顯示內容也就會不同
4.啓動Haproxy
cd /usr/local/haproxy/
./sbin/haproxy -f conf/haproxy.cfg
觀察日誌 tail /var/log/message
出現以上提示爲啓動成功
出現以上提示爲後端其中一臺服務器連接失敗
5.訪問http://192.168.6.10/666-stats,輸入用戶名密碼後出現如下界面:
3個服務器連接正常,可以提供服務!
注:附一張緩存插入成功的截圖,僅供參考,圖片是360極速瀏覽器的截圖