haproxy實現Discuz!動靜分離

     haproxy工作在用戶空間(工作在第七層),能夠識別應用層(http報文)的數據。所以,可以根據用戶的請求類別的不同向不同服務羣組調度的。也就是haproxy可以識別http報文的請求信息,做訪問控制;

比如:

    一組服務器處理動態資源:jsp、php

    一組服務器處理靜態資源:如:用戶請求的是圖片等

不讓動態服務器響應靜態資源。jsp或php頁面都是由應用程序服務器執行之後來響應的。所以通常情況下,爲了提高應用程序服務器處理動態頁面的效率。通常要對用戶的請求做動靜分離。使用七層調度器把用戶的請求調度到指定的服務器。還有靜態資源是可以緩存的,這樣還可以提高網站的響應速度。藉助CDN網絡,把靜態資源緩存到用戶的家門口。。。。。。

haproxy通過acl來做訪問控制的。格式如下:

  acl <aclname> <criterion> [flags] [operator] <value> ... 
      acl列表名稱 測試標準    標誌位   測試條件表達式

一、配置文件如下:

frontend main
    bind :80
    acl  url_static  path_beg  -i /static  /images -----> 使用acl關健字定義訪問控制列表:url_static.匹配該訪問列表的條件是:用戶請求的url是以:/static 或 /images 開頭的url.
    acl  url_static  path_end  -i .jpg .gif .png ------> 訪問控制列表url_static的規則是:從用戶請求資源的url的後面做字符匹配,匹配規則是:以.jpg 或 .gif 或 .png 結尾的url都被匹配到。
    use_backend   static  if url_static   ------->對用戶的請求做acl訪問控制,如果符合 url_static 定義的訪問控制規則的話,就把這些請求調度到 static 標識的上游服務中。
    default_backend webservers   ------> 沒有被 url_static 訪問控制列表匹配到的請求都被調度到 webservers標識的上游服務器。
    option forwardfor  except 127.0.0.0/8

backend    webservers   ------> 定義上游服務器 webservers 來響應用戶的動態請求
    balance   roundrobin
    rspadd X-Via:app  ----> 自定義一個響應首部信息。查看http報文就可以知道該請求是由那組後端服務器響應的。
    cookie    webserver insert nocache
    option    httpchk
    server s1 172.16.0.99 cookie s1 check port 80  weight 1
    server b1 127.0.0.1:8080 backup

    stats  enable   --------> haproxy 的狀態頁
    stats  hide-version
    stats  uri /haproxy?stats
    stats  scope .
    stats  realm  HAPorxy\ Statistics
    stats  auth   admin:admin
    stats  admin  if TRUE
backend  static   ---------> 定義上游服務器 static 來響應用戶的靜態請求
    balance   roundrobin
    rspadd X-Via:static    -----> 自定義一個響應首部信息。查看http報文就可以知道該請求是由那組後端服務器響應的。
    option    httpchk
   server s2 172.16.0.88 cookie s2 check port 80  weight 1

訪問測試:

1、查看動態頁面由哪組服務器響應的?

wKiom1QgwgXg0bnpAAUVSDZKPZw734.jpg


wKiom1QgxImDVYbuAAOj91KqcE8526.jpg

說明:

    從上圖可以看出,動態頁面由webservers這組服務器響應的。

2、查看靜態頁面由哪組服務器響應?

wKiom1QgwqfBgM-zAAUL8WKm8-g893.jpg再查看 



wKiom1Qgwt-BtEp9AAM1pWg5THw499.jpg說明:

    從上圖知道,用戶請求的URL以.jpg或.png或.js,都被haproxy調度到 static這組服務器

2、查看用戶請求js模式表,haproxy是否也把該請求調度到static服務器組

wKiom1QgxcHRivX_AASI-8oF6Kw995.jpg說明:

    從http報文分析,用戶請求js樣式表屬於向服務發起動態請求,所以不應該把該請求定向到static服務器組。所以要進行haproxy的acl進行修改。

二、修改haproxy的配置文件

frontend main
    bind :80
    acl  url_static  path_beg  -i /static/images  
    acl  url_static  path_end  -i .jpg .gif .png
    use_backend   static  if url_static
    default_backend webservers
    option forwardfor  except 127.0.0.0/8

訪問測試

1、查看用戶請求js

wKiom1QgxsTgZ3ODAANrAxyEto4507.jpg2、查看請求圖片資源

wKiom1QgxxHyNf8DAARHOmx-Jes787.jpg再查看

wKiom1QgxziSJe6eAAMsnGMAyk4758.jpg再查看

wKiom1Qgx1rg4HybAAMizyBR5PI352.jpg

說明:

   通過上述修改後,已經能夠實現動靜分離了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章