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セクションに指定したアドレスとポートにブラウザでアクセスすることでブラウザ上でステータスの確認とプロセスの起動停止が操作出来ます。
最後に
結局daemontoolsとsupervisordどっちがいいの?ってなる理由ですけどセットアップの簡単さから言えばsupervisorなのかなぁ・・・
私個人はまだdaemontools使ってますけどね