Настройка Celery и его индикатора прогресса для производственной среды Django-EC2(AWS)-Gunicorn-Nginx

Я пытаюсь внедрить Celery progress bar на свой Django-сайт, который сейчас находится в Сети через AWS EC2, Gunicorn и Nginx, но я просто не могу заставить Celery progress bar работать. Предполагается, что полоса появляется после того, как посетитель нажимает кнопку отправки, которая запускает процесс, выполняемый Celery, и обратная связь о прогрессе поступает на фронтенд через Celery Progress Bar. Celery запускается изначально, но затем гаснет, если я нажимаю кнопку отправки на моем сайте, и никогда не перезапускается, пока я не перезапущу его вручную.

Ниже приводится отчет о неудаче с сельдереем:

× celery.service - Celery Service
     Loaded: loaded (/etc/systemd/system/celery.service; enabled; preset: enabled)
     Active: failed (Result: timeout) since Mon 2024-12-09 15:14:14 UTC; 6min ago
    Process: 68636 ExecStart=/home/ubuntu/venv/bin/celery -A project worker -l info (code=exited, status=0/SUCCESS)
        CPU: 2min 51.892s

celery[68636]: During handling of the above exception, another exception occurred:
celery[68636]: Traceback (most recent call last):
celery[68636]:   File "/home/ubuntu/venv/lib/python3.12/site-packages/billiard/pool.py", line 1265, in mark_as_worker_lost
celery[68636]:     raise WorkerLostError(
celery[68636]: billiard.exceptions.WorkerLostError: Worker exited prematurely: signal 15 (SIGTERM) Job: 0.
celery[68636]: """
celery[68636]: [2024-12-09 15:14:13,435: WARNING/MainProcess] Restoring 2 unacknowledged message(s)
systemd[1]: celery.service: Failed with result 'timeout'.
systemd[1]: Failed to start celery.service - Celery Service.
systemd[1]: celery.service: Consumed 2min 51.892s CPU time, 817.8M memory peak, 0B memory swap peak.

Вот мой файл celery.service:

[Unit]
Description=Celery Service
After=network.target

[Service]
Type=forking
User=ubuntu
Group=www-data
EnvironmentFile=/etc/default/celeryd/celery.conf
WorkingDirectory=/home/ubuntu/project
ExecStart=/home/ubuntu/venv/bin/celery -A project worker -l info

[Install]
WantedBy=multi-user.target

Мой файл celery.conf:

# Name of nodes to start
CELERYD_NODES="w1 w2 w3"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/home/ubuntu/venv/bin/celery"

# App instance to use
CELERY_APP="project.celery:app"

# How to call manage.py
CELERYD_MULTI="multi"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=2"

# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
#   and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"

Мой файл конфигурации Gunicorn:

"""Gunicorn *development* config file"""

# Django WSGI application path in pattern MODULE_NAME:VARIABLE_NAME
wsgi_app = "project.wsgi:application"
# The granularity of Error log outputs
loglevel = "debug"
# The number of worker processes for handling requests
workers = 2
# The socket to bind
bind = "0.0.0.0:8000"
# Restart workers when code changes (development only!)
reload = True
# Write access and error info to /var/log
accesslog = errorlog = "/var/log/gunicorn/dev.log"
# Redirect stdout/stderr to log file
capture_output = True
# PID file so you can easily fetch process ID
pidfile = "/var/run/gunicorn/dev.pid"
# Daemonize the Gunicorn process (detach & enter background)
daemon = True

(подробности о файле Gunicorn я узнал от Real Python.)

И мой конфигурационный файл Nginx:

server_tokens               off;
access_log                  /var/log/nginx/mysite.access.log;
error_log                   /var/log/nginx/mysite.error.log;

# This configuration will be changed to redirect to HTTPS later
server {
  server_name               .mysite.com;
  listen                    80;
  location / {
    proxy_pass              http://localhost:8000;
    proxy_set_header        Host $host;
  }

  location /static {
    autoindex on;
    alias /var/www/mysite.com/static/;
  }
}

(Я также взял детали файла Nginx из Real Python.)

Я перерыл весь Интернет в поисках подсказок, но просто не могу понять, что делать. Есть много информации об использовании Celery в среде разработки (что я уже умею делать), но когда дело доходит до производственной среды, это оказывается очень трудно решить, отчасти потому, что я не могу интегрировать имеющиеся решения с имеющимися у меня конфигурационными файлами.

Поэтому я выкладываю свою проблему. Возможно, кто-то может посоветовать, как интегрировать имеющиеся решения с представленными мной кодами конфигурации. Celery в стороне, мой сайт работает с файлами Gunicorn и Nginx, которые у меня есть от Real Python, поэтому я не хочу их менять. Как заставить Celery работать с ними; вот где я застрял.

Вернуться на верх