名前

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_NDNMOJO_NO_IPV6MOJO_NO_TLS環境変数で無効にすることもできます。

より知りたい場合はMojolicious::Guides::Cookbookデプロメントの項目 をみてください。

マネージャーシグナル

Mojo::Server::Preforkは次の シグナルで実行時にコントロールすることができます。

INT, TERM

すぐにサーバーをシャットダウンします。

QUIT

緩やかにサーバーをシャットダウンします。

TTIN

ワーカープールをひとつ増やします。

TTOU

ワーカープールをひとつ減らします。

ワーカーシグナル

QUIT

緩やかにワーカーを停止します。

イベント

Mojo::Server::PreforkMojo::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::PreforkMojo::Server::Daemon からすべての属性を継承しており、 次の新しい属性を実装しています。

accepts

my $accepts = $prefork->accepts;
$prefork    = $prefork->accepts(100);

ワーカーが緩やかに停止し 新しく開始するワーカーで置換される 前に受け入れることが可能な接続の最大数。 デフォルトはMojo::IOLoopmax_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::PreforkMojo::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日更新)

関連情報