各種ミドルウェアをSupervisorで管理する

  • 80
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

プロセスが落ちた際の自動再起動をしたい場合や、Docker の1つのコンテナの中に各種ミドルウェアをまるっと入れる場合などでアプリケーションの動作に必要なミドルウェアを Supervisor で一元管理したいときがあります。

Supervisor: A Process Control System
http://supervisord.org/

Supervisor でデーモンを管理する場合、デーモンをフォアグラウンドで起動させる必要がありますのでミドルウェアの設定変更が必要になる場合があります。その方法についてまとめます。

※CentOS での実行パスなどをベースで記載していますので、各種ミドルウェアの起動パスなどが異なる場合にはお使いのディストリビューションに書き換える必要があります。

Nginx

設定ファイルを書き換えてもいいのですが、起動オプションで設定を上書きすることができますので -g "daemon off;" を起動オプションに指定します。

また、Nginx はフォークされたプロセスのユーザーは Nginx の設定ファイルに記載しますので、Supervisor で起動するプロセスの実行ユーザーは root のままとします。

/etc/supervisor.d/nginx.conf
[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 のままとします。

/etc/supervisor.d/mysqld.conf
[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 に変更する必要があります。

/etc/mongodb.conf
 ##
 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 として指定しています。

/etc/supervisor.d/mongod.conf
[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 へ変更します。

/etc/redis.conf
# 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 と指定します。

/etc/supervisor.d/redis.conf
[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 のままとします。

/etc/supervisor.d/php-fpm.conf
[program:php-fpm]
command=/usr/sbin/php-fpm --nodaemonize
autostart=true
autorestart=true

その他のミドルウェアやアプリケーションサーバーを起動させる場合のポイント

以上、一部のミドルウェアでの設定・起動例を挙げましたが、他のミドルウェアやアプリケーションサーバーでは

  • フォアグラウドで実行させること
  • Supervisor の設定にもよりますが、実行時ユーザーを指定しないと root で起動されるので気をつける

という点に注意しながら設定ファイルを書くといいでしょう。