FreeBSDで Supervisor を使う

Supervisor とはプロセス監視用のスーパーサーバです。同じ種類のプロセス監視サーバではdaemontoolsがあります。

Supervisorはpythonで書かれたおりXML-RPCを使って監視プロセスの情報を取得したり操作を行うことが出来ます。

今回はPSGIで書かれたplackアプリケーション(hello.psgi)を Supervisor を使ってデプロイしてみる。

インストール

FreeBSDではportinstallで簡単インストールできます

$ sudo portinstall sysutils/py-supervisor

supervisorの自動起動設定

/etc/rc.conf

supervisord_enable="YES"

supervisor config設定

 configの詳しい解説は公式サイトを見てください。

設定参考例

/usr/local/etc/supervisord.conf

; Sample supervisor config file.
[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:10001        ; (ip_address:port specifier, *:port for all iface)

[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisor/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=http://127.0.0.1:10001 ; use an http:// url to specify an inet socket

[include]
files=/usr/local/etc/supervisord/*.conf

supervisordから個別のアプリケーションへの監視設定は /usr/local/etc/supervisord/*.conf 以下に配置します。

helloアプリケーション監視用コンフィグ

configの詳しい解説は公式サイトを見てください。ここで大事なのはuserとcommandでしょうか?userは起動するプロセスのユーザー権限を指定する事ができます。今回はwebサーバーと同じwwwで起動する設定。 commandは起動するプログラムそのものを指定します。

今回はホットデプロイ可能なスーパーサーバである start_server を介してplackアプリケーションを起動するため別個にrunスクリプトを用意している。

※本来ならcommandの部分に直接起動するプログラム名を書けば済みますがオプション設定の関係でcommandが非常に長くなってしまう為に別のrunスクリプトに書いております。

/usr/local/etc/supervisord/hello.conf

[program:hello]
user=www
command=/path/to/run
directory=/path/to
stdout_logfile=/var/log/supervisord/hello.log
stderr_logfile=/var/log/supervisord/hello_error.log
numprocs = 1
stdout_logfile_maxbytes = 10MB
stderr_logfile_maxbytes = 10MB
stdout_logfile_backups = 5
stderr_logfile_backups = 5
autostart = true
autorestart = true
startsecs = 5
priority = 998

start_serverを用いてstarmanをアプリサーバとして立ち上げるrunスクリプト

/path/to/run

#!/bin/sh

exec /usr/local/bin/start_server --port 9002 -- /usr/local/bin/plackup -s Starman -E production --interval 2 --workers 10 -a /path/to/hello.psgi

plackで書かれたpsgiアプリ

/path/to/hello.psgi

use Plack::Request;
use Plack::Builder;

my $app = sub {
    my $req = Plack::Request->new(shift);
    my $res = $req->new_response(200);
    $res->content_type("text/html");
    $res->body('HelloWorld!');
    $res->finalize;
};

builder {
    enable "ContentLength";
    $app;
};

supervisord起動停止

supervisordスタート

$ sudo /usr/local/etc/rc.d/supervisord start

supervisordストップ

$ sudo /usr/local/etc/rc.d/supervisord stop

supervisor制御コマンド

監視プロセス個別スタート

$ sudo supervisorctl start hello

監視プロセス個別ストップ

$ sudo supervisorctl stop hello

ステータス情報

$ sudo supervisorctl status hello

全プロセス停止

$ sudo supervisorctl stop all

webインターフェース

supervisorの監視プロセスの状態をwebインターフェースで表示する事もできます。

supervisord.confの中でinet_http_serverセクションに指定したアドレスとポートにブラウザでアクセスすることでブラウザ上でステータスの確認とプロセスの起動停止が操作出来ます。

supervisor

最後に

結局daemontoolsとsupervisordどっちがいいの?ってなる理由ですけどセットアップの簡単さから言えばsupervisorなのかなぁ・・・

私個人はまだdaemontools使ってますけどね

created:

Back to top