Django 生产中的甜芹菜

Django 生产中的甜芹菜,django,service,celery,systemctl,Django,Service,Celery,Systemctl,我试图在Ubuntu 18.04中运行芹菜作为服务,使用安装在env中的Django 2.1.1和芹菜4.1.1,以及系统范围内安装的芹菜4.1.0。我打算用芹菜做服务。这是我的Django的项目树: hamclassy-backend ├── apps ├── env │ └── bin │ └── celery

我试图在Ubuntu 18.04中运行芹菜作为服务,使用安装在
env
中的Django 2.1.1和芹菜4.1.1,以及系统范围内安装的芹菜4.1.0。我打算用芹菜做服务。这是我的Django的项目树:

    hamclassy-backend
                 ├── apps
                 ├── env
                 │   └── bin
                 │        └── celery
                 ├── hamclassy
                 │   ├── celery.py
                 │   ├── __init__.py
                 │   ├── settings-dev.py
                 │   ├── settings.py
                 │   └── urls.py
                 ├── wsgi.py
                 ├── manage.py
                 └── media
这是芹菜.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/芹菜服务:

[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/芹菜:

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芹菜.service运行服务时,出现以下错误:

celery.service的作业失败,因为控制进程已退出 错误代码。请参阅“systemctl status芹菜.service”和“journalctl-xe” 详情

当我运行
sudo journalctl-b-u芹菜时,会出现以下日志:

开始芹菜服务。。。芹菜服务:控制进程已退出, 代码=退出状态=200芹菜。服务:失败,结果为“退出代码”。 无法启动芹菜服务

有关详细信息
1)当我使用
groups classgram
时,会出现:
www-data-sudo

2)激活环境后,我可以用
芹菜运行芹菜-一个一流的工人-l info


谢谢您

好的,现在我们已经知道了错误是什么(从您的评论中),以下几个步骤很可能会解决您的问题:

  • 为您的芹菜创建虚拟环境:
    python3-m venv/home/classgram/venv

  • 您的环境文件必须导出PYTHONPATH=/home/classgram/www/hamclassy backend
  • ,这是最简单的解决方案,有利于测试和开发。但是,对于生产环境,我建议您构建一个Python包(wheel),并将其安装到您的虚拟环境中

  • 修改systemd服务文件(可能还有环境文件),以便直接从上面创建的Python虚拟环境执行芹菜。它应该以这种方式运行Celery(或类似的方式):
    /home/classgram/venv/bin/Celery multi-start${CELERYD_NODES}-A${CELERYD_APP}--pidfile=${CELERYD_PID_FILE}--logfile=${CELERYD u LOG_FILE}--loglevel=${CELERYD LOG_LOG_LEVEL lage}${CELERYD u OPTS}
    。当然,您可以通过将芹菜_-BIN设置为
    /home/classgram/venv/BIN/cellery
    来缩短它


  • 我建议您以systemd服务文件中指定的用户身份登录,获取环境文件的源代码,并像systemd运行芹菜工人一样运行芹菜工人,查看失败原因。谢谢您的回复。错误是关于module
    ModuleNotFoundError:没有名为'hamclassy'
    的模块。当我在不激活虚拟环境的情况下运行芹菜-A hamclassy worker-l info
    时,也会出现此错误,因此我认为服务无法运行,因为在执行此命令之前我无法激活虚拟环境。我怎么能做到?上帝保佑你,主人。你救了我好几天。这是工作了。我已经为django创建了自己的env,所以不需要创建新的env,但我已经按照您告诉我的方式更改了systemd,它现在正在工作。