Gunicorn を damemontools で管理
以下メモ。
nginx をリバースプロキシにして、Unix domain socket で Gunicorn/meinheld で起動している。
開発/テスト環境ではサーバで gunicorn_paster*1 してるだけだったけど、さすがに本番の運用環境ではマズいと思い、daemontools を入れた。
# 因に daemontools を使うのは初めて…。
環境が Fedora なので daemontools を RPM でインストールする。
$ 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 とかに再起動用のコマンドとして定義してやれば良い。