Supervisorでamon2アプリのデーモン化 with plenv
使用ツールなど
amon2(flavor=Basic)
perl 5.16.3(plenv 使用)
carton
Supervisor
(一般ユーザー名をhomepageとしている)
今回はデプロイのためにamon2で作ったアプリをデーモン化しようとしたが、-Dオプションでデーモン化ができなかったため、supervisorを導入することにした。
(※概要などはこちらのブログを参考にしてみてください → http://blog.hakutoitoi.com/?p=343)
Supervisorのインストール
# yum install python-setuptools # easy_install pip # pip install supervisor
必要なディレクトリを作成
# mkdir /var/log/supervisord # mkdir /etc/supervisord.d
# vi /etc/supervisord.conf [unix_http_server] file=/var/run/supervisor.sock [supervisord] logfile=/var/log/supervisord.log loglevel=debug pidfile=/var/run/supervisord.pid nodaemon=false minfds=1024 minprocs=200 environment=SHELL="/bin/sh" [supervisorctl] serverurl=unix:///var/run/supervisor.sock history_file=~/.sc_history [include] files=/etc/supervisord.d/*.ini [rpcinterface:supervisor] supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface
# vi /etc/supervisord.d/supervisord.ini [group:supervisord] programs=サービス名(カンマ区切りでいくつも追加可能) [program:サービス名] command=bash アプリルートまでの絶対path/hoge.sh numprocs=1 autostart=true autorestart=true startsecs=5 user=homepage redirect_stderr=true stdout_logfile=/var/log/supervisord/サービス名_out.log stdout_logfile_maxbytes=0 stdout_logfile_backups=0 stderr_logfile=/var/log/supervisord/サービス名_err.log stderr_logfile_maxbytes=0 stderr_logfile_backups=0 environment=HOME="/home/homepage",USER="homepage", PATH="$HOME/.plenv/bin:$PATH" directory=アプリルートまでの絶対path
今回はplenvを使っているので普通に起動するとシステムのperlを見に行ってplenvでの設定が適用されず、エラーになりまくる。なのでまずはパスを設定しておくことが重要。
[program:サービス名]以下のcommand=の部分は実際に実行するコマンドを設定するのだが、この時にそのコマンド自体のパスを指定してやらなければならない。今回はそこをshellスクリプトでまとめてアプリのルートディレクトリに置いている。
# アプリのルートディレクトリ/hoge.sh #!/bin/bash export PATH="$HOME/.plenv/bin:$PATH" eval "$(plenv init -)" exec plenv exec carton exec plackup app.psgi
このhoge.shに設定を色々書いているのだがここでplenvのパスを通しておく(設定しておく)ことが超重要!
3行目に起動コマンドを記述している。
"plenv exec"でplenvのperlを使うことを指定、"carton exec"でcartonのcpanを使用することを指定している。1行目のexecは全体の実行。これがないとsupervisorをリスタートさせた時にうまくいかない。
Upstart経由でsupervisorを起動
# vi /etc/init/supervisord.conf description "supervisord" start on runlevel [2345] stop on runlevel [!2345] respawn exec /usr/bin/supervisord -n
Supervisorのイニシャルスタート
# initctl start supervisord
エラーが出た後は基本的には、supervisorctl reload → supervisorctl statusしてエラーログみての繰り返しで解決しましょう。
下記、簡単にですがこの作業途中に使ったsupervisorのコマンド一覧
☁ ~homepage supervisorctl reload ☁ ~homepage supervisorctl status ☁ ~homepage supervisorctl restart グループ名:サービス名
僕の場合、start出来たもののrestartをかけるとうまくプロセスを殺してくれないというエラーにも遭遇しました。
☁ ~homepage supervisorctl restart supervisord:サービス名 supervisord:サービス名: stopped supervisord:サービス名: ERROR (abnormal termination)
これは上のhoge.shの3行目に書いてある起動コマンドの先頭にexecをつけていないために起こったようです。なので上のとおりやっていれば起こらないと思いますが一応念の為にメモ。
☁ ~homepage supervisorctl restart supervisord:サービス名 supervisord:サービス名: stopped supervisord:サービス名: started
これで成功です。ブラウザからアクセスしてみてください。(plackだと5000番ポートがデフォルトなのでlocalhost:5000などで。)
-----------------------------------
Supervisor導入途中でいろいろ出たエラー(・∀・)
hoge.sh: line 2: carton: command not found hoge.sh: line 1: plenv: command not found hoge.sh: line 2: carton: command not found hoge.sh: line 1: plenv: command not found hoge.sh: line 2: carton: command not found hoge.sh: line 1: plenv: command not found hoge.sh: line 2: carton: command not found
これはcartonとplenvのパスが通っていないため。上述したように、これらのパスを指定することがまず重要。plenvを使っている際はcrontabなどでも同じようなエラーにぶち当たることがあるようなので注意。(※自戒も込めて)
/usr/bin/env: bash: No such file or directory /usr/bin/env: bash: No such file or directory /usr/bin/env: bash: No such file or directory /usr/bin/env: bash: No such file or directory /usr/bin/env: bash: No such file or directory /usr/bin/env: bash: No such file or directory /usr/bin/env: bash: No such file or directory
これは僕の環境ではoh-my-zshを使用しているため、zshを使っているのですが、supervisorの設定をbashとしていたことを失念していたことによりエラー。ということで、command=bash ~~とした。
以上です。導入するのは大変ですが、一度入れてしまうと超便利かと。先輩に教わりながら進めていったのですが、自分の知識不足と能力不足がまた改めて顕になりました。。。引き続きがんばります!