HAProxy的ACL能夠對接收到的報文進行匹配和過濾,基於請求報文頭部中的源地址、源端口、目標地址、目標端口、請求方法、URL、文件後綴等信息內容進行匹配並執行進一步操做。javascript
語法格式: acl <aclname> <criterion> [flags] [operator] [<value>] acl acl名稱 條件 條件標記位 具體操做符 操做對象類型
criterionphp
hdr([<name> [,<occ>]]):徹底匹配字符串 hdr_beg([<name> [,<occ>]]):前綴匹配 hdr_dir([<name> [,<occ>]]):路徑匹配 hdr_dom([<name> [,<occ>]]):域匹配 hdr_end([<name> [,<occ>]]):後綴匹配 hdr_len([<name> [,<occ>]]):長度匹配 hdr_reg([<name> [,<occ>]]):正則表達式匹配 hdr_sub([<name> [,<occ>]]):子串匹配 dst 目標IP dst_port 目標PORT src 源IP src_port 源PORT
flagshtml
-i 不區分大小寫 -m 使用指定的pattern匹配方法 -n 不作DNS解析 -u 禁止acl重名,不然多個同名ACL匹配或關
operatorjava
整數比較:eq、ge、gt、le、lt 字符比較: - exact match (-m str) :字符串必須徹底匹配模式 - substring match (-m sub) :在提取的字符串中查找模式,若是其中任何一個被發現,ACL將匹配 - prefix match (-m beg) :在提取的字符串首部中查找模式,若是其中任何一個被發現,ACL將匹配 - suffix match (-m end) :將模式與提取字符串的尾部進行比較,若是其中任何一個匹配,則ACL進行 匹配 - subdir match (-m dir) :查看提取出來的用斜線分隔(「/」)的字符串,若是其中任何一個匹配,則 ACL進行匹配 - domain match (-m dom) :查找提取的用點(「.」)分隔字符串,若是其中任何一個匹配,則ACL進 行匹配
valuejquery
- Boolean #布爾值false,true - integer or integer range #整數或整數範圍,好比用於匹配端口範圍,1024~32768 - IP address / network #IP地址或IP範圍, 192.168.0.1 ,192.168.0.1/24 -string exact –精確比較 substring—子串 www.magedu.com suffix-後綴比較 prefix-前綴比較 subdir-路徑,/wp-includes/js/jquery/jquery.js domain-域名,www.magedu.com - regular expression #正則表達式 - hex block #16進制
多個acl做爲條件時的邏輯關係 linux
與:隱式(默認)使用 或:使用"or" 或 "||"表示 否認:使用"!" 表示
示例1:根據用戶的請求的域名的不一樣作匹配
1.修改haproxy配置文件nginx
frontend web bind 172.20.27.20:80 mode http acl pc_web_page hdr(host) -i www.mylinuxops.com #忽略大小寫匹配報文頭部的主機名 acl m_web_page hdr(host) -i m.mylinuxops.com use_backend pc_server if pc_web_page #ACL的調用 use_backend m_server if m_web_page default_backend backup_server #當請求都不符合時調轉到默認頁面 backend pc_server server web1 192.168.27.21:80 weight 1 check inter 3s fall 3 rise 5 backend m_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5 backend back_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5
2.測試web
[root@localhost ~]# vim /etc/hosts [root@localhost ~]# curl m.mylinuxops.com #匹配到規則後調用後端對應的服務器 m.mylinuxops.com [root@localhost ~]# curl www.mylinuxops.com www.mylinuxops.com [root@localhost ~]# curl dl.mylinuxops.com #沒有匹配到規則調用默認的服務器 welcome to mylinuxops.com
與:當用戶請求的域名即知足第一個匹配條件也知足第二個條件時就調用後端的服務器組
或:當用戶請求的域名知足第一個匹配條件或者第二個條件就調用某個後端服務器組
非:當用戶的請求不知足條件是調用某個後端的服務器組
示例:或的使用
1.修改haproxy配置文件正則表達式
frontend web bind 172.20.27.20:80 mode http acl pc_web_page hdr_dom(host) -i www.mylinuxops.com #配置acl規則,規則名字pc_web_page,匹配用戶請求的域名,忽略大小寫,匹配的內容爲www.mylinuxops.com acl mobile_web_page hdr_dom(host) -i m.mylinuxops.com #配置acl規則,規則名字mobile_web_page,匹配用戶請求的域名,忽略大小寫,匹配的內容爲m.mylinuxops.com use_backend pc_server if pc_web_page #配置調用規則,當匹配規則所定義的條件時,調用pc_host所定義的後端服務器 use_backend mobile_server if mobile_web_page #配置調用規則,當匹配規則所定義的條件時,調用mobile_host所定義的後端服務器 backend pc_server server web1 192.168.27.21:80 weight 1 check inter 3s fall 3 rise 5 backend mobile_host server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5 backend backup_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5
2.測試chrome
[root@localhost ~]# curl www.mylinuxops.com www.mylinuxops.com #返回的爲web1上虛擬主機定義的主頁面 [root@localhost ~]# curl m.mylinuxops.com ojbk #因爲後端服務器沒有此域名的虛擬主機,因此返回了一個服務器默認的index.html頁面
使用acl,對IP地址作匹配,作到從某個地址或者地址段來的就調度到哪一個後端的服務器上
示例:
frontend web bind 172.20.27.20:80 mode http acl ip_range_test src 192.168.27.0/24 172.20.27.10 use_backend m_server if ip_range_test default_backend backup_server backend pc_server server web1 192.168.27.21:80 weight 1 check inter 3s fall 3 rise 5 backend m_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5 backend backup_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5
測試
查看nginx上測試頁面
[root@web2 ~]# cat /data/www/index.html m.mylinuxops.com [root@web2 ~]# cat /apps/nginx/html/index.html welcome to mylinuxops.com
在172.20.27.10上測試訪問
[root@localhost ~]# curl m.mylinuxops.com m.mylinuxops.com #訪問到了m.mylinuxops.com的主頁面 [root@localhost ~]# curl www.mylinuxops.com welcome to mylinuxops.com #因爲後端沒有設定www.mylinux.com的virtualserver所裏跳轉到了默認頁面
使用acl對地址段作判斷,對匹配的作拒絕操做
frontend web bind 172.20.27.20:80 mode http acl ip_range_test src 192.168.27.0/24 172.20.27.10 block if ip_range_test #對ip地址段作拒絕時使用block default_backend backup_server #option httpchk HEAD /monitor-page/index.html HTTP/1.0 backend pc_server server web1 192.168.27.21:80 weight 1 check inter 3s fall 3 rise 5 backend m_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5 backend backup_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5
測試
使用172.20.27.10主機進行訪問
[root@localhost ~]# curl www.mylinuxops.com <html><body><h1>403 Forbidden</h1> #被拒絕 Request forbidden by administrative rules. </body></html> [root@localhost ~]# curl m.mylinuxops.com <html><body><h1>403 Forbidden</h1> Request forbidden by administrative rules. </body></html>
1.取得各瀏覽器的user-agent信息
#google Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36 #FireFox Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0
取出user-agent中具備特徵意義的部分做爲匹配條件,google(Chrome),FireFox(Firefox)
2.修改配置文件
frontend web bind 172.20.27.20:80 mode http acl google hdr(user-agent) -m sub -i "Chrome" #匹配請求首部user-agent中的字串是否包含chrome acl firefox hdr(user-agent) -m sub -i "Firefox" #匹配字串中是否有Firefox use_backend pc_server if google use_backend m_server if firefox default_backend backup_server backend pc_server server web1 192.168.27.21:80 weight 1 check inter 3s fall 3 rise 5 backend m_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5 backend backup_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5
測試
使用不一樣瀏覽器訪問時分別被送到後端不一樣的服務器上
當被acl規則匹配到後也能夠將訪問的url進行重定向,使用redirect進行調用規則
示例:當瀏覽器爲firefox時調度到baidu.com
frontend web bind 172.20.27.20:80 mode http acl google hdr(user-agent) -m sub -i "Chrome" use_backend pc_server if google acl firefox hdr(user-agent) -m sub -i "Firefox" redirect prefix http://www.baidu.com if firefox #當瀏覽器爲firefox時重定向到百度 backend pc_server server web1 192.168.27.21:80 weight 1 check inter 3s fall 3 rise 5 backend m_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5
測試
haproxy能夠使用acl中的path_end,基於所要訪問的文件的後綴作動靜分離的匹配
示例:
1.修改HAProxy配置文件
frontend web bind 172.20.27.20:80 mode http acl php path_end -i .php #配置acl acl名爲php 匹配後綴爲 .php 忽略大小寫 acl image path_end -i .jpg .jpeg .gif .png #配置acl acl名爲image 匹配後綴爲 .jpg .jpeg .gif .png 忽略大小寫 use_backend php_server if php #配置調用規則當匹配php的條件時,調用php_server use_backend image_server if image #匹配調用規則當匹配image的條件時,調用image_server backend php_server server web1 192.168.27.21 check port 80 inter 3s fall 3 rise 5 backend image_server server web1 192.168.27.22 check port 80 inter 3s fall 3 rise 5
2.修改nginx+php服務器配置
[root@php ~]# vim /apps/nginx/conf/servers/mylinuxops.conf server { server_name www.mylinuxops.com; listen 80; access_log /apps/nginx/logs/mylinuxops.log access_json; location / { root /data/www; index index.html; } location ~ \.php$ { root /data/php; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
3.建立網站頁面
[root@php ~]# mkdir /data/php/ [root@php ~]# vim /data/php/index.php <?php phpinfo(); ?>
4.修改靜態服務器配置文件
[root@image ~]# vim /apps/nginx/conf/servers/mylinuxops.conf server { server_name www.mylinuxops.com; listen 80; access_log /apps/nginx/logs/mylinuxops.log access_json; location / { root /data/www; index index.html; } }
5.在資源路徑下添加圖片
[root@localhost ~]# ls /data/www/ 1.png index.html
測試
haproxy中也能夠基於文件訪問的頭部作匹配將其進行動靜分離,好比某幾個目錄內都爲靜態文件,則將這幾個目錄進行匹配
示例:
修改配置文件
frontend web bind 172.20.27.20:80 mode http acl php_path path_end -i php #定義匹配PHP後綴文件 acl static_path path_beg -i /static /images /javascript /tfs #定義匹配靜態文件的目錄 use_backend php_server if php_path #php後綴文件調用後端php_server use_backend static_server if static_path #靜態資源路徑時調用後端static_server backend php_server server web1 192.168.27.21:80 weight 1 check inter 3s fall 3 rise 5 backend static_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5 backend backup_server
配置後端php服務器
[root@php ~]# cat /data/www/php/index.php <?php phpinfo(); ?>
配置後端static服務器
[root@static ~]# ls /data/www/images/1.png /data/www/images/1.png
測試訪問以php結尾文件
測試訪問/images開頭的文件
修改haproxy配置文件
frontend web bind 172.20.27.20:80 mode http #http的訪問控制須要基於http的模式來進行 acl php_path path_end -i php acl static_path path_beg -i /static /images /javascript /tfs acl client_deny src 172.20.27.0/18 #定義拒絕訪問的源地址 http-request deny if client_deny #對匹配到的源地址發來的請求進行拒絕 use_backend php_server if php_path use_backend static_server if static_path backend php_server server web1 192.168.27.21:80 weight 1 check inter 3s fall 3 rise 5 backend static_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5 backend backup_server server web2 192.168.27.22:80 weight 1 check inter 3s fall 3 rise 5
使用172.20.27.0網段的客戶機測試訪問
[root@localhost ~]# curl www.mylinuxops.com <html><body><h1>403 Forbidden</h1> #請求被拒絕 Request forbidden by administrative rules. </body></html>