HAProxy的是一個免費的、開源的的tcp/http反向代理工具、負載均衡器,是一個企業非常快速和可靠的安全的解決方案,提供高可用性、高併發性,負載均衡和代理對TCP和基於HTTP的應用程序。它特別適用於流量非常高的網站。它已成爲事實上的標準開源負載均衡器,現在隨大多數主流Linux發行版一起提供,在互聯網領域應用也是非常廣泛,受歡迎的第三方工具。
在企業實際應用環境中,往往會根據業務請求將相關不同請求跳轉到指定的後端服務器,比如客戶靜態資源請求交給後端靜態資源服務器處理,php請求交給後端動態資源Apache服務進行處理,jsp請求交給後端動態資源tomcat服務進行處理,即業務上的應用請求分離,我們這裏可以通過haproxy完全可以利用acl匹配規則實現這一目的,以實現動靜分離效果;除了haproxy外,其實還可以通過nginx的acl規則也可以完全實現,不過這些強大的工具往往是在Linux服務器上面跑才能發揮最佳性能,其實這些東西安裝和配置非常簡單,只需要有Linux基礎,懂得一些Linux基礎的命令就完全可以實現強大的功能,我也是在《Linux就該這麼學》這本樹入門Linux,非常適合於初學者。
現在好多企業購買負載均衡器硬件設備,其實這些硬件設備都是通過潛入軟件來實現的,可能性能還沒有那麼好,haproxy實現tcp和http負載均衡非常靠譜的,我們企業現在入口幾十萬的併發,在前端部署幾天Linux服務器安裝haproxy完全毫無壓力的,而且效果非常明顯,開始沒有用到haproxy的時候用戶一直反饋訪問非常卡,因爲開始是直接訪問Windows服務器,這樣不安全並且給業務服務器壓力也非常大,還有可能導致業務直接奔潰。Haproxy用戶負載均衡在Linux服務器上面跑還是非常好的,會話速率快、會話併發高、數據轉化率快這些都是haproxy的一些性能上面的優勢。
下面我們通過一個簡單的案例來實現HAproxy動靜分離效果,需求如下:
1、靜態頁面的請求發送到 web1;
角色名稱 |
ip信息 |
haproxy server |
eth0:172.51.96.233/24 && eth1:192.168.3.22/24 |
static server |
eth1:192.168.3.24/24 |
php server |
eth1:192.168.3.9/24 |
tomcat server |
eth1:192.168.3.9/24 |
1、官網下載haproxy-1.8.9.tar.gz安裝包(需要翻牆);
# wgethttp://www.haproxy.org/download/1.8/src/haproxy-1.8.9.tar.gz
# useradd -g haproxy -M -s /sbin/nologinhaproxy
# tar zxvf haproxy-1.8.9.tar.gz
# make TARGET=linux2628 PREFIX=/usr/local/haproxy
# make install PREFIX=/usr/local/haproxy
注意:TARGET=Linux31 是通過uname -a 來查看Linux內核版本的,kernel 大於2.6.28的用:TARGET=linux2628
drwxr-xr-x 3 root root 21 May 23 15:56 doc
drwxr-xr-x 2 root root 21 May 23 15:56 sbin
drwxr-xr-x 3 root root 17 May 23 15:56 share
[root@web-3-22 haproxy]# yum install haproxy.x86_64
[root@web-3-22 haproxy]#mkdiretc
[root@web-3-22 haproxy]# cd etc/
5、haproxy配置
[root@web-3-22 etc]# vim haproxy.cfg
maxconn 500000 # Max simultaneous connections from an upstream server
spread-checks 5 # Distribute health checks with some randomness
option forwardfor except 127.0.0.0/8
stats realm Haproxy\ Statistics
stats auth hadmin:yhXV2WAbybXd1euzEXbEADAe
default_backend default #設置默認訪問資源頁面
#定義當請求的內容是靜態內容時(圖片、視頻、js、css、html),將請求轉交給靜態資源服務器的acl規則
aclurl_staticpath_beg -i /static /images /img /javascript /stylesheets
aclurl_staticpath_end -i .jpg .gif .png .css .js .html
aclhost_statichdr_beg(host) -iimg. video. download. ftp. imags. videos.
#定義當請求的內容是php內容時,將請求轉交給php動態資源服務器的acl規則
#定義當請求的內容是.jsp或.do內容時,將請求轉交給tomcat動態資源服務器的acl規則
aclurl_jsppath_end -i .jsp .do
use_backendstatic_poolif url_static or host_static
use_backendtomcat_poolif url_jsp
option httpchk GET /index.html
server static1 192.168.3.24:80 cookie id1 check inter 2000 rise 2 fall 3
server php1 192.168.3.9:80 cookie id1 check inter 2000 rise 2 fall 3
server tomcat1 192.168.3.9:8080 cookie id2 check inter 2000 rise 2 fall 3
#<----------------------default site for listen and frontend------------------------------------>
option httpchk GET /index.html
server default 192.168.3.24:80 cookie id1 check inter 2000 rise 2 fall 3 maxconn 5000
# chown -R haproxy:haproxy /usr/local/haproxy/
#啓動haproxy報錯,可能是端口衝突導致的,檢查haproxy listen配置,我這配置文件監聽的是80端口,此主機的80端口被httpd佔用了,停止httpd服務,再次啓動haproxy就正常了;
6、服務狀態
service haproxy start //啓動服務
service haproxy stop //停止服務
service haproxystatus //服務狀態
chkconfighaproxyon //開機啓動
三、測試haproxy效果如下:
2、測試html靜態資源
http://192.168.3.22/index.html
3、測試php動態資源
http://192.168.3.22:8888/admin?stats