Mojo::Server::Prefork - プリフォークのノンブロッキングIOのHTTPとWebSocketのサーバー
使用方法
use Mojo::Server::Prefork;
my $prefork = Mojo::Server::Prefork->new(listen => ['http://*:8080']);
$prefork->unsubscribe('request')->on(request => sub {
my ($prefork, $tx) = @_;
# リクエスト
my $method = $tx->req->method;
my $path = $tx->req->url->path;
# レスポンス
$tx->res->code(200);
$tx->res->headers->content_type('text/plain');
$tx->res->body("$method request for $path!");
# トランザクションをレジュームする
$tx->resume;
});
$prefork->run;
説明
Mojo::Server::Preforkは完全の機能を備えたUNIXに最適化された プリフォークの非同期IOのHTTPとWebSocketの組み込みのサーバーです。 とてもよく試験されて信頼性のある Mojo::Server::Daemonの上に 構築されており、IPv6, TLS, コメット(ロングポーリング), キープアライブ, コネクションポーリング、タイムアウト,クッキー, マルチパート, 複数のイベントループがサポートされています。 サーバーはプロセス管理のためにシグナルを使用しているので シグナルハンドラーをアプリケーションの中で 修正するのは避けるべきです。
よりよいスケーラビリティ(epoll, kqueue)、ノンブロッキングの名前解決、 SOCK5、TLSサポートも以下のモジュールによってサポートされます。 オプションのモジュールとしてEV(4.0+), Net::DNS::Native (0.15+) IO::Socket::SSL(1.84+),IO::Socket::Socks (0.64+)、IO::Socket::SSL (1.94+)が 透過的にサポートされ、インストールされていれば利用されます。 個々の機能はMOJO_NO_NDN、MOJO_NO_IPV6とMOJO_NO_TLS環境変数で無効にすることもできます。
より知りたい場合はMojolicious::Guides::Cookbookのデプロメントの項目 をみてください。
マネージャーシグナル
Mojo::Server::Preforkは次の シグナルで実行時にコントロールすることができます。
INT, TERM
すぐにサーバーをシャットダウンします。
QUIT
緩やかにサーバーをシャットダウンします。
TTIN
ワーカープールをひとつ増やします。
TTOU
ワーカープールをひとつ減らします。
ワーカーシグナル
QUIT
緩やかにワーカーを停止します。
イベント
Mojo::Server::PreforkはMojo::Server::Daemonからイベントを継承し、 次の新しいイベントを発行します。
finish
$prefork->on(finish => sub {
my ($prefork, $graceful) = @_;
...
});
サーバーがシャットダウンしたときに発行されます。
$prefork->on(finish => sub {
my ($prefork, $graceful) = @_;
say $graceful ? 'Graceful server shutdown' : 'Server shutdown';
});
heartbeat
$prefork->on(heartbeat => sub {
my ($prefork, $pid) = @_;
...
});
ハートビートメッセージをワーカーから受信したときに発行されます。
$prefork->on(heartbeat => sub {
my ($prefork, $pid) = @_;
say "Worker $pid has a heartbeat";
});
reap
$prefork->on(reap => sub {
my ($prefork, $pid) = @_;
...
});
子プロセスが死んだときに発行されます。
$prefork->on(reap => sub {
my ($prefork, $pid) = @_;
say "Worker $pid stopped";
});
spawn
$prefork->on(spawn => sub {
my ($prefork, $pid) = @_;
...
});
ワーカープロセスが生み出されたときに発行されます。
$prefork->on(spawn => sub {
my ($prefork, $pid) = @_;
say "Worker $pid started";
});
wait
$prefork->on(wait => sub {
my $prefork = shift;
...
});
新しいハートビートメッセージを待っている マネージャーがスタートしたときに発行されます。
$prefork->on(wait => sub {
my $prefork = shift;
my $workers = $prefork->workers;
say "Waiting for heartbeat messages from $workers workers";
});
属性
Mojo::Server::PreforkはMojo::Server::Daemon からすべての属性を継承しており、 次の新しい属性を実装しています。
accepts
my $accepts = $prefork->accepts; $prefork = $prefork->accepts(100);
ワーカーが緩やかに停止し 新しく開始するワーカーで置換される 前に受け入れることが可能な接続の最大数。 デフォルトはMojo::IOLoopのmax_acceptsの値。 この値を0に設定すると、ワーカーが新しい接続を無限に受け入れる ことを許可します。 この値の半分まではロードバランシングを改善するためにランダムに 減らされ、いったん限界に達すると、ワーカーはハートビートメッセージの送信を 停止することに注意してください。
cleanup
my $bool = $prefork->cleanup; $prefork = $prefork->cleanup($bool);
必要ではなくなったときに、自動的にPIDファイル(pid_file)を削除します。 デフォルトは、真値です。
graceful_timeout
my $timeout = $prefork->graceful_timeout; $prefork = $prefork->graceful_timeout(15);
緩やかなワーカーの停止が、強制的なものになるまでの秒数。 デフォルトは20。
heartbeat_interval
my $interval = $prefork->heartbeat_intrval; $prefork = $prefork->heartbeat_interval(3);
ハートビートの間隔の秒数。デフォルトは5。
heartbeat_timeout
my $timeout = $prefork->heartbeat_timeout; $prefork = $prefork->heartbeat_timeout(2);
ハートビートのないワーカーが停止するまでの秒数。 デフォルトは20。
pid_file
my $file = $prefork->pid_file;
$prefork = $prefork->pid_file('/tmp/prefork.pid');
PIDファイルのフルパス。デフォルトはアプリケーションと同じ ディレクトリのhypnotoad.pid。 この値はサーバーが停止したときにのみ変更されることに 注意してください。
spare
my $spare = $prefork->spare; $prefork = $prefork->spare(4);
必要に応じて、一時的に、この数の追加のワーカーを生み出します。 デフォルトは2です。古いワーカーがまだ緩やかにシャットダウン中で、新しいワーカーが開始されているときに、ワーカーの再起動のパフォーマンスコストを、大幅に減らします。
workers
my $workers = $prefork->workers; $prefork = $prefork->workers(10);
ワーカープロセスの数。デフォルトは4。 経験則では、CPUコアあたり2ワーカープロセスを設定するのがよいでしょう。 ブロッキングする処理ではこの値を増やし、 Mojo::Server::Daemonの並列clientsの数を減らす(1と同程度に低く)のがよいでしょう。
メソッド
Mojo::Server::PreforkはMojo::Server::Daemonからすべてのメソッドを 継承しており、次の新しいメソッドを実装しています。
check_pid
my $pid = $prefork->check_pid;
pid_fileから実行されているサーバーのために プロセスIDを取得するか、 サーバーが実行されていなければ、それを削除します。
say 'Server is not running' unless $prefork->check_pid;
ensure_pid_file
$prefork->ensure_pid_file;
pid_fileが存在することを確実にします。
healthy
my $healthy = $prefork->healthy;
ハートビートしている現在のアクティブなワーカープロセス。
run
$prefork->run;
サーバーを開始し、"MANAGER SIGNALS"を待ちます。
参考
Mojolicious, Mojolicious::Guides, http://mojolicio.us.
(Mojolicious 8.12を反映。2019年5月29日更新)
Mojoliciousドキュメント日本語訳