正確には Redmine が原因なのかどうかは判明していませんが、OpenSolaris 上に構築した Redmine が起動後何時間かすると500 Internal Errorを返すようになってしまいました。
Redmine は以下のような環境で動かしています。
- Redmine 0.9.3
- OpenSolaris 2009.06
- Ruby 1.8.7-p249
- Rails 2.3.5
- Unicorn 0.97.0
- nginx 0.7.65
Ruby は /opt/sunstudio12.1/bin/cc(Sun Studio Express 12)でビルドしています。
OpenSolaris に付属の /usr/bin/ruby を使っていた時には問題なく動作していたんですが、Redmine 0.9.3 にバージョナップした所、致命的な問題が発生したため、Ruby を自分でビルドするように変更していました。
落ちているの気がついたら手動で再起動をしていたのですが、さすがにメンドウになってきたのでスクリプトを書きました。
#!/bin/sh while `/bin/true` do http_code=`curl --insecure -w "%{http_code}" -s -o /dev/null https://redmine/login` ts=`date +"%Y/%m/%d %H:%M:%S"` if [ $http_code -eq 200 ]; then echo $ts OK sleep 300 continue fi cd /var/www/redmine pid=`cat tmp/pids/unicorn.pid` kill -USR2 $pid sleep 5 kill $pid echo $ts unicorn $pid reloaded. done exit 0
手順としては、5分おきに curl で HTTP のステータスコードのみを受け取り、200 OKが帰ってこない場合は再起動、という流れです。
Unicorn は SIGUSR2 を送ると自分自身を fork() してから終了するはずなのですが、終了せずに残るので子プロセスの起動を待ってから SIGTERM を送っています。
とりあえずは、これで気にはならなくなりましたが。。。
そのうち、God あたりに切り替えよう。