ども、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: Apache



404 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-1



404 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)(リクエストパスを正規表現でマッチさせる)