プロセスが落ちた際の自動再起動をしたい場合や、Docker の1つのコンテナの中に各種ミドルウェアをまるっと入れる場合などでアプリケーションの動作に必要なミドルウェアを Supervisor で一元管理したいときがあります。
Supervisor: A Process Control System
http://supervisord.org/
Supervisor でデーモンを管理する場合、デーモンをフォアグラウンドで起動させる必要がありますのでミドルウェアの設定変更が必要になる場合があります。その方法についてまとめます。
※CentOS での実行パスなどをベースで記載していますので、各種ミドルウェアの起動パスなどが異なる場合にはお使いのディストリビューションに書き換える必要があります。
Nginx
設定ファイルを書き換えてもいいのですが、起動オプションで設定を上書きすることができますので -g "daemon off;"
を起動オプションに指定します。
また、Nginx はフォークされたプロセスのユーザーは Nginx の設定ファイルに記載しますので、Supervisor で起動するプロセスの実行ユーザーは root のままとします。
[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
MySQL
MySQL では起動したプロセスではなく、フォークされたプロセスの監視を行う必要があります。これについては Supervisor が提供している pidproxy というプログラムを利用して監視します。
Subprocesses
http://supervisord.org/subprocess.html#pidproxy-program
Nginx と同様、フォークされるプロセスは実行時のオプションで指定しますので root のままとします。
[program:mysqld]
command=/usr/bin/pidproxy /var/run/mysqld/mysqld.pid /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
autostart=true
autorestart=true
MongoDB
MongoDB では設定ファイルに fork して起動する設定がありますので、fork = true
と設定ファイルに記載されている場合は fork = false
に変更する必要があります。
##
bind_ip = 0.0.0.0
port = 27017
-fork = true
+fork = false
pidfilepath = /var/run/mongodb/mongodb.pid
logpath = /var/log/mongodb/mongodb.log
dbpath =/var/lib/mongodb
起動するプロセスはフォークされずフォアグラウンドで実行されますので、root 以外の適切なユーザー名で実行させます。今回は MongoDB を RPM からインストールした際に作成された mongodb ユーザーを user=mongodb
として指定しています。
[program:mongod]
command=/usr/bin/mongod -f /etc/mongodb.conf
autostart=true
autorestart=true
user=mongodb
Redis
Redis はバージョン 2.6 からコマンドラインから設定ファイルの値を指定することもできますが、バージョンに依存しないよう設定ファイルの値を変更することとします。
手順は MongoDB とほぼ同様、設定ファイルの中で daemonize yes
と記載があったら daemonize no
へ変更します。
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
-daemonize yes
+daemonize no
# When running daemonized, Redis writes a pid file in /var/run/redis.pid by
# default. You can specify a custom pid file location here.
Redis も実行ユーザーでプロセスが立ち上がるので、redis ユーザーで起動させるため user=redis
と指定します。
[program:redis]
command=/usr/sbin/redis-server /etc/redis.conf
autostart=true
autorestart=true
user=redis
php-fpm
php-fpm の場合、Nginx と同様起動時のオプションでフォアグラウドで起動するよう指定ができますので --nodaemonize
とオプションに指定しておきます。
php-fpm では起動される pool ごとに実行時ユーザーを設定ファイルで記載しますので、実行時のユーザーは root のままとします。
[program:php-fpm]
command=/usr/sbin/php-fpm --nodaemonize
autostart=true
autorestart=true
その他のミドルウェアやアプリケーションサーバーを起動させる場合のポイント
以上、一部のミドルウェアでの設定・起動例を挙げましたが、他のミドルウェアやアプリケーションサーバーでは
- フォアグラウドで実行させること
- Supervisor の設定にもよりますが、実行時ユーザーを指定しないと root で起動されるので気をつける
という点に注意しながら設定ファイルを書くといいでしょう。