🥳

Laravel Windows環境でSupervisorをセットアップ

2021/11/10に公開

こちらの記事と関係していて、Windows環境でワーカーを実行する方法の一つとなりますが、SupervisorをWindowsでも使う方法のまとめとなります。

Supervisorとは

Laravel公式でも勧められているワーカープロセス管理のツールです。もちろん、Laravelに限らず、使用する場面が広くあります(doc)。根本的に、プロセス管理・モニターリングのツールとなります。

これを借りて何をするかというと、Laravelのタスクキューからジョブを消費するワーカーのプロセスを走らせることです。しかも、同時に複数のワーカープロセスを起動することが可能となり、windows自身のスケジューラーより使い勝手が良いです。

ただ、本来Unix-likeのOS向けのツールなので、Windowsで使用するには公式ではサポートされていません。今回はその方法を紹介します。

インストール

まずはPythonをインストールします。公式サイトからで大丈夫です。

次に、git bashをインストールします。ここは必須ではないのでスキップでも構いません。コマンドプロンプトは試していませんので今回はpowershellかgit bashでの前提となります。

以上が終わったら、bashで次のコマンドでsupervisordをインストールします。

pip install supervisor-win

これで一旦インストールが完了しました。

設定

このままでbash/powershellでsupervisordで実行しても、コンフィグファイルがないとのエラーが出てきます。

Error: No config file found at default paths (C:\Python39\etc\supervisord.conf, C:\Python39\supervisord.conf, supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf, /etc/supervisor/supervisord.conf); use the -c option to specify a config file at a different path

デフォルトの場所には見つかりません。ヒントの通り、-cフラグでコンフィグファイルを指定できます。ここは例として、C:\Python39\etc\supervisord.confにコンフィグファイルを作ります。

cd /c/Python39/etc
echo_supervisord_conf > supervisord.conf

これでサンプルのコンフィグファイルが作られます。次にLaravelの設定を追加します。

vim supervisord.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php.exe C:\\Users\\<username>\\path\\to\\app\\artisan queue:work --tries=3 --timeout=30
autostart=true
autorestart=true
user=apache
numprocs=4
startsecs=0
redirect_stderr=true
stdout_logfile=C:\\Users\\<username>\\path\\to\\app\\storage\\logs\\worker.log

commandの部分は基本的にphp artisan queue:workを実行しているので、パラメータなどの追加は自由です。numprocsでワーカーの数が決められます。stdout_logfileでワーカーのログファイルの保存先を決めますが、基本的にプロジェクトのログフォルダーにすれば良いでしょう。

ただ、これだけではエラーになります。理由は[supervisor]セッションの設定に、ファイル保存のパスはLinux向けの設定になっていたからです。次のように、logfilepidfileの保存パスを修正します。

[supervisord]
logfile=C:\\Python39\\etc\\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=C:\\Python39\\etc\\supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false                      ; (start in foreground if true;default false)
silent=false                 ; no logs to stdout if true; default false
minfds=1024                         ; (min. avail startup file descriptors;default 1024)
minprocs=200                        ; (min. avail process descriptors;default 200)

はい、これでコンフィグファイルを保存して、準備はできました。

試しにbash/powshellで実行してみます。

supervisord -c C:\Python39\etc\supervisord.conf

起動されているかどうかが不安なら、supervisordのログファイルを開いてみて、ワーカーの実行状況がわかります。

終わりに

WindowsでSupervisorを使うことが無理だとこの前思っていました。最近の業務で、複数の処理で時間が結構かかるとの問題がありましたが、それで複数のワーカーで並行処理して、処理時間を短縮するという方法にしました。ただ、windowsのタスクスケジューラーで試してみましたが、どうも複数のワーカーの設定がうまくいきません。最終的にsupervisorをなんとか使ってみようと思いましたが、設定のところもいっぱい落とし穴があり、ワーカーが起動となった瞬間涙出そうでした(笑)。

ちなみに、windowsサービスとしてsupervisorをインストールすることも可能らしいですが、試したところモジュールが見つからないことで失敗しています。また原因は詳しく調べていませんが、課題として残ってしまいます。

python -m supervisor.services install -c C:\Python39\etc\supervisord.conf
// または
supervisor_service.exe install -c C:\Python39\etc\supervisord.conf

ではでは。

Discussion