[Laravel5.5]queue:workをsupervisorでデーモン化

# はじめに
laravel5.5のqueueをdatabaseドライバーで利用した。
そのための `php artisan queue:work` コマンドをデーモン化するにあたり、ちゃんと永続化処理をしたかったので公式に推奨されているSupervisorを利用しようとした。

``` console
$ sudo apt-get install supervisor
-bash: apt-get: command not found
```

・・・！！！
~~CentOS6.*上のためapt-getコマンドがデフォルトで入ってないのは当然かもしれない。~~

というところから始まる、supervisor導入からワーカー起動までの忘備録です。

なお、環境は

CentOS 6.9
PHP 7.0
Laravel 5.5
python 2.6.6

となっております。それ以外は未確認ですのでほかのページへ行ってください。

# まずはsupervisorのインストール
supervisorはyumではバージョンが古いため、pythonのインストーラーから直接インストールする必要があります。
すでにyumで入れてしまっている場合は`yum remove supervisor`で消してください。
残したままだとeasy_installで導入しているつもりが古いままになってしまいます。

```console
$ sudo yum install python-setuptools
$ sudo easy_install supervisor
$ supervisord -v
3.3.0
```

-vでバージョンが出れば成功です。
もしもこの時点でhelpを見ろと言われた場合は、バージョンが2系となっている可能性があります。確認してください。

# コンフィグ設定
まずはデフォルトのコンフィグ設定を自動生成します。

```console
$ sudo echo_supervisord_conf > /etc/supervisord.conf
```

これでコンフィグ設定を作れたはずです。
しかし`$ sudo vim /etc/supervisord.conf`で実際に覗くとデフォルトのままではtmpファイルに書き出しまくっているので、もう少しわかりやすいところへ書き出します（任意で変更してください）

```config:supervisord.conf
[unix_http_server]
file=/var/run/supervisor.sock

[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface

[supervisord]
logfile=/var/log/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/var/run/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=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket

[include]
files=/etc/supervisord/*.ini
```

program設定は直接書いても良いようですが、別ファイルに分けたほうが個人的に気持ちが楽なのでinclude設定で読み込みます。

参考サイト
[supervisorをCentOS6.5にインストールしたメモ](https://blog.mitsuto.com/archives/108461)

また、includeで設定したディレクトリにlaravel-workerを作成します。

```console
$ sudo mkdir /etc/supervisord/
$ sudo vim /etc/supervisord/laravel-woker.ini
```

```conf:laravel-woker.ini
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
```

以上でコンフィグ設定は終了。

# supervisorをサービスで起動する
そのまま`chkconfig -add supervisord`とやってもsupervisordは存在しないと言われてしまうので、動作するようにします。
Init Scriptを公開している人がいるため、それを利用しましょう。
[Supervisor/initscripts](https://github.com/Supervisor/initscripts)

```console
$ vim /etc/rc.d/init.d/supervisord
```

で、ファイルを開き、直接ソースコードを書き込みます。
また権限を変更してサービスに登録しましょう。

```console
$ sudo chmod 755 /etc/rc.d/init.d/supervisord
$ sudo chkconfig --add supervisord
```

参考サイト
[Supervisorで簡単にデーモン化](https://qiita.com/yushin/items/15f4f90c5663710dbd56)

実際に `$ sudo service supervisrod start`とやってみて動作したら成功です。
もしもconfigにエラーが発生していなかったら、この時点でlaravel-wokerも動作したことを示す出力が出るはずです。

# supervisorctlでデーモンを確認する。
supervisorにはコマンドラインベースでデーモンの動作状況を確認するsupervisorctlというアプリケーションが入っています。
では動作を確認してみましょう。

```console
$ sudo supervisorctl status
laravel-woker:laravel-woker_00   RUNNING   pid 13698, uptime 0:55:18
```

問題なく動いているようです。（私の手元ではワーカー1つだけだったため1行で終了ですが、Laravelの設定どおりにやると8行くらい出るかもしれません）


以上でsupervisorについての設定は完了です。お疲れさまでした。