- Очередь Laravel в Docker под управлением Supervisor
- Структура файлов для настройки Supervisor в Docker
- Конфигурация PHP 8 для Supervisor в Docker
- Файл конфигурации Supervisor для Laravel
- Настройка Supervisor в файле
docker-compose.yaml
- Запуск
docker-compose
- Ссылки на используемые материалы
Очередь 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
Ссылки на используемые материалы
- Queues - Laravel - The PHP Framework For Web Artisans
- Docker | Laravel for newbie
- Laravel queues with supervisor - Docker Configuration - DEV Community
Перевод с анлиского:
laravel-for-newbie.kejyun.com