Mojo::Server::Hypnotoad - プロダクション環境のWebサーバー
使い方
use Mojo::Server::Hypnotoad; my $hypnotoad = Mojo::Server::Hypnotoad->new; $hypnotoad->run('/home/sri/myapp.pl');
説明
Mojo::Server::Hypnotoadは完全の機能を備えたUNIXに最適化された プリフォークの非同期IOのHTTPとWebSocketの組み込みのサーバーです。 とてもよく試験されて信頼性のある Mojo::Server::Preforkの上に 構築されており、IPv6
, TLS
, コメット(ロングポーリング), キープアライブ, コネクションポーリング、タイムアウト,クッキー, マルチパート, 複数のイベントループとホットデプロイメントがサポートされています。 サーバーはプロセス管理のためにシグナルを使用しているので シグナルハンドラーをアプリケーションの中で 修正するのは避けるべきです。
これを使ってアプリケーションをスタートするには、 hypnotoadスクリプトを使用してください。 MojoliciousとMojolicious::Liteアプリケーションは、デフォルト でproduction
モードで実行されます。
$ hypnotoad ./myapp.pl
自動的なホットデプロイメントをするには、同じコマンドをもう一度実行します。
$ hypnotoad ./myapp.pl Starting hot deployment for Hypnotoad server 31841.
This second invocation will load the application again, detect the process id file with it, and send a "USR2" signal to the already running server.
この2回目の呼び出しはアプリケーションを再度ロードし、プロセスIDを検出します。 それをファイル化し、すでに動いているサーバに"USR2"シグナルを送ります。
よりよりスケーラビリティ(epoll, kqueue)と、ノンブロッキング名前解決、SOCKS5とTLSサポートは、 オプションのモジュールとしてEV(4.0+), Net::DNS::Native (0.15+) IO::Socket::SSL(2.009+), IO::Socket::Socks (0.64+)が 透過的にサポートされ、インストールされていれば利用されます。 個々の機能はMOJO_NO_IPV6
とMOJO_NO_TLS
環境変数で無効にすることもできます。
hypnotoad
スクリプトを使ってアプリケーションをスタートするためには以下のようにします。
$ hypnotoad myapp.pl Server available at http://127.0.0.1:8080.
自動的なホットデプロイのために、もう一度まったく同じコマンドを実行することができます。
$ hypnotoad myapp.pl Starting hot deployment for Hypnotoad server 31841.
二回目の実行は、プロセスIDファイルを検知して、 すでに実行されているサーバーにUSR2
シグナルを送り 再びアプリケーションをロードします。
よりよいスケーラビリティ(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を見てください。
マネージャーシグナル
シグナルを使って実行中にhypnotoad
を制御することができます。
INT, TERM
すぐにサーバーをシャットダウンします。
QUIT
緩やかにサーバーをシャットダウンします。
TTIN
ワーカープールをひとつ増やします。
TTOU
ワーカープールをひとつ減らします。
USR2
入ってくる接続をひとつも失うことなく、ゼロダウンタイムのソフトウェア アップグレード(ホットデプロイメント)を試みます。
Manager (old) |- Worker [1] |- Worker [2] |- Worker [3] |- Worker [4] `- Manager |- Worker [1] |- Worker [2] |- Worker [3] `- Worker [4]
新しいマネージャは古いマネージャに自動的にQUIT
シグナルを送信し、 スタートアップに成功した後リクエストのサーブを引き継ぎます。
ワーカーシグナル
QUIT
緩やかにワーカーを停止します。
設定
Hypnotoad
の設定ファイルはハッシュを返す通常のPerlスクリプトです。 サンプルはMojolicious::Guides::CookbookのHypnotoad
の 項目を見てください。
accepts
accepts => 100
ワーカーが緩やかに停止し、 新しく開始するワーカーで置き換えられる 前に受け入れることが可能な接続の最大数。 デフォルトはMojo::Server::Preforkのaccepts
の値。 この値を0
に設定すると、ワーカーが新しい接続を無限に受け入れる ことを許可します。 この値の半分まではロードバランシングを改善するためにランダムに 減らされ、いったん限界に達すると、ワーカーはハートビートメッセージの送信を 停止することに注意してください。
backlog
backlog => 128
リッスンバックログサイズ。デフォルトはMojo::Server::Daemonのbacklog
の値。
clients
clients => 100
それぞれのワーカープロセスが、 新しくくる接続の受け入れを停止する前に、処理可能な 並列接続の最大数。デフォルトは、Mojo::IOLoopのmax_connections
の値。 アプリケーションがどれほどブロックするかどうかに依存して、 よりよりパフォーマンスのために、この値を減らし 代わりにワーカーを増やしたい場合があるかもしれない ことに注意してください。
graceful_timeout
graceful_timeout => 15
緩やかなワーカーの停止が、強制的なものになるまでの秒数。 デフォルトはMojo::Server::Preforkのgraceful_timeout
の値。
heartbeat_interval
heartbeat_interval => 3
ハートビートの間隔の秒数。デフォルトはMojo::Serverのgroup
の値。
heartbeat_timeout
heartbeat_timeout => 5
ハートビートのないワーカーが停止するまでの秒数。 デフォルトはMojo::Server::Preforkのheartbeat_interval
の値。
inactivity_timeout
inactivity_timeout => 10
接続が閉じられるまでに非アクティブでいることができる最大の秒数。 デフォルトはMojo::Server::Daemonのinactivity_timeout
の値。 この値を0
に設定すると、永久に非アクティブにしておくことができます。
listen
listen => ['http://*:80']
ポートとリッスンのためのファイルのリスト。デフォルトはhttp://*:8080
。 Mojo::Server::Daemonのlisten
に多くの例があります。
pid_file
pid_file => '/var/run/hypnotoad.pid'
PIDファイルのフルパス。デフォルトはアプリケーションと同じ ディレクトリのhypnotoad.pid
。 この値はサーバーが停止したときにのみ変更されることに 注意してください。
proxy
proxy => 1
リバースプロキシのサポートを有効にします。 X-Forwarded-For
とX-Forwarded-Proto
ヘッダを 自動的に認識します。 デフォルトはMojo::Serverのreverse_proxy
の値です。
requests
requests => 50
接続あたりのキープアライブを維持するリクエストの数。 デフォルトは、Mojo::Server::Daemonのmax_requests
の値。
spare
spare => 4
必要に応じて、一時的に、この数の追加のワーカーを生み出します。 デフォルトはMojo::Server::Preforkの"spare"の値です。古いワーカーがまだ緩やかにシャットダウン中で、新しいワーカーが開始されているときに、ワーカーの再起動のパフォーマンスコストを、大幅に減らします。
upgrade_timeout
upgrade_timeout => 45
ゼロダウンタイムソフトウェアアップグレードが行われてから 失敗するまでの秒数。デフォルトは60
秒です。
workers
workers => 10
ワーカープロセスの数。デフォルトはMojo::Server::Preforkのworkers
の値。 経験則では、ほとんどがノンブロックの処理の場合は、 CPUコアあたり2ワーカープロセスを設定するのがよいでしょう。 ブロックする処理ではより多くの値を設定し、 並列のclients
の値を減らすこと(1
程度に小さく)で利益を受けられます。 ゼロダウンタイムソフトウェアアップグレードの間は、短い時間だけ、2倍のワーカーが存在することに注意してください。
属性
Mojo::Server::Hypnotoadは次の属性を実装しています。
prefork
my $prefork = $hypnotoad->prefork; $hypnotoad = $hypnotoad->prefork(Mojo::Server::Prefork->new);
このサーバーが管理するMojo::Server::Preforkオブジェクト。
upgrade_timeout
my $timeout = $hypnotoad->upgrade_timeout; $hypnotoad = $hypnotoad->upgrade_timeout(15);
Maximum amount of time in seconds a zero downtime software upgrade may take before getting canceled, defaults to 60
.
キャンセルされる前に、停止時間ゼロのソフトウェアアップグレードに要する最大時間(秒)。デフォルトは60秒です。
メソッド
Mojo::Server::HypnotoadはMojo::Baseからすべての メソッドを継承しており、 次の新しいメソッドを実装しています。
configure
$hypnotoad->configure('hypnotoad');
アプリケーションの設定を元にサーバーを設定します。
run
$hypnotoad->run('script/my_app');
サーバーを開始します。
参考
Mojolicious, Mojolicious::Guides, http://mojolicio.us.
(Mojolicious 8.12を反映。2019年5月28日更新)