Вопрос по ubuntu – Как написать Ubuntu Upstart для Celery (django-celery) в виртуальной среде

15

Мне очень нравится использовать выскочку. В настоящее время у меня есть новые рабочие места для запуска различных экземпляров gunicorn в ряде virtualenv. Однако те 2-3 примера, которые я нашел для сценариев выскочки Celery на веб-сайтах, не работают для меня.

Итак, со следующими переменными, как бы я написал задание Upstart для запуска django-celery в virtualenv.

Путь к проекту Джанго:

/srv/projects/django_project

Путь к этому проекту virtualenv:

/srv/environments/django_project

Путь к настройкам сельдерея - файл настроек проекта Django (django-celery):

/srv/projects/django_project/settings.py

Путь к файлу журнала для этого экземпляра Celery:

/srv/logs/celery.log

Для этого виртуального env пользователь:

iamtheuser

и группа:

www-data

Я хочу запустить Celery Daemon с помощью celerybeat, поэтому команда, которую я хочу передать django-admin.py (или manage.py):

python manage.py celeryd -B

Было бы еще лучше, если сценарий запускается после того, как задание с оружейным оружием начинается, и останавливается, когда задание с оружейным рогом прекращается. Допустим, файл для этого:

/etc/init/gunicorn.conf

Ваш Ответ

2   ответа
1

Вот мой рабочий конфиг с использованием более новой системы systemd, работающей на Ubuntu 16.04 LTS. Сельдерей в виртуальности. Приложение представляет собой Python / Flask.

Системный файл:/etc/systemd/system/celery.service

Вы хотите изменить пользователя и пути.

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

[Service]
Type=forking
User=nick
Group=nick
EnvironmentFile=-/home/nick/myapp/server_configs/celery_env.conf
WorkingDirectory=/home/nick/myapp
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 

Файл среды (ссылка выше):/home/nick/myapp/server_configs/celery_env.conf

# Name of nodes to start
# here we have a single node
CELERYD_NODES="w1"
# or we could have three nodes:
#CELERYD_NODES="w1 w2 w3"

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

# App instance to use
CELERY_APP="myapp.tasks"

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

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

# - %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"

Чтобы автоматически создать журнал и запустить папку с правильными разрешениями для вашего пользователя, создайте файл в/usr/lib/tmpfiles.d, У меня были проблемы с/var/run/celery папка удаляется при перезагрузке и затем сельдерей не может запуститься должным образом.

мой/usr/lib/tmpfiles.d/celery.conf файл:

d /var/log/celery 2775 nick nick -
d /var/run/celery 2775 nick nick -

Включить:sudo systemctl enable celery.service

Теперь вам нужно перезагрузить систему для/var/log/celery а также/var/run/celery папки, которые будут созданы. Вы можете проверить, запускается ли сельдерей после перезагрузки, проверив вход в систему./var/log/celery.

Чтобы перезапустить сельдерей:sudo systemctl restart celery.service Отладка:tail -f /var/log/syslog и попробуйте перезапустить сельдерей, чтобы увидеть, в чем ошибка. Это может быть связано с бэкэндом или другими вещами.

Надеюсь это поможет!

16

Возможно, вам понадобится добавить еще несколько настроек, но я написал сценарий upstart для запуска django-celery как конкретного пользователя в virtualenv:

start on started mysql
stop on stopping mysql

exec su -s /bin/sh -c 'exec "$0" "[email protected]"' user -- /home/user/project/venv/bin/python /home/user/project/django_project/manage.py celeryd

respawn

Это прекрасно работает для меня.

Я знаю, что это выглядит некрасиво, но похоже, что это «правильный» звук. Техника для запуска новых рабочих мест в качестве непривилегированных пользователей, основанная наэтот суперпользовательский ответ.

Я подумал, что мне пришлось бы сделать больше, чтобы заставить его работать внутри virtualenv, но вызов двоичного файла python внутри virtualenv - это все, что нужно.

может быть неплохо добавить свой твик ... Я разместил свой здесь:stackoverflow.com/questions/14275821/…
Отлично, я настроил это, и это работает хорошо.

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