Carpe Diem

備忘録

Supervisorでプロセスを管理

概要

Node.jsサーバなどはApacheやNginxと違ってデフォルトでは自動起動してくれません。
そういったプロセスを簡単に管理できるSupervisorを使います。

環境

  • Ubuntu 14.04
  • Node.js 0.12.7
  • Supervisor 3.0b2

Node.jsサーバの用意

インストール

$ npm install -g express-generator
$ express test
$ cd test
$ npm install

ログフォルダ作成

supervisorでログを出力する場所を作っておきます。

$ sudo mkdir /var/log/test-server/
$ sudo chown vagrant. /var/log/test-server/

あとは./bin/wwwを実行すればサーバが起動します。

Supervisorインストール

aptでインストールします。最新をインストールしたい場合はpipを使います。

$ sudo aptitude install supervisor

親プロセスの設定

インストール直後のデフォルトの設定(/etc/supervisor/supervisord.conf)は以下です。

[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[include]
files = /etc/supervisor/conf.d/*.conf

ソケットはINET(TCP)Unixの両方使えますが、同一マシン上でプロセス通信をするのであればスループットの高いUnixソケットを使います。

上記の親プロセスのconfigを編集した場合は

$ sudo service supervisor restart

でないと反映してくれません。

子プロセスの設定

includeで設定ファイル(/etc/supervisor/conf.d/*.conf)を読み込んでいるので、そこに追加します。
以下よく使うものを設定します。

/etc/supervisor/conf.d/node.conf

[program:test-server]
command=/home/vagrant/test/bin/www
autostart=true
autorestart=true
startretries=10
user=vagrant
environment=PATH="/home/vagrant/.nodebrew/current/bin:$PATH"
redirect_stderr=true
stdout_logfile=/var/log/test-server/api.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10

設定項目の説明

プロパティ 説明
program プログラム名。これを指定してsupervisorctlで再起動とかする test-server
command 実行するプログラム /home/vagrant/test/bin/www
autostart supervisorが起動したら自動的に起動する true
autorestart プロセス死んだ時に自動的に再起動する true
startretries 起動のretry数上限 10
user 実行ユーザ名 vagrant
environment 実行時に追加したい環境変数 PATH="/home/vagrant/.nodebrew/current/bin:$PATH"
redirect_stderr エラー出力を標準出力にリダイレクトする true
stdout_logfile ログファイルの場所 /var/log/test-server/api.log
stdout_logfile_maxbytes ログファイルの最大サイズ 50MB
stdout_logfile_backups 上の最大サイズ超えた時のローテートの世代数 10

子プロセスの動作確認

起動

先ほど指定したプログラム名で起動します。

$ sudo supervisorctl start test-server

ステータス確認

$ sudo supervisorctl status
test-server                      RUNNING    pid 6705, uptime 0:00:07

停止

$ sudo supervisorctl stop test-server

設定ファイルの変更の反映

restartでは反映されません。以下のようにします。

$ sudo supervisorctl reread test-server
$ sudo supervisorctl update test-server

その他

$ sudo supervisorctl reload

をするとsupervisordを再起動するとあるのですがしてくれないのが謎です。

ソース