awsでPythonのWebアプリをTornadoフレームワークを使って開発していたときに、awsで起動させているWebアプリがよく寝る(アプリが落ちる)ので、デーモン化して無休で働かせ(常時起動)て、もし寝たとしても起こす(アプリ再起動)ようにしたときのメモ。
Supervisorとは
SupervisorはPython製の軽量なプロセス管理ツール。
手順
手順は以下のような感じ。
作業は全てaws上のubuntu14.04で行っています。
インストール
Supervisorはapt-get
でもpip
でもインストールできるのですが、とりあえず、Ubuntuでapt-get
でインストールする方法を記載しておきます。
※インストール方法によって、設定ファイルの場所が変わってくるので注意しましょう。apt-getの場合 /etc/supervisor/conf.d/
- Ubuntu (apt-get) の場合
$ sudo apt-get install supervisor
インストールされたことを確認。バージョンは3.0b2
が入ったみたい。
$ supervisord -v
3.0b2
$ sudo supervisorctl version
3.0b2
設定
Supervisorの設定ファイル(confファイル)にWebアプリ起動のための情報を書きます。
/etc/supervisor/conf.d/
にconfファイルを作成します。
$ sudo vim /etc/supervisor/conf.d/tornado.conf
中身は以下のようにしました。Supervisorに管理させるプロセスとしての名前はtornadoにしました。
[program:tornado] ; プロセスの名前
directory=/home/ubuntu/tornado-app ; 作業ディレクトリ
command=/home/ubuntu/tornado-app/venv/bin/python /home/ubuntu/tornado-app/server.py --port=3000 ; 起動コマンド
numprocs=1 ; 起動インスタンス数?
autostart=true ; autostartする
autorestart=true ; 自動で再起動させる
user=ubuntu ; 起動ユーザ
redirect_stderr=true ; 標準エラーを出力する
stdout_logfile=/var/log/supervisor/tornado.log ; ログファイルの出力先
Webアプリはあらかじめ、/home/ubuntu/tornado-app
にgit clone済みだとします。
- (参考)Supervisorを使わない場合の起動方法
ちなみにSupervisorを使わない場合、つまり、ターミナルからWebアプリを起動させる場合は以下のコマンドで起動させていました。
$ cd ~/tornado-app
$ source venv/bin/activate # virtualenvをactivate
(venv)$ python server.py --port=3000 &
あと、Supevisorの設定ファイルの書き方はSupervisor configurationを参考にしてください。
supervisorの起動、設定ファイルの読み込み
service supervisor
コマンドを使ってSupervisorを起動します
Supervisor自体の再起動します。
$ sudo service supervisor restart
Supervisor自体が起動しているか確認します。
$ sudo service supervisor status
is running
プロセスの起動、管理
supervisorctl
コマンドでプロセスを管理します。
confファイルを変更した場合、かならず再読み込み(reread)が必要になります。
confファイルの読み込みは以下のコマンド。
$ sudo supervisorctl reread
あとはSupervisorで管理しているWebアプリを起動させます。
$ sudo supervisorctl start tornado # 起動
Webアプリが起動しているか確認。
$ sudo supervisorctl status # ステータス確認
tornado RUNNING pid 3414, uptime 0:07:19
起動した!
ちなみに、停止と再起動は以下のとおりです。
$ sudo supervisorctl stop tornado # 停止
$ sudo supervisorctl restart tornado # 再起動
その他、supervisorctlのコマンドはこちらが参考になりました。