Date Modified Tags python / uwsgi

Ansibleで環境構築する時にuwsgiの再起動をservice使ってやりたかったので、supervisorにuwsgiを登録し、supervisorをserviceに登録するためにsupervisorについて調べてみたメモ

新しい設定のロード(2020/12/19追記)

supervisordの構成ファイルをhoge.iniとして新たに追加した。この構成をsupervisordに読み込ませる場合、単にreloadではダメで、rereadとupdateを必要とする。具体的には

supervisorctl reread
supervisorctl update

とする。

参考:スーパーバイザーが新しい構成ファイルをロードしない

ざっくりコマンド(2020/12/19追記)

使いそうなやつだけ

  • add ... supervisorのデーモンの管理対象として追加(nameはプロセスやグループ名)。rereadと組み合わせる
  • avail 管理しているプロセスの確認(statusも似てる?)
  • clear nameのログ消去
  • maintail supervisord本体のログ確認。tailと同じで-fと組み合わせると幸せになる。
  • pid プロセスのpid表示。killする時に使う?
  • reload 設定ファイルの再読み込み(管理下のもの)
  • remove 一時的にnameを管理から外す。元に戻すのはadd
  • reread デーモンの設定を再読み込みする。リスタートはしないので、updateなどと組みあわせる。
  • restart 管理プロセスを再起動する。よく使う。restart allとかする(全プロセス再起動)
  • shutdown デーモンを終了する。
  • start 管理プロセスを起動する。start allとかする。
  • status 管理プロセスの状況をチェックする
  • stop 管理プロセスを終了する。
  • tail 管理プロセスのログを表示。-fをつけると幸せになる。
  • update addとかremoveを適宜行ってくれる。
  • version バージョン表示

参考:supervisorctlについて調べてみた Running Supervisor

ざっくり手順

色々はまったりして参考にしたのは以下のサイト

uwsgiのiniファイルを用意

省略

virtualenvでsupervisordをインストール

$ pip install supervisord

supervisord.conf、xxx.iniを書く

全体の設定はsupervisord.confで、個別のuwsgiに関する設定はxxx.iniで行うようにした

supervisord.confは適当に次のように編集した

  • sudo使うならchownをrootに、でなければ現在のユーザーに
  • pidfileを適当にtmpフォルダに設定
  • includeでincludeしたいファイルを指定する(例えば下のような感じで書く)
[include]
files = /path/to/*.ini

xxx.iniにはuwsgiコマンドを指定する。stopasgroupオプションは有効にする

[hoge:fuga]
command = /path/to/virtualenv/bin/uwsgi /path/to/xxx.ini
stopasgroup = true

aptでsupervisorをインストールして削除

virtualenvでsupervisorをインストールしたいけど、service登録用のスクリプトは欲しかったのでこの作業をした

要はapt-getしてるだけなので省略

/etc/init.d/supervisorを編集

編集カ所は

  • DAEMONに書くsupervisordのパスをvirtuaalenvでインストールしたところにする(/path/to/virtualenv/bin/supervisord)
  • LOGDIRを適当にログを書き出したい場所に指定

service起動

pip installのとこでrootでインストールした場合は

$ sudo service supervisor start

現在のユーザーでインストールした場合はsudo要らないかも

注意

  • uwsgiはコマンドでデーモン化しないこと。デーモン化しちゃうとコントロール出来ない
  • pillowをインストールできないと怒られることがある。必要なライブラリはUbuntu14なら、zlib1g-dev, libtiff5-dev, libjpeg8-dev, libfreetype6-dev, liblcms2-dev, libwebp-dev, tcl8.6-dev, tk8.6-dev, python-tk
  • パーミッションに気をつける。ソケットとかログとか