Настройка Laravel Queue в Docker: использование Supervisor для управления воркерами
Docker Compose и Laravel: как настроить Supervisor для обработки очередей

Автоматизация обработки очередей Laravel в Docker с помощью Supervisor



Очередь Laravel в Docker под управлением Supervisor

Мы можем легко запустить php artisan queue:work, чтобы обрабатывать фоновые задачи в Laravel, используя supervisor для поддержания работы процессов queue:work.  

Команда, которая позволяет обрабатывать задачи с приоритетом (сначала высокий, затем низкий):

php artisan queue:work --queue=high,low

Однако вместо прямого запуска команды очереди мы можем предпочесть выполнение этих задач внутри Docker-контейнера.

Структура файлов для настройки Supervisor в Docker

Мы будем использовать docker compose для сборки всей среды с очередями и Supervisor.

Приведенная структура файлов представляет собой полную конфигурацию, которую мы планируем создать для всей среды.

- docker-compose.yaml
- docker
    - dockerfile
        - supervisor.dockerfile
    - supervisor
        - conf.d
            - supervisord.conf

Конфигурация PHP 8 для Supervisor в Docker

Поскольку задача очереди требует запуска всего приложения Laravel, нам потребуется такая же среда PHP в Docker, которая используется для работы приложения.

В процессе обработки очереди необходимо иметь доступ к базе данных очередей redis или базам данных mysql, postgresql. Поэтому вся среда Docker должна иметь возможность доступа ко всем этим базам данных.

В файле настроек переменных окружения .env должны быть заданы следующие параметры:

WWWGROUP=1000
WWWUSER=1000

Мы установим supervisor в соответствии со следующими требованиями:

  • php
  • mysql или postgresql
  • redis
# docker/dockerfile/supervisor.dockerfile
FROM php:8-fpm

RUN docker-php-ext-install pdo pdo_mysql

RUN apt-get update && apt-get install -y supervisor

# Создание всех необходимых директорий
RUN mkdir -p /var/www/html && \
    mkdir -p /var/www/html/storage && \
    mkdir -p /var/www/html/storage/logs && \
    mkdir -p /var/www/html/storage/framework && \
    mkdir -p /var/www/html/storage/framework/views && \
    mkdir -p /var/www/html/storage/framework/sessions && \
    mkdir -p /var/www/html/storage/framework/cache && \
    chmod -R 775 /var/www/html/storage

RUN mkdir -p "/etc/supervisor/logs"

COPY docker/supervisor/conf.d/supervisord.conf /etc/supervisor/supervisord.conf

CMD ["/usr/bin/supervisord", "-n", "-c",  "/etc/supervisor/supervisord.conf"]

Файл конфигурации Supervisor для Laravel

Нам необходимо создать конфигурационный файл Laravel supervisor для настройки команд, которые мы хотим запускать.

php /var/www/html/laravel_app/artisan queue:work --queue=high,normal,low --sleep=30 --tries=3 --max-time=3600

Мы можем определить, сколько процессов хотим запускать одновременно.

numprocs=3

Мы можем сохранять журнал процессов supervisor в папке нашего Laravel приложения

stdout_logfile=/var/www/html/laravel_app/storage/logs/worker.log

Вот полная конфигурация Laravel supervisor, которая хранится по пути docker/supervisor/conf.d/supervisord.conf

; docker/supervisor/conf.d/supervisord.conf
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

[supervisord]
user=root
nodaemon=true  # В Docker должно быть true!
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
logfile_maxbytes=5MB
logfile_backups=10
loglevel=info
minfds=1024
minprocs=200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --timeout=60
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stopwaitsecs=60

[include]
files = /etc/supervisor/conf.d/*.conf

Настройка Supervisor в файле docker-compose.yaml

Мы можем использовать supervisor.dockerfile для запуска нашей среды. И подключить всё приложение Laravel по пути /var/www/html/laravel_app.

Смонтировать папку /resources/docker/supervisor/conf.d/ в путь /etc/supervisor/conf.d/.

А текже настроить, чтобы наш Docker-контейнер с Supervisor зависел от баз данных postgresql и redis.

# docker-compose.yaml
networks:
    sail:
      driver: bridge
services:   supervisor:
     container_name: supervisor
     build:
         context: .
         dockerfile: docker/dockerfile/supervisor.dockerfile
     restart: always
     depends_on:
         - laravel.test
         - redis
         - mysql
     networks:
         - sail
     volumes:
         - '.:/var/www/html' # как у сервиса laravel.test
     environment:
          WWWUSER: '${WWWUSER}'

Запуск docker-compose

Мы можем выполнить команду docker-compose up -d supervisor, чтобы запустить этот контейнер с Supervisor в фоновом режиме.

# Run on the foreground
docker-compose up supervisor
# Run on the background
docker-compose up -d supervisor

Ссылки на используемые материалы

Перевод с анлиского:
laravel-for-newbie.kejyun.com

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню