@AntonIgin

Демон в celery для django: какнастроить?

Использую Celery 4, Django 1.11, Python 3.5. С Celery познакомился совсем недавно, буквально вчера смог запустить первый таск с включенным вручную воркером.

Возникла проблема с настройкой демона.

Открыл документацию:
docs.celeryproject.org/en/latest/userguide/daemonizing.html

Выбрал вариант с celeryd, переложил этот файл:
https://github.com/celery/celery/tree/3.1/extra/ge...
в папку etc/init.d/ без изменений.

Создал файл celeryd и внес туда текст, указанный в документации в качестве тестовой конфигурации, и переложил в etc/default/.

А дальше ничего не понимаю. Обо всем постараюсь по порядку.
1. Как должна выглядеть настройка в default?
Сейчас у меня так:
CELERYD_NODES="irr_parser"
# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
CELERY_APP="irr_parser"
CELERYD_CHDIR="/opt/Myproject/"
CELERYD_OPTS="--time-limit=300 --concurrency=8"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists (e.g., nobody).
CELERYD_USER="celery"
CELERYD_GROUP="celery"
CELERY_CREATE_DIRS=1


irr_parser - это имя проекта и одновременно папки, в которой хранятся settings.py и другие полагающиеся файлы вместе с celery.py.
Так вот. CELERY_APP - что сюда вписывать? Сказано "App instance to use", Гугл говорил, что Экземпляр приложения для использования" - какого приложения? В котором есть таска для celery? Или речь о каком-то другом приложении?
И как создать celery-пользователя? Погуглил, но не понял ответа.
И почему CELERYD_CHDIR="/opt/Myproject/"? Так и не понял, зачем нужен редирект куда-то (а я так понял, это адрес, куда переместиться во время работы). Зачем это нужно и помешает ли сохранять получаемые данные (сохранять изображения в папках) по относительным адресам в django-проекте?
Плюс вызвал вопросы этот пункт:
CELERY_BIN="/usr/local/bin/celery"
Прошел по пути, никакого celery там не увидел.

2. Что делать после настройки? В документации указано что-то про django-настройки и пояснено значение переменных, прилагается несколько кусков кода, но даже с переводчиком не могу понять их назначения.
CELERYD_SU_ARGS="-l"
Что это? Зачем это? Что делать после того, как я сделаю оба файла celeryd пригодными для работы?
  • Вопрос задан
  • 2257 просмотров
Решения вопроса 1
Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах
Прежде всего хочу обратить внимание вот на это:
Выбрал вариант с celeryd

Если вы "выбирали" между celeryd или celerybeat, то тут выбор бессмысленен: celeryd - демон для выполнения заданий, celerybeat - следит за расписанием заданий, отправляя их в заданное время на выполнение. Так что, если у вас есть надобность выполнять задания по расписанию, настраивать надо оба демона.

Теперь немного ответов на вопросы.

CELERY_APP - что сюда вписывать?

Это экземпляр класса celery.Celery, вот путь до него и надо прописать, в формате package[.subpackages].module:variable. Например, у меня есть файл project/celery.py, в котором создаётся экземпляр таким образом:
from celery import Celery

app = Celery('project')

И я впишу в CELERY_APP значение project.celery:app
У вас наверняка подобный код тоже есть в проекте, если вы делали по документации

И как создать celery-пользователя? Погуглил, но не понял ответа.

Я для всего проекта использую одного пользователя, того, под которым django выполняется (у меня webapp)

И почему CELERYD_CHDIR="/opt/Myproject/"? Так и не понял, зачем нужен редирект куда-то (а я так понял, это адрес, куда переместиться во время работы). Зачем это нужно и помешает ли сохранять получаемые данные (сохранять изображения в папках) по относительным адресам в django-проекте?

Эту опцию не использую, вместо неё у меня используется WorkingDirectory на уровне systemd, но смысл абсолютно тот же.
Это не редирект, это просто указание рабочей папки, относительно которой будет запускаться ваш демон. При правильной настройке работа проекта в режиме celery-воркера ничем не должна отличаться от работы проекта в веб-режиме. На уровне кода никаких ветвлений на тему "если я демон - то делай так, а если нет - делай эдак" быть не должно (и я даже не знаю, как их вообще делать).

CELERY_BIN="/usr/local/bin/celery"
Прошел по пути, никакого celery там не увидел.

Ну блин, куда вы установите celery, там его исполняемый файл и будет. Например, у меня все python-зависимости, куда входит и celery, установлены в virtual env'е, и путь до него такой: /home/webapp/Env/project-backend-3.5/bin/celery

2. Что делать после настройки? В документации указано что-то про django-настройки и пояснено значение переменных, прилагается несколько кусков кода, но даже с переводчиком не могу понять их назначения.

Что делать после того, как я сделаю оба файла celeryd пригодными для работы?

После настройки - запускать, тестировать, отлаживать. Всё как обычно.

CELERYD_SU_ARGS="-l"
Что это? Зачем это?

Не знаю, и видимо, не нужно. Там даже написано, что не рекомендуется.

Вот мои конфиги (для systemd), делал на основе конфигов из официальной репы celery.

Файл сервиса celeryd (/etc/systemd/system/celery.service):
[Unit]
Description=Celery Service
After=network.target redis.target

[Service]
Type=forking
User=webapp
Group=webapp
EnvironmentFile=-/etc/systemd/celery.conf
WorkingDirectory=/home/webapp/project_dir/project/src
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p ${CELERYD_STATE_DIR}
ExecStartPre=/bin/chown -R ${CELERYD_USER}:${CELERYD_GROUP} ${CELERYD_STATE_DIR}
ExecStart=/bin/sh -c '${CELERY_BIN} multi start \
    ${CELERYD_NODES} \
    -A ${CELERY_APP} \
    --pidfile=${CELERYD_PID_FILE} \
    --logfile=${CELERYD_LOG_FILE} \
    --loglevel=${CELERYD_LOG_LEVEL} \
    ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait \
    ${CELERYD_NODES} \
    --pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart \
    ${CELERYD_NODES} \
    -A ${CELERY_APP} \
    --pidfile=${CELERYD_PID_FILE} \
    --logfile=${CELERYD_LOG_FILE} \
    --loglevel=${CELERYD_LOG_LEVEL} \
    ${CELERYD_OPTS}'

[Install]
WantedBy=multi-user.target


Файл сервиса celerybeat (/etc/systemd/system/celerybeat.service):
[Unit]
Description=CeleryBeat Service
After=network.target redis.target rabbitmq.target

[Service]
Type=simple
User=webapp
Group=webapp
EnvironmentFile=-/etc/systemd/celery.conf
WorkingDirectory=/home/webapp/project_dir/project/src
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p ${CELERYBEAT_STATE_DIR}
ExecStartPre=/bin/chown -R ${CELERYD_USER}:${CELERYD_GROUP} ${CELERYBEAT_STATE_DIR}
ExecStartPre=/bin/rm ${CELERYBEAT_SCHEDULE}
ExecStart=/bin/bash -c '${CELERY_BIN} beat \
    -A ${CELERY_APP} \
    --workdir=${CELERYBEAT_WORKDIR} \
    --pidfile=${CELERYBEAT_PID_FILE} \
    --logfile=${CELERYBEAT_LOG_FILE} \
    --loglevel=${CELERYBEAT_LOG_LEVEL} \
    --schedule=${CELERYBEAT_SCHEDULE}'
ExecStop=/bin/systemctl kill celerybeat.service

[Install]
WantedBy=multi-user.target


Файл конфигурации сервисов celeryd и celerybeat (/etc/systemd/celery.conf):
# See
# http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#available-options

# Common Celery Settings
CELERY_BIN="/home/webapp/Env/project-backend-3.5/bin/celery"
CELERYD_USER="webapp"
CELERYD_GROUP="webapp"
CELERY_APP="project.celery:app"

# Common env settings
DJANGO_SETTINGS_MODULE=settings.production
LC_ALL=ru_RU.UTF-8
LC_LANG="ru_RU.UTF-8"
LANG=ru_RU.UTF-8

# Worker settings
CELERYD_NODES="w1 w2 w3 w4 w5 w6"
CELERYD_OPTS="-Q:w1 default --autoscale:w1=8,4 \
-Q:w2 queue2 --autoscale:w2=6,2   \
-Q:w3 queue3 --autoscale:w3=8,2 \
....................
-Q:w6 queue6 --autoscale:w6=6,2       "

CELERYD_MULTI="multi"
CELERYD_STATE_DIR="/var/run/celery"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n.log"
CELERYD_LOG_LEVEL="INFO"

# Beat settings
CELERYBEAT_STATE_DIR="/var/run/celerybeat"
CELERYBEAT_PID_FILE="/var/run/celerybeat/beat.pid"
CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"
CELERYBEAT_LOG_LEVEL="INFO"
CELERYBEAT_SCHEDULE="/var/run/celerybeat/schedule"
CELERYBEAT_WORKDIR="/home/webapp/project_dir/project/src"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы