1. 程式人生 > >HAproxy指南之haproxy實現動靜分離(案例篇)

HAproxy指南之haproxy實現動靜分離(案例篇)

跳轉 host eba wget refresh fresh var ima dex

HAproxy指南之haproxy實現動靜分離(案例篇)

轉自 https://blog.51cto.com/blief/1751806

實際應用環境中,往往需要根據業務請求將相關不同請求跳轉到指定的後端server,比如客戶靜態資源請求交給靜態資源server處理,php請求交給php server處理,jsp請求交給tomcat處理,即業務上的應用請求分離,而haproxy完全可以利用acl匹配規則實現這一目的 。

一. haproxy實現應用動靜分離

如圖所示為整體的拓撲圖:

技術分享圖片

需求說明:

當客戶端訪問haproxy時,請求的是靜態文件內容時,請求轉交給static server,請求的是php內容時,請求轉交給php server,請求的是jsp內容時,請求轉交給tomcat server,以實現動靜分離

一.部署前說明:

(1)系統版本: centos 6.6(64位)

(2)角色及ip相關信息:

角色名稱 ip信息
haproxy server eth0:172.51.96.233/24 && eth1:192.168.0.233/24
static server eth1:192.168.0.247/24
php server eth1:192.168.0.235/24
tomcat server eth1:192.168.0.238/24

二. 部署操作

haproxy server上操作

編譯安裝haproxy

1.1 到haproxy官網下載haproxy源碼包如下

cd ~wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.15.tar.gz

1.2 創建haproxy運行用戶

groupadd -r haproxy useradd -g haproxy -M -s /sbin/nologin haproxy

1.3 編譯安裝haproxy:

cd ~tar zxvf haproxy-1.5.15.tar.gz -C /usr/local/srccd /usr/local/src/haproxy-1.5.15make TARGET=linux26  PREFIX=/usr/local/haproxymake install PREFIX=/usr/local/haproxy

註意:TARGET=Linux26 是通過uname -a 來查看Linux內核版本的

1.4 創建haproxy主配置文件:

mkdir /etc/haproxy/touch /etc/haproxy/haproxy.cfg

後端web server上操作

1.5 分別在img server,php server,tomcat server安裝相應的web環境並創建測試頁,其中:

(1)static server的訪問url為:http://192.168.0.247/img/haproxy.PNG ,頁面內容如下:

技術分享圖片

(2)php server的訪問url為:http://192.168.0.235/info.php ,頁面內容如下:

技術分享圖片

(3)tomcat server的訪問url為:http://192.168.238:8086/test.jsp ,頁面內容如下:

技術分享圖片

1.6 編輯haproxy server的haproxy主配置文件:

代碼內容如下

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
        log 127.0.0.1   local3            
        maxconn 204800
        chroot /usr/local/haproxy
        user  haproxy
        group haproxy
        daemon
        nbproc 1
        pidfile /var/run/haproxy.pid
        stats socket /usr/local/haproxy/stats
        description haproxy server
#---------------------------------------------------------------------
# common defaults that all the ‘listen‘ and ‘backend‘ sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
        log     global
        mode    http
        maxconn 10000
        option  httplog
        option  httpclose
        option  dontlognull
        option  forwardfor      except 127.0.0.0/8
        retries 3
        option redispatch
        option abortonclose
        balance roundrobin
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
#---------------------------------------------------------------------
# use listen setting the haproxy status for site
#---------------------------------------------------------------------
listen admin_status     #設置haproxy監控狀態
        bind *:3030
        mode http
        log 127.0.0.1 local3 err
        stats refresh 5s
        stats uri /status     #監控狀態頁面訪問url
        stats realm www.skeryp.com
        stats auth admin:admin
        stats hide-version
        stats admin if TRUE
#---------------------------------------------------------------------
# main listen which proxys to the backends
#---------------------------------------------------------------------
listen  www
        bind *:80
        maxconn 5000
        mode http
        log global
        option httplog
        option httpclose
        option forwardfor
        log         global
        default_backend default   #設置默認訪問頁面
        #定義當請求的內容是靜態內容時,將請求轉交給static server的acl規則       
        acl url_static path_beg  -i /static /p_w_picpaths /img /javascript /stylesheets
        acl url_static path_end  -i .jpg .gif .png .css .js .html 
        acl host_static hdr_beg(host)  -i img. video. download. ftp. imags. videos.
        #定義當請求的內容是php內容時,將請求轉交給php server的acl規則    
        acl url_php path_end     -i .php
        #定義當請求的內容是.jsp或.do內容時,將請求轉交給tomcat server的acl規則    
        acl url_jsp path_end     -i .jsp .do
        #引用acl匹配規則
        use_backend static_pool if  url_static or host_static
        use_backend php_pool    if  url_php
        use_backend tomcat_pool if  url_jsp
        #定義後端backend server
 backend static_pool
        option  httpchk GET /index.html
        server static1 192.168.0.247:80 cookie id1  check inter 2000 rise 2 fall 3
 backend php_pool
        option  httpchk GET /info.php
        server php1 192.168.0.235:80 cookie id1 check inter 2000 rise 2 fall 3
 backend tomcat_pool
        option  httpchk GET /index.jsp
        server tomcat1 192.168.0.238:8086 cookie id2 check inter 2000 rise 2 fall 3

#<----------------------default site for listen and frontend------------------------------------>
backend default
        mode http
        option  httpchk GET /index.html
        server default 192.168.0.127:80 cookie id1 check inter 2000 rise 2 fall 3 maxconn 5000

註意:

上面的www的配置部分也可以用frontend配置塊來替換,如下所示:

frontend www
        bind *:80
        maxconn 5000
        mode http
        log global
        option httplog
        option httpclose
        option forwardfor
        log         global
        default_backend default       
        acl url_static path_beg  -i /static /p_w_picpaths /img /javascript /stylesheets
        acl url_static path_end  -i .jpg .gif .png .css .js .html 
        acl host_static hdr_beg(host)  -i img. video. download. ftp. imags. videos.
        acl url_php path_end     -i .php
        acl url_jsp path_end     -i .jsp .do
        use_backend static_pool if  url_static or host_static
        use_backend php_pool    if  url_php
        use_backend tomcat_pool if  url_jsp
backend static_pool
        option  httpchk GET /index.html
        server static1 192.168.0.247:80 cookie id1  check inter 2000 rise 2 fall 3
 backend php_pool
        option  httpchk GET /info.php
        server php1 192.168.0.235:80 cookie id1 check inter 2000 rise 2 fall 3
 backend tomcat_pool
        option  httpchk GET /index.jsp
        server tomcat1 192.168.0.238:8086 cookie id2 check inter 2000 rise 2 fall 3

備註: listen配置塊是frontend和backend的組合體,listen裏面可以單獨配置backend不配置frontend,也可以組合使用,即listen配置區域可以交差使用frontend和backend的配置,如acl可以配置到frontend塊, 也可以直接配置到listen塊,但是不能配置到backend塊。如backend的中server可以直接配置到listen配置區域,但不能直接配置到frontend配置區域

1.7 重啟haproxy服務:

server haproxy restart

關於haproxy服務腳本代碼請訪問:http://blief.blog.51cto.com/6170059/1750573

三. 結論測試

在客戶端訪問:http://172.51.96.233/img/haproxy.PNG,可以發現haproxy將請求轉交給後端static server了。如下:

技術分享圖片

訪問:http://172.51.96.233/info.php,可以發現haproxy將請求轉交給後端php server了。如下:

技術分享圖片

訪問:http://172.51.96.233/test.jsp,可以發現haproxy將請求轉交給後端tomcat server了。如下所示:

技術分享圖片

從上可知:haproxy已經成功實現了動靜分離,即靜態內容交由靜態server處理,動態內容交由動態處理的server處理

如果我們要查看各個server的健康狀態,可以登錄:http://172.51.96.233:3030/admin,如下

技術分享圖片

總結:haproxy可以利用acl規則匹配url做相應的請求跳轉,比如動靜分離,域名跳轉等等應用需求,haproxy是一款性能很強大的四層以及七層代理server。

HAproxy指南之haproxy實現動靜分離(案例篇)