Perlbalを導入した時のメモです。
概要
PerlbalのURLキャッシュ機能について
PerlbalでMogileFSを更に高速化、効率化する - builder by ZDNet Japan
構成
PerlbalとAppサーバは、一つのサーバにあるとします。
Perlbalの「ロードバランサー」「リバースプロキシ」「ウェブサーバ」の機能を利用します。
また「X-REPROXY」機能も利用します。
「ロードバランサー」は、ポート80番をListenしています。
「リバースプロキシ」は、「ロードバランサー」に来たリクエストをAppサーバに投げます。
「ウェブサーバ」は、静的ファイルを配信するサーバです。
Appは、静的ファイルのリクエストが来たら「X-REPROXY-URL」「X-REPROXY-CACHE-FOR」に値をセットして、Perlbalにレスポンスを返すようにします。
「X-REPROXY-URL」には、Perlbalの「ウェブサーバ」へのURLをセットします。
この構成は、下記の資料の最後の方に提案されているものになっています(ちゃんとなっているといいなぁ)。
将来的にMogileFSを導入することを想定しています。
http://nekokak.org/presen/yapcasia2010-server/
perlbalの設定
perlbalの設定は下記のようにしました。
# アプリケーションサーバ (5000番にリクエストを送る)
CREATE POOL app_pool
POOL app_pool ADD 0.0.0.0:5000
# ロードバランサー (80番をlisten)
LOAD vhosts
CREATE SERVICE http_server
SET role = selector
SET listen = 0.0.0.0:80
SET plugins = vhosts
VHOST 192.168.0.5 = hogehoge_proxy
ENABLE http_server
# Reverse Proxy(アプリケーションサーバへ)
CREATE SERVICE hogehoge_proxy
SET role = reverse_proxy
SET pool = app_pool
# X-REPROXY-URL, X-REPROXY-CACHE-FORの有効化
SET enable_reproxy = true
SET reproxy_cache_maxsize = 512000
SET persist_client = on
SET persist_backend = on
SET verify_backend = on
ENABLE hogehoge_proxy
# Web Server 静的ファイル用サーバ (8888番をlisten)
CREATE SERVICE static
SET role = web_server
SET listen = 0.0.0.0:8888
SET docroot = /path/to/public/static/
SET dirindexing = 1
SET persist_client = on
ENABLE static
下記のコマンドでperlbalを起動
sudo perlbal -c config.conf -d
アプリケーション
Mojolicious::Liteで書きました。
use Mojolicious::Lite; get '/' => sub { my $self = shift; $self->render; } => 'index'; ## 静的ファイルへのリクエスト get '/image/(:file)' => sub { my $self = shift; my $filename = join('.', $self->stash('file'), $self->stash('format')); set_reproxy($self, $filename, 'image'); $self->render(data => '', format => $self->stash('format')); } => 'image'; get '/css/(:file)' => sub { my $self = shift; my $filename = join('.', $self->stash('file'), $self->stash('format')); set_reproxy($self, $filename, 'css'); $self->render(data => '', format => $self->stash('format')); } => 'css'; get '/js/(:file)' => sub { my $self = shift; my $filename = join('.', $self->stash('file'), $self->stash('format')); set_reproxy($self, $filename, 'js'); $self->render(data => '', format => $self->stash('format')); } => 'js'; sub set_reproxy { my ($controller, $file, $type) = @_; # perlbalのwebサーバにreproxy my $reproxy_url = qq(http://localhost:8888/$type/$file); # X-REPROXY-URL, X-REPROXY-CACHE-FORにセット $controller->res->headers->header('x-reproxy-url' => $reproxy_url); $controller->res->headers->header('x-reproxy-cache-for' => "51200; Content-Type"); } app->start; __DATA__ @@ index.html.ep <html> <head> <title>Test</title> </head> <body> <h1>Test</h1> <img src="<%= url_for('image', file => 'example.jpg') %>"><br> <a href="<%= url_for('js', file => 'example.js') %>">js</a><br> <a href="<%= url_for('css', file => 'example.css') %>">css</a><br> </body> </html>
レスポンスの返し方が適切なのか、かなり不安です^^;
下記のコマンドで起動。
plackup -S Starlet -p 5000 app.pl