Supervisorは、Linux環境においてプロセスを監視・管理するための強力なツールです。Pythonで記述されており、通常のコマンドラインプログラムをデーモンとして実行したり、プロセスが異常終了した際に自動で再起動させたりする機能を提供します。これにより、システムの可用性を高める自己修復機能を実現できます。
1. Python環境の構築
SupervisorはPythonモジュールとして動作するため、まずは適切なPython環境を準備します。ここでは、システムのバージョンに依存しない管理が可能なpyenvを利用した手順を示します。
# 依存パッケージのインストール
yum -y install git gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel
# pyenvの取得と環境設定
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> /etc/profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> /etc/profile
echo 'eval "$(pyenv init -)"' >> /etc/profile
source /etc/profile
# Python 3.7.0のインストール(ミラーサイトを利用して高速化)
export PYTHON_BUILD_MIRROR_URL="https://npm.taobao.org/mirrors/python/"
pyenv install 3.7.0
pyenv global 3.7.0
# バージョン確認
python --version
2. Supervisorのインストール
Python環境が整ったら、pipを使用してSupervisorをインストールします。
pip install supervisor
インストール後、デフォルトの構成ファイルを生成します。
echo_supervisord_conf > /etc/supervisord.conf
3. 管理ディレクトリとログの準備
管理を容易にするため、設定ファイルやログを格納する専用のディレクトリを作成します。
mkdir -p /var/supervisor/conf.d
mkdir -p /var/log/supervisor/nginx
4. Supervisorの基本設定
/etc/supervisord.confを編集し、プロセスの実行環境や管理インターフェースを設定します。
[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB
logfile_backups=5
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
user=root
[inet_http_server]
port=0.0.0.0:9001
username=admin
password=secure_password_123
[supervisorctl]
serverurl=http://127.0.0.1:9001
username=admin
password=secure_password_123
[include]
files = /var/supervisor/conf.d/*.conf
5. Nginxを管理対象に追加する
NginxをSupervisorの管理下に置くには、Nginxをフォアグラウンドで動作させる必要があります。個別設定ファイルを作成します。
# /var/supervisor/conf.d/nginx.conf の作成
[program:nginx_service]
command=/usr/sbin/nginx -g 'daemon off;'
process_name=%(program_name)s
autostart=true
autorestart=true
startsecs=5
stopwaitsecs=10
user=root
stdout_logfile=/var/log/supervisor/nginx/access.log
stderr_logfile=/var/log/supervisor/nginx/error.log
6. サービスの起動と動作確認
設定が完了したら、Supervisordを起動します。
# Supervisordの起動
supervisord -c /etc/supervisord.conf
# 起動状態の確認
supervisorctl status
正常に動作していれば、以下のような出力が表示されます。
nginx_service RUNNING pid 12345, uptime 0:00:10
7. 自動再起動のテスト
Supervisorがプロセスの異常を検知して再起動するかを確認するために、手動でNginxのプロセスを停止させてみます。
# NginxのプロセスIDを確認してKILL
ps aux | grep nginx
kill -15 [PID]
# ログで再起動を確認
tail -f /var/log/supervisor/supervisord.log
ログにINFO spawned: 'nginx_service' with pid ...と表示され、新しいPIDでプロセスが立ち上がっていれば、自己修復機能が正しく動作しています。