読者です 読者をやめる 読者になる 読者になる

Perlbalの設定メモ

Perlbalを導入した時のメモです。

構成

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