Gunicorn を damemontools で管理

以下メモ。


nginx をリバースプロキシにして、Unix domain socket で Gunicorn/meinheld で起動している。
開発/テスト環境ではサーバで gunicorn_paster*1 してるだけだったけど、さすがに本番の運用環境ではマズいと思い、daemontools を入れた。
# 因に daemontools を使うのは初めて…。


環境が Fedora なので daemontoolsRPM でインストールする。

$ wget http://www.qmailtoaster.com/download/stable/daemontools-toaster-0.76-1.3.6.src.rpm 
$ rpmbuild --rebuild daemontools-toaster-0.76-1.3.6.src.rpm 
$ cd ~/rpmbuild/RPMS/x86_64
$ rpm -Uvh daemontools-toaster-0.76-1.3.6.x86_64.rpm 
$ cd /etc/init.d/
$ sudo wget http://www.emaillab.org/djb/daemontools/svscan
$ sudo chmod +x svscan
$ sudo chkconfig --add svscan
$ sudo chkconfig svscan on
$ sudo /etc/init.d/svscan start

Gunicorn の rc ファイルを作る。
元ネタは Github の example より拝借。
gunicorn/gunicorn_rc at master · benoitc/gunicorn · GitHub

#!/bin/sh
GUNICORN=/usr/bin/gunicorn_paster
ROOT=/path/to/project
PID=/var/run/gunicorn/gunicorn.pid

if [ -f $PID ]; then
  rm $PID
fi
exec $GUNICORN -c $ROOT/data/gunicorn.conf.py --pid=$PID $ROOT/production.ini

Gunicorn 起動時に gunicorn.conf.py を読み込んでいる。
シンボリックリンクを作ったファイルにはる。

$ cd /service
$ sudo mkdir gunicorn
$ cd gunicorn
$ sudo ln -s /path/to/gunicornrc run

これで勝手に起動した。

$ ps -eaf | grep 
$ ps -eaf | grep gunicorn
root     19409 19408  0 19:23 pts/5    00:00:00 supervise gunicorn
root     19451 19409  0 19:23 pts/5    00:00:00 /usr/bin/python /usr/bin/gunicorn_paster -c /path/to/gunicorn.conf.py --pid=/var/run/gunicorn/gunicorn.pid /path/to/production.ini
-以下略-

ついでにログを確認。
# ログファイルへのパスは gunicorn.conf.py で設定済み

$ cat /var/log/gunicorn/gunicorn.log 
2011-02-16 19:23:38 [19451] [INFO] Starting gunicorn 0.11.1
2011-02-16 19:23:38 [19451] [INFO] Listening at: unix:/var/run/gunicorn/gunicorn.sock
2011-02-16 19:23:38 [19453] [INFO] Booting worker with pid: 19453
2011-02-16 19:23:38 [19454] [INFO] Booting worker with pid: 19454
2011-02-16 19:23:38 [19455] [INFO] Booting worker with pid: 19455
2011-02-16 19:23:38 [19457] [INFO] Booting worker with pid: 19457
2011-02-16 19:23:38 [19456] [INFO] Booting worker with pid: 19456
2011-02-16 19:23:38 [19458] [INFO] Booting worker with pid: 19458
2011-02-16 19:23:38 [19459] [INFO] Booting worker with pid: 19459
2011-02-16 19:23:38 [19461] [INFO] Booting worker with pid: 19461
2011-02-16 19:23:38 [19460] [INFO] Booting worker with pid: 19460

因に Gunicorn を再起動したい時は HUP を送信すれば再起動できる。

$ sudo kill -HUP `sudo cat /var/run/gunicorn/gunicorn.pid`
$ cat /var/log/gunicorn/gunicorn.log 
-略-
2011-02-16 19:56:37 [19451] [INFO] Handling signal: hup
2011-02-16 19:56:37 [19451] [INFO] Hang up: Master
-略-

いちいちコマンド打つのが面倒いので Fabric とかに再起動用のコマンドとして定義してやれば良い。

*1:Pylons を使ってるから