supervisorを入れる
- 2022年5月3日
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 を再起動してプロセスも起動していて、アクセスしたら同じ画面が出てきたので、とりあえずの設定はよさそうだ。