hypnotoadサーバーのタイムアウトの問題
hypnotoadサーバーはMojoliciousの本番環境でデプロイするために利用されるプリフォークサーバーです。
開発環境でmorboで開発していて、本番環境でアプリケーションを動かすときには、タイムアウトに注意する必要があります。
hypnotoadはプリフォークサーバーで、一定時間応答がない子プロセスを停止させるという仕組みがあります。
ですから30秒以上かかるHTTPリクエストを実行した場合に、実行できないということが発生します。
タイムアウトの仕組み
ハートビート
hynotoadの親プロセスは子プロセスの生存監視をしています。デフォルトでは5秒間応答がないプロセスがあった場合に、その子プロセスに対して、リクエストが終わり次第停止するようにという命令を出します。
さらに30秒以内にリクエストが終わらなかった場合には、強制的にそのプロセスを停止させます。つまりデフォルトでは35秒以上のリクエストを受け取ることができません。
ブロッキングするアプリケーションを書くときはハートビートのタイムアウト値を長く設定する必要があります。
hypnotoadは同じディレクトリにhypnotoad.confというファイルがあると設定ファイルとして読み込んでくれますので、たとえば以下のようにハートビートのタイムアウトを設定をしておきます。
# hypnotoad.conf {heartbeat_timeout => 60}