概要
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を再起動するとあるのですがしてくれないのが謎です。