upstart(init)でnginxを管理する

nginxの挙動は通常のデーモンと違うのでexpect daemon/forkは使えない。なので、foregroundに残すオプションで走らせて、プロセス管理はupstartに任せるしかない。
参照 http://serverfault.com/a/143650

/etc/init/nginx.conf


description "nginx"
start on filesystem
respawn

pre-start script
test -x /usr/local/nginx/sbin/nginx || { stop; exit 0; }
end script

# nginxの挙動は通常のデーモンと違うのでexpect daemon/forkは使えない。
# なので、foregroundに残すオプションで走らせて、プロセス管理はupstartに任せるしかない。
# 参照 http://serverfault.com/a/143650
exec /usr/local/nginx/sbin/nginx -g "daemon off;"

確認


$ sudo status nginx
nginx start/running, process 13171
$ sudo stop nginx
nginx stop/waiting
$ sudo status nginx
nginx stop/waiting
$ sudo start nginx
nginx start/running, process 13338
$ sudo status nginx
nginx start/running, process 13338

殺しても蘇える


$ sudo kill 13338
$ sudo status nginx
nginx start/running, process 13347

upstart(init)について

Debianを含む多くのLinuxディストロは/etc/init.d/にスクリプトを入れてデーモンを管理するSysV風のサービス管理系を使ってきた。SysVスクリプトは一般的にpidファイルによりプロセスを管理する。往々にプロセスが死んでこのファイルが残り、削除してから起動するような面倒なことになる。つまりPIDファイルによるプロセス管理は信頼性に欠ける。

Debianはinitプロセスが直接デーモンをフォークし、プロセスの親子関係でモニタリングする(んだと思う)upstart(init)というシステムを提供するようになった。PIDファイルではなく、カーネル内で管理されるプロセス系統で監視するからデーモンの安否が確実に把握できる。

DebianはSysVからupstartに移行する途中なのだろうか? 著者のmaverick(Ubuntu 10.10)は両方にスクリプトが入っている。


$ ls /etc/init |wc -l
68
$ ls /etc/init.d/ |wc -l
88

その辺が気になるが、PIDファイルが居座るなどのトラブルがなく、コケても確実に再サタートしてくれるので、debianパッケージが管理していない独自のサービスはupstartで管理するようにしている。