supervisor で Unicorn プロセス監視

昔はプロセス管理といえば daemontools だったそうなのですが、 最近は Supervisor を使ってプロセス管理をすることが増えているようです。

私の ホームページUnicorn x Sinatra x nginx で動かしていますが、このUnicornプロセスが死んでも自動で再起動してくれるように、Supervisor を導入してみました。

Supervisor のインストール

サーバーの構成管理は Chef でやっておりますので 今回も Chef を使ってインストールします。

$ sudo chef-solo -j node.json -c solo.rb

Berksfile 中で github のURLを直接していますが、これは Opscode CommunityからDLできる supervisor のバージョンがgithubのものより古いためです。 Opscode Community のものだと supervisord がサービスに登録されません。そのうち修正されると思いますが。

supervisor.unix_http_server.chown の値はUnicornプロセス起動させたいユーザー名と同じにして下さい。 デフォルト(root)のままだとUnixソケットまわりでpermission errorが出ます。

※セキュリティ上はオーナーはrootのままにしておいて、グループ権限で制御するのが正しいでしょう。

Supervisorにプロセスを監視させる

/etc/supervisor.dディレクトリ内にプロセス監視の設定ファイルを作ります。

↑のレシピを実行して下さい。これで準備は完了です。

$ supervisorctl status
homepage    RUNNING    pid 945, uptime 1:37:02
$ ps x | grep unicorn
  945 ?        Sl     0:00 unicorn master -c unicorn.rb -E production -l0.0.0.0:8080
  982 ?        Sl     0:00 unicorn worker[0] -c unicorn.rb -E production -l0.0.0.0:8080
 2242 pts/2    S+     0:00 grep --color=auto unicorn

unicornpid=945で起動しています。killしてみてプロセス再起動される事を確かめてみましょう。

$ kill 945
$ supervisorctl status
homepage    RUNNING    pid 2301, uptime 0:00:01

pidが変わり無事再起動されたことがわかります。uptimeも1秒になっています。

手動での再起動もできます。デプロイ時には以下のコマンドを叩いてプロセスの再起動を行っています。

$ supervisorctl restart homepage
homepage: stopped
homepage: started

supervisorを導入していない方は非常に簡単ですので、やってみてください。