生产中的守护进程芹菜
Daemonization celery in production
我正在尝试 运行 Celery 作为 Ubuntu 18.04 中的服务,使用安装在 env
和 Celery 4.1.0 中的 Django 2.1.1 和 Celery 4.1.1全系统安装。我将继续使用 this tutorial 到 运行 Celery 作为服务。这是我的 Django 项目树:
hamclassy-backend
├── apps
├── env
│ └── bin
│ └── celery
├── hamclassy
│ ├── celery.py
│ ├── __init__.py
│ ├── settings-dev.py
│ ├── settings.py
│ └── urls.py
├── wsgi.py
├── manage.py
└── media
这是celery.py:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hamclassy.settings')
app = Celery('hamclassy')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
这里是 /etc/systemd/system/celery.service:
[Unit]
Description=Celery Service
After=network.target
[Service]
Type=forking
User=classgram
Group=www-data
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/home/classgram/www/hamclassy-backend
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
和/etc/conf.d/celery:
CELERYD_NODES="celery-worker"
CELERY_BIN="/home/classgram/www/env/bin/celery"
# App instance to use
CELERY_APP="hamclassy"
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.
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_LEVEL="INFO"
当我 运行 使用 systemctl start celery.service
服务时出现以下错误:
Job for celery.service failed because the control process exited with
error code. See "systemctl status celery.service" and "journalctl -xe"
for detail
当我 运行 sudo journalctl -b -u celery
出现以下日志时:
Starting Celery Service... celery.service: Control process exited,
code=exited status=200 celery.service: Failed with result 'exit-code'.
Failed to start Celery Service.
更多信息:
1) 当我使用 groups classgram
时出现:www-data sudo
。
2) 激活环境后我可以运行 Celery with celery -A hamclassy worker -l info
谢谢
好的,现在我们知道错误是什么(根据您的评论),以下几个步骤很可能会解决您的问题:
为你的 Celery 创建一个虚拟环境:python3 -m venv /home/classgram/venv
您的环境文件要么必须 export PYTHONPATH=/home/classgram/www/hamclassy-backend
,这是最简单的解决方案,有利于测试和开发。但是,对于生产,我建议您构建一个 Python 包(wheel),并将其安装在您的虚拟环境中。
修改您的 systemd 服务文件(也可能是环境文件),以便您直接从我们上面创建的 Python 虚拟环境直接执行 Celery。它应该 运行 芹菜这样(或类似):/home/classgram/venv/bin/celery multi start ${CELERYD_NODES} -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}
。当然,您可以通过将 CELERY_BIN 设置为 /home/classgram/venv/bin/celery
.
来缩短它
我正在尝试 运行 Celery 作为 Ubuntu 18.04 中的服务,使用安装在 env
和 Celery 4.1.0 中的 Django 2.1.1 和 Celery 4.1.1全系统安装。我将继续使用 this tutorial 到 运行 Celery 作为服务。这是我的 Django 项目树:
hamclassy-backend
├── apps
├── env
│ └── bin
│ └── celery
├── hamclassy
│ ├── celery.py
│ ├── __init__.py
│ ├── settings-dev.py
│ ├── settings.py
│ └── urls.py
├── wsgi.py
├── manage.py
└── media
这是celery.py:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hamclassy.settings')
app = Celery('hamclassy')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
这里是 /etc/systemd/system/celery.service:
[Unit]
Description=Celery Service
After=network.target
[Service]
Type=forking
User=classgram
Group=www-data
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/home/classgram/www/hamclassy-backend
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
和/etc/conf.d/celery:
CELERYD_NODES="celery-worker"
CELERY_BIN="/home/classgram/www/env/bin/celery"
# App instance to use
CELERY_APP="hamclassy"
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.
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_LEVEL="INFO"
当我 运行 使用 systemctl start celery.service
服务时出现以下错误:
Job for celery.service failed because the control process exited with error code. See "systemctl status celery.service" and "journalctl -xe" for detail
当我 运行 sudo journalctl -b -u celery
出现以下日志时:
Starting Celery Service... celery.service: Control process exited, code=exited status=200 celery.service: Failed with result 'exit-code'. Failed to start Celery Service.
更多信息:
1) 当我使用 groups classgram
时出现:www-data sudo
。
2) 激活环境后我可以运行 Celery with celery -A hamclassy worker -l info
谢谢
好的,现在我们知道错误是什么(根据您的评论),以下几个步骤很可能会解决您的问题:
为你的 Celery 创建一个虚拟环境:
python3 -m venv /home/classgram/venv
您的环境文件要么必须
export PYTHONPATH=/home/classgram/www/hamclassy-backend
,这是最简单的解决方案,有利于测试和开发。但是,对于生产,我建议您构建一个 Python 包(wheel),并将其安装在您的虚拟环境中。修改您的 systemd 服务文件(也可能是环境文件),以便您直接从我们上面创建的 Python 虚拟环境直接执行 Celery。它应该 运行 芹菜这样(或类似):
/home/classgram/venv/bin/celery multi start ${CELERYD_NODES} -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}
。当然,您可以通过将 CELERY_BIN 设置为/home/classgram/venv/bin/celery
. 来缩短它