supervisorを入れる

2022/02の作業


uwsgi を自動起動する為に、supervisor を入れる。

systemd でもいい様な気がするけど、死活監視等もしてくれるみたいで、使った事がないから supervisor をいれてみる。

venv の下に入れても大丈夫なのかどうかが良くわからないので、とりあえず、インストールした python に pip する。


1.sudo の python の設定

sudo した時の Python3 が os に初めから入っている方になるので、インストールした Python3 を使う様に設定しておく。

元々入っていたのが、Python3.7、/usr/local/bin にインストールしたのが Python3.9。

$ sudo which python3
/bin/python3
$ sudo python3 --version
Python 3.7.10
$ sudo vi /etc/sudoers
・・・・
#Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults    secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
・・・・
$ sudo which python3
/usr/local/bin/python3
$ sudo python3 --version
Python 3.9.10



2.supervisor のインストール

$ sudo pip3 install supervisor
・・・・
Installing collected packages: supervisor
Successfully installed supervisor-4.2.4
・・・・

pip が古いとか出ているけど入った。


3.supervisor をちょっと設定

設定ファイルを出力する echo_supervisord_conf ( /usr/local/bin に作成されていた)を実行し、/etc の下に supervisord.conf ファイルを作成する。

今使ってるユーザは /etc の下にファイルを作成する権限が無いので sudo で実行。

ついでに、supervisor から起動するプロセスの設定ファイルを入れとくディレクトリを作成。

$ sudo mkdir /etc/supervisor
$ sudo sh -c "python3 /usr/local/bin/echo_supervisord_conf > /etc/supervisor/supervisord.conf"
$ sudo mkdir /etc/supervisor/supervisord.d


作成された supervisord.conf を好みで多少変更。

ついでに、ログ出力のディレクトリを作成しておかないと supervisord の起動に失敗するので、作成しておく。

$ sudo vi /etc/supervisor/supervisord.conf
・・・・
; ログの出力先をシスログ達と同じところに出力する様に変更
;logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
;logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=2MB
・・・・
; pid 用のディレクトリを変更
;pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
pidfile=/var/run/supervisord.pid
・・・・
; 設定を読み込むディレクトリを変更
;[include]
;files = relative/directory/*.ini
[include]
files = supervisord.d/*.ini
・・・・
$ sudo mkdir /var/log/supervisor



4.uwsgi で Djangoを起動する supervisor の設定ファイルの作成

上の supervisord.conf の [include] セクションの files に設定したディレクトリにファイルを作成。

設定値はよくわからないので、サンプルが載ってるページを参考に作成。

ログ辺りは後で logroate と合わせて修正する。

$ sudo vi /etc/supervisor/supervisord.d/worksite.ini
[program:Wagtail]
; 起動コマンド
command = /home/work_user/worksite_venv/bin/uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
; 起動ユーザ
user = work_user
; プロセスダウン時に自動再起動
autorestart = true
; 標準出力をログに出力する所をsupervisorの所にどこでもいいけど
stdout_logfile = /var/log/supervisor/uwsgi_wagtail-supervisord.log
; ログ出力の設定をとりあえず
stdout_logfile_maxbytes = 1MB
stdout_logfile_backups = 5
stdout_capture_maxbytes = 1MB
; エラー出力を標準出力にリダイレクト
redirect_stderr = true


5.supervisor の systemd への登録

supervisor が自動起動する様に systemd に登録しておく。

github に centos7 用のスクリプトを作ってる人 ( https://github.com/zokeber/supervisor-systemd )がいるので、使わせてもらう。

設定方法も readme に書いてあるので、参照。

今回は手を抜いてファイルだけ持ってきて設定。

supervisord、supervisorctl のパスを実際ディレクトリに合わせて変更。( /usr/local/bin になっていたので変更)

そして、サービスに登録しておく。

$ sudo curl -o /etc/systemd/system/supervisord.service https://raw.githubusercontent.com/zokeber/supervisor-systemd/master/etc/systemd/system/supervisord.service
$ sudo systemctl enable supervisord.service


6.systemd からの supervisor の起動からの uwsgi の起動

サービスから起動して確認してみる。

$ sudo systemctl start supervisord
$ sudo systemctl status supervisord
● supervisord.service - Supervisor process control system for UNIX
   Loaded: loaded (/etc/systemd/system/supervisord.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-02-07 08:20:35 UTC; 9s ago
     Docs: http://supervisord.org
 Main PID: 4985 (supervisord)
   CGroup: /system.slice/supervisord.service
           tq4985 /usr/local/bin/python3.9 /usr/local/bin/supervisord -n -c /etc/supervisor/supervisord.conf
           tq4986 /home/work_user/work_venv/bin/uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
           tq4987 /home/work_user/work_venv/bin/uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
           mq4988 /home/work_user/work_venv/bin/uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini

Feb 07 08:20:35 ip-999-999-0-1.us-east-2.compute.internal systemd[1]: Started Supervisor process control system for UNIX.
Feb 07 08:20:35 ip-999-999-0-1.us-east-2.compute.internal supervisord[4985]: 2022-02-07 08:20:35,528 CRIT Supervisor is running as root.  Privileges ...ssage.
・・・・


supervisor のコマンドでも起動を確認。

supervisord.d 内に作成したファイルの program セクションのプロセス名が表示される。

$ sudo supervisorctl status
Wagtail                          RUNNING   pid 4986, uptime 0:05:32


ps でみると、uwsgi.ini で設定した processes +1 起動してる。

$ ps -ef | grep uwsgi
work_user 4986  4985  2 08:20 ?    00:00:00 /home/work_user/work_venv/bin/uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
work_user 4987  4986  0 08:20 ?    00:00:00 /home/work_user/work_venv/bin/uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini
work_user 4988  4986  0 08:20 ?    00:00:00 /home/work_user/work_venv/bin/uwsgi --socket :8001 --ini /home/work_user/worksite/uwsgi.ini


これで、uwsgi 使っての Django の自動起動の設定完了。

ip が 変わるかもしれないが、OS を再起動してプロセスも起動していて、アクセスしたら同じ画面が出てきたので、とりあえずの設定はよさそうだ。