前回の
PSGIサーバ
ここまで主にPSGIのアプリケーション側について見てきましたが、
PSGIサーバの役割
PSGIサーバはPerlによるプログラムで、
図2がPSGIサーバの役割を図に表したものです。ApacheやnginxなどのWeb サーバからCGI、$env
を作り、

PSGIサーバとPlackハンドラ
PSGIサーバはPlackハンドラと呼ばれることがありますが、
Plackハンドラ
PSGIサーバの起動方法
Plackハンドラに対応したPSGIサーバはplackup
コマンドを使うと簡単に起動できます。リスト2のようにアプリケーションをpsgiファイルに記述して、
$ plackup -a hello_world.psgi
として起動します。デフォルトではHTTP::Server::PSGIが使われ、http://
にアクセスすると、
#!/usr/bin/env perl
use strict;
use warnings;
my $app = sub {
my $env = shift;
# アプリケーションの処理
return [
200,
['Content-Type'=>'text/plain'],
["Hello WEB+DB PRESS\n"]
];
};
$app;
別のPSGIサーバを起動する場合は、plackup
に-s
オプションを付けます。Starmanを使用する場合は次のようになります。
$ plack -s Starman --port 8080 -a hello_world.psgi
ここでは--port
オプションも使い、
よく利用されるPSGIサーバと、その選び方
PSGI/
HTTP::Server::PSGI
HTTP::Server::PSGIはplackupコマンドのデフォルトで使われるPSGI サーバです。Plack::Hander::StandaloneモジュールがPlack::Hander::HTTP::Server::PSGIのエイリアスとして実装されているので、
$ plackup -s Standalone -a helloworld.psgi
HTTP::Server::PSGIは単独でプロセスが1つしかないシングルプロセスのWebサーバとして起動し、
Starman──多機能PSGIサーバ
StarmanはNet::Serverモジュールをベースとした多機能なPrefork型のWebサーバです。作者はPSGI/
Prefork型とは、fork(2)
)

Starman の特徴として、
Starmanはplackup
でも起動できますが、starman
コマンドも使えます。
$ starman --workers 32 \
--max-requests 500 \
--preload-app \
--disable-keepalive \
-a helloworld.psgi
ここでは32個のワーカを起動し、--max-requests
を指定しています。アプリケーションにメモリリークがあっても一定の時間でプロセスを終了させることで、
--preload-app
を指定すると、
Starmanはクライアントとサーバ間のTCP接続を使い回すHTTP KeepAliveがデフォルトで有効になりますが、--disable-keepalive
を指定します。
Starlet──シンプルで高速なPSGIサーバ
Starletは本連載第6回を執筆した奥一穂氏が開発しているPSGI対応のWebサーバです。Prefork型で、HTTP::Parser::XS
モジュールを導入するとXSでHTTPヘッダ処理が行われるので、
StarletにはStarmanと異なり専用の起動コマンドが付属しないので、plackup
でサーバを起動します。
$ plackup -s Starlet \
--max-workers 30 \
--max-reqs-per-child 1000 \
--min-reqs-per-child 800 \
--max-keepalive-reqs 1 \
-a helloworld.psgi
Starletの起動オプションで特徴的なのが、--max-reqsper-child
と--min-reqs-per-child
です。Starmanの--max-requests
に相当する機能ですが、
Twiggy── AnyEventベースの非同期Webサーバ
Twiggyはイベント駆動ライブラリのAnyEventを利用したWebサーバです。StarmanなどのPrefork型のサーバとは異なり、
リスト3はAnyEventを利用して、
use AnyEvent;
my $cv;
my $app = sub {
my $env = shift;
$cv->send if $cv;
$cv = AE::cv;
return sub {
my $responder = shift;
my $writer = $responder->([200, ['Content-Type' => 'text/plain']]);
$writer->write("Wait for the next request..\n");
$cv->cb(sub{
$writer->write("request has come!\n");
$writer->close;
});
};
};
リスト3は次のコマンドで起動します。
$ plackup -s Twiggy -a twiggy_sample.psgi
curlなどでアクセスすると、
$ curl http://localhost:5000/
Wait for the next request..
別のターミナルから同じcurlコマンドを実行すると
Twiggy::Prefork── Prefork対応Twiggy
Twiggy::Preforkは拙作のWebサーバです。その名のとおりTwiggyにPreforkの機能を付加しています。Twiggyはすべての接続を1個のプロセス内で処理するので、
そこで開発をしたのがTwiggy::Preforkです。ワーカプロセスが複数になることで、
$ placket -s Twiggy::Prefork \
--max-reqs-per-child 500 \
--min-reqs-per-child 400 \
-a delay_res.psgi
Twiggy::PreforkはStarletと同様に1プロセスが処理するリクエスト数の最大と最小を指定できます。
Feersum──高速非同期サーバ
FeersumはC言語のイベント駆動ライブラリであるlibevをベースに作られているPSGI対応のWebサーバです。C/
2013年11月現在、
$ plackup -s Feersum \
--pre-fork=4 -a delay_res.psgi
PSGIサーバの選び方
CPANには多くのPSGIサーバがありますが、
表2にPSGIサーバを選ぶ際の基準をまとめました。非同期処理を必要としないアプリケーションであれば1行目
種類 | シングルプロセス | マルチプロセス |
---|---|---|
通常のアプリケーション | ─ | Starman Starlet |
非同期処理が必要なアプリケーション | Twiggy Feersum | Twiggy::Prefork Feersum |
<続きの