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日更新)