天然パーマです。

CatalystアプリケーションをStarmanで運用しよう!

Starmanというmiyagawaさんが目下開発中のPerl製Webサーバがあります。 PSGIをサポートして高速であることが特徴です。 おとといにバージョン0.1000がCPANにアップロードされたばかりという新しいものですが、 とあるエロサイトでStarmanを導入したので、その件について 書いてみたいと思います。 ちなみにStarmanについては日本語のドキュメントがほとんどなく、 全体を通して間違ったこと言ってる可能性あるのでツッコミ歓迎です。

PSGI/Plackが熱いと言われる昨今ですが、 miyagawaさんが口を酸っぱく言うように 「PlackはWebアプリケーションフレームワーク」ではなく、 今まで使っていたWAFをPlackが騒がれているからといってそれに置き換える必要はないということを 最初に記しておきます。 自分もPlackを使ってWAFもどきを作っていますが、 大抵のWebアプリに関してはCatalystを使っています。 Catalystはもちろん個人差がありますが一度慣れると開発が非常にしやすいので大好きです。

てなわけで、例に挙げるとある一番アクセスの多いエロサイトはCatalystで開発しています。 で、今回注目したいのはそのアプリケーションのデプロイの仕方です。 皆さん、Catalystアプリはどのように運用してますでしょうか? 僕は Apache + mod_perl ( Catalyst::Engine::Apache ) というパターンがほとんどです。 中には Lighttpd + FastCGI という組み合わせの方もいるかと思います。 おそらくそれで満足できるものかと思いますし、自分も Apache + mod_perl そして、 フロントに別の Apache を置いて静的コンテンツをサーブさせるというやり方で十分です。 しかし、新しモノ、それにPSGI、Perl製、高速、Starmanという響きに釣られ、 この度、Catalystアプリを Starman で動かすということにチャレンジしてみました。

まずは簡易なベンチマークをとってみましたという報告から。 実際に運用しているApache + mod_perlという環境と、 Starmanで立ち上げた場合、どちらがどれだけ高速か? そのとあるエロサイトを対象にし、同じworker数になるように調節し、 ab でベンチマークをとると、細かい部分を抜きにして、以下の結果がでました (そもそものアプリが遅いというのはおいといてね)。

 Apache + mod_perl - Requests per second:    3.18 [#/sec] (mean)
Starman           - Requests per second:    4.43 [#/sec] (mean)

Starmanの方が約140% fasterです。 メモリ消費量はそれほど変わりません。 (*追記: CoWで共有されているメモリがあるのでworkerの実消費メモリをみたら少なくなってました>< ) ということでワクワクしながら早速本番投入してみます。

とその前に、CatalystアプリをStarmanで動かす手順について説明します。 StarmanはPSGIをサポートするので、最初にCatalystをPSGI互換にしましょう。 といっても、簡単で「Catalyst::Engine::PSGI」をインストールし、 Helperスクリプトで

 $ script/myapp_create.pl PSGI

とするだけで、plackupで起動可能な.psgiができます。 つまりCatalystアプリのPSGI化ができたことになり、 上記したWAFを変える必要はないということがなんとなくわかる気がします。 plackupコマンドでももちろん起動できますし、Starmanを入れると

 $ starman myapp.psgi

とすれば、starmanでCatalystアプリが起動します。 ちなみに現状のStarmanはPlackの開発版リリースを入れないと動かないのでご注意。

おし、これでCatalystアプリがStarmanで起動したぜ、ってことで、 いよいよ本番投入への準備です。 フロントサーバを構え、Starmanはリバースプロキシとして動作させたいので、 「Plack::Middleware::ReverseProxy」を.psgiで使い設定しましょう。 最終的にはこんな感じの.psgiになりました。

 use Plack::Builder;
use XXX::Web;

XXX::Web->setup_engine('PSGI');
my $app = sub { XXX::Web->run(@_) };

builder {
    enable_if { $_[0]->{REMOTE_ADDR} eq '192.168.1.xxx' }
        "Plack::Middleware::ReverseProxy";
            $app;
};

最後にstarmanコマンドを使ってお好きなポート、お好きなworkerの数でサーバを起動します。 Plack::Standalone::Server::Prefork::Server::Starter を運用する時のように、 daemontoolsでプロセスを管理することにしました。

 exec 2>&1
cd /home/yusuke/www/pulpsite/xxx || exit 1
exec /usr/bin/setuidgid www-data /usr/local/bin/starman \
--workers 20 --port 8080 ./xxx.psgi

こんな感じの run スクリプトを書いて、それが入ったディレクトリを /services へシンボリックリンク張れば、 起動開始。 無事、今まで Apache で運用していたものとリプレースが済みました。

今回は実験的なサービスに、ということで早速Starmanを導入してみました。 今のところいい感じなので、しばらく様子をみたいと思います。 まだ、でてきたばかりのソフトウェアですが、 よろしければ参考にして使ってみてください。

PS.
今度発売されるWEB+DB PRESSにはmiyagawaさんによるPSGI/Plack特集が載るらしいよ!

WEB+DB PRESS Vol.55
posted with yusukebe.com::AmazonSearch on 2010.2.17
  • WEB+DB PRESS編集部
  • 大型本 / 技術評論社
  • Amazon 売り上げランキング: 789
Amazon.co.jpで詳細を見る