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、查看動態頁面由哪組服務器響應的?
說明:
從上圖可以看出,動態頁面由webservers這組服務器響應的。
2、查看靜態頁面由哪組服務器響應?
從上圖知道,用戶請求的URL以.jpg或.png或.js,都被haproxy調度到 static這組服務器
2、查看用戶請求js模式表,haproxy是否也把該請求調度到static服務器組
從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
說明:
通過上述修改後,已經能夠實現動靜分離了