お疲れ様です。ギークフィードエンジニアのサミーラです。私は2.5年間ぐらいLaravelフレームワークでWEBシステム開発をしています。
Laravelによるプロジェクトの経験
- 通話録音システムの制御および表示Webシステム
- モバイルゲームのバックエンドシステム
- WEB電話帳システム
- IP-PBXのWEBプロビジョニングシステム。
Introduction
LaravelのQueueを使用して、PHPのバックグラウンド処理ができる方法について、Laravelでバックグラウンド処理のブログで話した時にworkerプロセスについても話しました。
workerプロセスはartisanコマンドで実行できますけど、いろいろな原因でworkerが停止になる可能性があります。そうなると新しくQueueに入るJOBが処理されなくなります。(JOB実行のためにWorkerがないので。。)
上の現象が問題ですよね。。でも、解決できる方法がありますよ。。そのためにSupervisorというプロセス管理システムを使用することができます。
この記事でSupervisorを使用してworkerプロセスを管理する方法について話します。
これらはlaravelの基本的な知識で行うことができます。あと、この記事に関するテストをした環境は
- Centos 7.6
- PHP 8
- Laravel 8.0
- MySQL 15.1 Distrib 10.3.12-MariaDB
LinuxにSupervisorをインストールする方法
以下のステップでSupervisorをCentosにインストールすることができます。
- sudo yum update -y
- sudo yum install epel-release
- sudo yum update
- sudo yum -y install supervisor
- sudo systemctl start supervisord
- sudo systemctl enable supervisord
- sudo systemctl status supervisord
Supervisorの設定
SupervisorをインストールするとCentosで「/etc/supervisord.conf」ファイルが作成されます。以下の行をsupervisord.confに入れたら、プロセス管理設定ができます。
1 2 3 4 5 6 7 8 9 10 11 |
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /var/www/myproject/artisan queue:work --queue=worker_queue --delay=10 --tries=5 autostart=true autorestart=true user=apache numprocs=8 startsecs=0 redirect_stderr=true stdout_logfile=/var/log/appname/worker.log stopwaitsecs=3600 |
- program ➔ プロセスを指定する任意の名前
- command ➔ 実行したいコマンド
- autostart ➔ trueの場合はSupervisorを再起動する時に対象のプロセスも自動的に再起動される
- autorestart ➔ trueの場合はプロセスが停止されると自動的に再起動される
- user ➔ プロセスを実行するユーザー
- numprocs ➔ 非同期で実行したいプロセス数
- startsecs ➔ プロセス開始からRUNNINGまでの秒数
- redirect_stderr ➔ trueの場合はプロセスのstderrがstdoutへリダイレクトされる
- stdout_logfile ➔ stdoutを出力したいファイルのフルパス
- stopwaitsecs ➔ プロセスを強制終了するまでの秒数
★上のコマンド(command)だとLaravelプロジェクトでworker_queueを対象にしてworkerプロセス8個が実行されて監視されます。
★Exceptionでプロセスが失敗されると「–tries=5」なので5回リトライされる。リトライされる時に毎回10秒「–delay=10」後にリトライされる。
★「startsecs=0」に設定しないと、例えば:startsecs=1(デフォルト)の場合は1秒前にExceptionが発生したらworkerプロセスがfailedステータスになってexitになる可能性があります。それで、Supervisorの「startretries=3(デフォルト)」設定でworkerが3回再起動されて、その後にworker再起動を諦めます。
★stopwaitsecsが一番長い時間処理されるJOBの時間以上の値に設定しないとJOBが処理中でKILLされる可能性があります。
参照
Supervisorのまとめ
LaravelのQueue機能でJOBを処理する時に継続的に処理されるため、JOB実行するworkerプロセスの監視システムが必要です。そのためにlinuxのSupervisorを使用する必要があります。
ALL THE BEST!!! HAPPY & CLEAN CODING!!!
- SupervisorでLaravelのQueue worker管理 - 2021-07-27
- Laravelでバックグラウンド処理。。。 - 2021-03-22
- NATファイアウォール背後のサーバーをZabbixで監視するTips - 2020-09-09
- Laravelのパフォーマンスを向上しましょう - 2019-12-02
- Laravelのサービスプロバイダーの仕組みやメリットとは - 2019-09-04