読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Server::Starter の --interval オプションは大切

perl+web

最近、Server::Starterを使い始めたのですが、いつでも簡単にサーバを再起動でき、とても便利で安心です。詳しい解説は、kazuhoさんの去年のAdvent Calendarのエントリがわかりやすいと思います。

さて、start_server コマンドには --interval ってオプションがあるのですが、このオプションが結構重要です。--helpから引用すると以下の通りです。

  --interval=seconds       minimum interval to respawn the server process
                           (default: 1)

Server::StarterがHUPシグナルを受け取った際、--interval の間にサーバがエラー終了しないと、サーバの立ち上げに成功したと見なして新しいサーバにディスパッチを開始してしまいます*1。よって、立ち上げに1秒以上時間がかかるサーバを運用する場合、このオプションを指定していないとエラーの検知ができない上に、接続ができない時間が発生してしまいます。

簡単な例で検証してみます。Starmanにて*2、立ち上げに時間がかかるapp.psgiをサーブしてみましょう。

% cat app.psgi
sleep 10;
sub{ [200, [], ["Hi\n"] ] }

% start_server --port=8080 -- plackup -s Starman

この状態で start_server に kill -HUP すると、その1秒後から http://localhost:8080 へ接続ができなくなり、その後も9秒間の間接続することはできません。

これを防ぐためには、サーバの起動にかかる時間を --interval に渡してあげます。

% start_server --port=8080 --interval=10 -- plackup -s Starman

この状態だと、 kill -HUP を送っても http://localhost:8080 に接続できないタイミングは発生しないはずです。

*1:ざっくり読んだだけなので、違ったらすみません!

*2:plackupではなくstarmanコマンドを使う場合は、0.2000 以降はデフォルトではapp.psgiが遅延ロードされるため、このアプリの起動に時間がかかることはありません。