RoadMovie

write down memos or something I found about tech things

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 ~~とした。

 

以上です。導入するのは大変ですが、一度入れてしまうと超便利かと。先輩に教わりながら進めていったのですが、自分の知識不足と能力不足がまた改めて顕になりました。。。引き続きがんばります!