その他
    ホーム 技術発信 DoRuby mongrelとの戦い〜503エラー?mongrelが死んだってことさ…

    mongrelとの戦い〜503エラー?mongrelが死んだってことさ…

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    mongrelがあまりにも死ぬのでdeploy恐怖症にまでなった初心者のmaiです。

    mongrelってよく死にますよね。
    体感的には10回restartしたら1回はダメになる感じです。
    つい昨日もmongrelは沈黙しました。
    もやしっこめ。

     そんなもやしっこmongrelを叩き起こす方法の一つを拙いながらもご紹介します。

    Capistranoを使ってDeployすると、mongrelは自動でrestartしてくれるわけですが、
    そのときの正常なログは↓のようなカンジ。

     ** [out :: 192.168.0.1] stopping port 3000
     ** [out :: 192.168.0.1] stopping port 3001
     ** [out :: 192.168.0.1] starting port 3000
     ** [out :: 192.168.0.1] starting port 3001

    スッキリです。
    mongrelの目覚めもバッチリです。
    いつもこの調子で頑張ってほしいものです。

    とはいえ、もやしっこのmongrelはたまにスッキリ立ち上がりません。
    そのときのログはこちら。

    *** [err :: 192.168.0.1] ** !!! PID file tmp/pids/mongrel.3000.pid already exists.  Mongrel could be running already.  Check your log/mongrel.3000.log for errors.
    *** [err :: 192.168.0.1] ** !!! Exiting with error.  You must stop mongrel and clear the .pid before I’ll attempt a start.
    *** [err :: 192.168.0.1] ** !!! PID file tmp/pids/mongrel.3001.pid already exists.  Mongrel could be running already.  Check your log/mongrel.3001.log for errors.
    *** [err :: 192.168.0.1] ** !!! Exiting with error.  You must stop mongrel and clear the .pid before I’ll attempt a start.
     ** [out :: 192.168.0.1 stopping port 3000
     ** [out :: 192.168.0.1] stopping port 3001
     ** [out :: 192.168.0.1] starting port 3000
     ** [out :: 192.168.0.1]
     ** [out :: 192.168.0.1] starting port 3001
     ** [out :: 192.168.0.1] 

    あきらかにエラー。
    startingとかいってるけど、どっからどう見てもmongrelが生きてるとは思えません。
    それでも一応、実は以外と元気です、というオチもあるかも!と思って
    ブラウザで確認してみるも、当然のように503エラーです。

    現実逃避はやめて、素直にエラー文を見てみると、

    PID file tmp/pids/mongrel.3000.pid already exists.  Mongrel could be running already.  Check your log/mongrel.3000.log for errors

    どうやら、「mongrel.3000.pid」というファイルを作ろうとしたけど、
    すでに同じ名前のファイルがあったために作れませんと言いたいようです。

    そこでサーバにある「tmp/pids/mongrel.3000.pid」というファイルを確認。
    アプリのルートディレクトリまで行くと見つけられるはず。

    [hogehoge pids]$ ls
    mongrel.3000.pid  mongrel.3001.pid

    いました。
    このファイルたちはいてはいけない人たちなので、ご退場願います。

    rm mongrel.300*

    これでスッキリ。
    lsコマンドで、pidsがカラッポになったのが確認できます。

    最後にmongrelをstart。

     ** [out :: 192.168.0.1] starting port 3000
     ** [out :: 192.168.0.1] starting port 3001

     今度はスッキリパッチリ目覚めました。
    ブラウザでも動作が確認できたので、mongrelの復旧作業はこれで終了。

    今回学んだこと。

    ・mongrelはpidによって管理されている…らしい(学びきれてない)
    ・pidのファイルが居座ってると、killしたところでmongrelは復活しない…らしい
    ・エラーが起きたときは奇跡に頼らず、素直にエラー文と向き合うが吉

     今回気づいたこと。

    mongrelってつい「mogrel」って打ってしまいがち。
    …私だけ?