Laravel Windows環境でSupervisorをセットアップ
こちらの記事と関係していて、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向けの設定になっていたからです。次のように、logfile
とpidfile
の保存パスを修正します。
[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