ども、cloudpack の かっぱ (@inokara) です。
はじめに
前回の続き。リクエストパスを正規表現でマッチさせることも出来るので試してみる。
準備
haproxy.cfg
path_reg
を利用すると URL のパスを正規表現でマッチ出来るようになる。
frontend balancer-test mode http option forwardfor bind 0.0.0.0:8000 # acl foo path_reg ^/(firefox|Firefox|fireFox)/?$ acl bar path_reg ^/(chrome|Chrome/chRome)/?$ acl crm hdr_sub(User-Agent) -i Chrome acl fox hdr_sub(User-Agent) -i Firefox acl hoge src xxx.xxx.xxx.xxx/32 acl fuga src yyy.yyy.yyy.yyy/32 # use_backend firefox_bk if hoge foo use_backend chrome_bk if fuga bar default_backend aa backend firefox_bk mode http option forwardfor server web01 127.0.0.1:8081 check backend chrome_bk mode http option forwardfor server web02 127.0.0.1:8082 check
上記の例ではリクエストパスが firefox
又は Firefox
又は fireFox
且つ、複合条件として接続元が xxx.xxx.xxx.xxx/32
からの時のみ firefox_bk
にアクセスさせる。同様にリクエストパスが chrome
又は Chrome
又は chRome
且つ、複合条件として接続元が yyy.yyy.yyy.yyy/32
からの時のみ chrome_bk
にアクセスさせる。
バックエンド
バックエンドは以下のように用意。どちらのバックエンドでも同様に用意する。
require 'sinatra' require 'sinatra/reloader' require "sinatra/multi_route" get '/:p' do params[:p] end
リクエストパスをそのまま表示するだけのスクリプト。
確認
以下、xxx.xxx.xxx.xxx/32 からアクセス。
/firefox => マッチする
% http http://zzz.zzz.zzz.zzz:8000/firefox HTTP/1.1 200 OK Content-Length: 7 Content-Type: text/html;charset=utf-8 Server: thin 1.5.0 codename Knife X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block firefox
/Firefox => マッチでーす
% http http://zzz.zzz.zzz.zzz:8000/Firefox HTTP/1.1 200 OK Content-Length: 7 Content-Type: text/html;charset=utf-8 Server: thin 1.5.0 codename Knife X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block Firefox
/fireFox => 近藤マッチでーす
% http http://zzz.zzz.zzz.zzz:8000/fireFox HTTP/1.1 200 OK Content-Length: 7 Content-Type: text/html;charset=utf-8 Server: thin 1.5.0 codename Knife X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block fireFox
/fffox => アンマッチでーす
path_reg
に未定義の URL なので default_backend
に振り分けられる。
% http http://zzz.zzz.zzz.zzz:8000/fffox HTTP/1.1 404 Not Found Content-Length: 284 Content-Type: text/html; charset=iso-8859-1 Date: Fri, 09 Jan 2015 09:56:08 GMT Server: Apache404 Not Found Not Found
The requested URL /fffox was not found on this server.
Apache Server at zzz.zzz.zzz.zzz Port 8000
確認(2)
以下、yyy.yyy.yyy.yyy/32 から接続。
/firefox
$ http GET http://zzz.zzz.zzz.zzz:8000/firefox HTTP/1.1 404 Not Found Date: Fri, 09 Jan 2015 10:06:13 GMT Server: Apache/2.2.29 (Amazon) Content-Length: 286 Content-Type: text/html; charset=iso-8859-1404 Not Found Not Found
The requested URL /firefox was not found on this server.
Apache Server at zzz.zzz.zzz.zzz Port 8000
該当するパスでアクセスしても接続元の IP が条件に合致しないので default_backend
に振り分けられる。
最後に
わかった事
- 複数の条件を与えることが出来る
acl
にてpath_reg
を利用することで正規表現による振り分けを定義することが出来る
試せて無いこと
path_reg
以外にurl_reg
等もあるらしいので引続き試す
元記事はこちらです。
「HAProxy の acl によるバックエンドへの振り分けを色々と試す(2)(リクエストパスを正規表現でマッチさせる)」