diadia

興味があることをやってみる。自分のメモを残しておきます。

supervisorについてメモ

ドキュメント

Supervisor: A Process Control System — Supervisor 4.2.0 documentation

supervisorは何なのか?

これはプロセス管理のツールである。

fabricを使った自動デプロイスクリプトを書いては見たもののgunicornのプロセスを切ってから新たに立ち上げることにたいして思うように制御することができなかった。そこでsupervisorを使う事になった。

supervisorのイメージ

supervisorの構成はドキュメントでは以下の構成とされている。

supervisord
supervisorctl
Web Server
XML-RPC Interface

supervisor-components

まだよく分かっていない状態でこれらの役割を敢えていうとすると、supervisordはクライアントから命令を受けるためのサーバーでありsupervisorctlはそのサーバーに命令を送るためのクライアントである。このクライアントはshellのようなインターフェースをもって命令を送ることになる。Web Serverはwebのコントロールパネルから制御するものなのかと仮設を立てているが使っていないのでよくわからない。XML-RPC Interfaceは全くわからない。
自分が言いたいことはsupervisordとsupervisorctlさえ使えばdjangoのアプリケーションのプロセス管理ができるということだ。

djangoのプロセス制御をどのように行ったか

上で説明したようにsupervisordとsupervisorctlさえ使えばプロセス管理ができる。両者を使うには諸設定ファイルが必要なのはもちろん、linuxでは標準実装されていないのでインストールが必要になる。またsupervisorの立ち上げ、supervisorctlを使ってプロセスをkill、アプリケーションの立ち上げを行う。これらをできるだけ順を追って再現できるように振り返りたい。

0. 前提

  • supervisor 4.2.0
  • centos7

1. インストール

supervisorをインストールする。これはpipを使う方法とepelからyum intastallみたいな形でインストールすることもできるようだ。自分はpipからインストールした。 popのほうがより新しいバージョンのsupervisorを使うことができるからだ。

pip install supervisor

installing

2. 設定ファイルを作成

supervisordとsupervisorctlは設定ファイルによって制御されている。この設定ファイルは同一のファイルから両者を制御することもできるし、supervisorctlのコントロールしたいプロセス毎に作成し、それとsupervisordの設定ファイルということもできる。詳しいことは設定ファイルの編集で説明する。

pipでインストールしただけでは設定ファイルが存在しないので設定ファイルを作成する。
設定ファイルは雛形が存在しており、コマンドを使ってその雛形を呼び出し設定ファイルとする。

#supervisorの設定ファイルを/etc配下に作成する
sudo touch  /etc/supervisord.conf
sudo echo_supervisord_conf > /etc/supervisord.conf

echo_supervisord_confのコマンドはsupervisorをインストールすると使えるようになっており、この中に設定ファイルの雛形が書いてある。この中身を設定ファイルにコピーする流れになる。

また設定ファイル名は上記のようにsupervisord.confが望ましいし、当該ファイルの配置場所も/etc/以下に配置するのが望ましい。 それは基本的に-cオプション(設定ファイルの指定)を付さないでコマンドを入力すると、supervisorはsupervisord.confという設定ファイルを読み込もうとする仕様であるからだ。また、設定ファイルの配置する場所も-cオプションがなければ以下のディレクトリから設定ファイルを探す仕様になっているからだ。

../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)
$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)

configuration-file

3. 設定ファイルの編集

作成した/etc/supervisord.confに手を加えるとsupervisordとsupervisorctlが使えるようになる。試してはないので確信が持てないがsupervisord.confにsupervisordとsupervisorctlの両方の内容を記述して動かすことができる。
自分の場合はsupervisordについては/etc/supervisord.confに記述し、supervisorctlで管理したいプロセスは別途設定ファイルを作成し、 /etc/supervisord.confから当該設定ファイルの読み込みませる仕組みにした。したがっていまから行うのは/etc/supervisord.confの編集とsupervisorctlで管理するプロセスに関わる設定ファイルの作成である。

ⅰ. /etc/supervisord.confの編集

supervisordに関する設定内容。ここは設定すると言ってるが全く触らなくてよかった。雛形のママである。
このファイルだとlogfileやpidfileが/tmp以下に作成されるので何らかのエラーが生じた場合は/tmp以下のlogを閲覧することになる。ココは任意に変更すると良いだろう。

[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200
;umask=022                   ; process file creation umask; default 022
;user=supervisord            ; setuid to this UNIX account at startup; recommended if root
;identifier=supervisor       ; supervisord identifier, default is 'supervisor'
;directory=/tmp              ; default is not to cd during start
;nocleanup=true              ; don't clean up tempfiles at start; default false
;childlogdir=/tmp            ; 'AUTO' child log dir, default $TEMP
;environment=KEY="value"     ; key value pairs to add to environment
;strip_ansi=false            ; strip ansi escape codes in logs; def. false

; The rpcinterface:supervisor section must remain in the config file for
; RPC (supervisorctl/web interface) to work.  Additional interfaces may be
; added by defining them in separate [rpcinterface:x] sections.

同ファイルの最下部に[include]がある。これを編集(追記)する。

[include]
files = /etc/supervisord.d/*.conf ;(追記) 起動するプロセスのconfファイルの配置場所
;files = relative/directory/*.ini

include-section-settings

ⅱ. プロセスのconfファイルを作成

プロセスのconfファイルを配置するディレクトリを作成。

sudo mkdir /etc/supervisord.d

プロセスのconfファイルを作成

sudo touch /etc/supervisord.d/django_project.conf

プロセスのconfファイルの編集

sudo vi /etc/supervisord.d/django_project.conf

で以下のように記述する。

[program:django_project] ;この値を引数としてsupervisorctlを使う
directory=/home/user_name/src
command=gunicorn config.wsgi --bind localhost:8000 --env DJANGO_SETTINGS_MODULE=config.prod_settings --daemon config.wsgi:application
numprocs=1
autostart=true
autorestart=true
user=user_name ;デプロイするユーザー名
redirect_stderr=true

4. supervisordの起動とプロセスの実行

supervisorの起動する
supervisord
設定ファイルの読み込み
supervisorctl reread
プロセスのリスタート
supervisorctl restart django_project

一発でうまく起動することが自分はできなかった。自分の場合はすでに8000番ポートを使ってアプリケーションを起動していた。うまくイカない場合はすでに起動しているdjangoのプロジェクトのプロセスをkillしてから実行してみるとよい。

sudo lsof -i:8000

pidの番号をkillする

kill -9 番号