Django celery守护程序给出“主管致命命令找不到”,但路径正确

时间:2018-08-08 21:38:44

标签: django ubuntu rabbitmq celery supervisor

概述:

我正在尝试将celery作为守护程序运行,以执行发送电子邮件的任务。它在开发中效果很好,但在生产中却没有。我现在已经建立了我的网站,并且每个功能都能正常工作(没有django错误),但是由于守护程序未正确设置而使任务无法完成,并且在ubuntu 16.04中出现了此错误:

project_celery FATAL can't find command '/home/djangodeply/myvenv/bin/celery'

已安装的程序/硬件以及我到目前为止所做的事情:

我正在VPS上使用Django 2.0.5,python 3.5,ubuntu 16.04,rabbitmq和celery。我为此使用venv。我也已经安装了主管,并且在我与sudo service --status-all进行检查时它正在运行,因为它旁边有一个+。还安装了Erlang,当我用top检查时,rabbitmq正在运行。使用sudo service rabbitmq-server status表示Rabbitmq也处于活动状态。

最初,我按照celery website上的说明进行操作,但是它们非常令人困惑,并且经过大约40小时的测试/阅读/观看其他人的解决方案,我无法使它正常工作。感到非常沮丧和失败,我选择了here来建立守护程序,并希望我能到达某个地方,并且我走得更远,但是上面出现了错误。

我通读了主管文档,检查了process states以尝试调试问题,并检查了program settings,我迷路了,因为据我所知,我的路径是正确的文档。

以下是我的文件结构:

home/
    djangodeploy/               # is a superuser
        portfolio-project/
            project/
                __init__.py
                celery.py
                settings.py     # this file is in here too
            app_1/
            app_2/
            ...
            ...
        logs/
            celery.log
        myvenv/
            bin/
                celery       # executable file, is colored green
    celery_user_nobody/      # not a superuser, but created for celery tasks
etc/
    supervisor/
        conf.d/
            project_celery.conf

这是我的project_celery.conf:

[program:project_celery]
command=/home/djangodeply/myvenv/bin/celery worker -A project --loglevel=INFO
directory=/home/djangodeploy/portfolio-project/project
user=celery_user_nobody
numprocs=1
stdout_logfile=/home/djangodeploy/logs/celery.log
stderr_logfile=/home/djangodeploy/logs/celery.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
stopasgroup=true
priority=1000

这是我的init.py:

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']

这是我的celery.py:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
app = Celery('project')

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)

def debug_task(self):
    print('Request: {0!r}'.format(self.request))

更新:这是我的设置。

这是我唯一的设置,因为celery website django instructions上的示例仅显示其他内容,除非我要使用redis之类的东西。我将其放在我的settings.py文件中,因为django说明可以:CELERY_BROKER_URL = 'amqp://localhost'

更新:我创建了rabbitmq用户:

$ sudo rabbitmqctl add_user rabbit_user1 mypassword
$ sudo rabbitmqctl add_vhost myvhost
$ sudo rabbitmqctl set_user_tags rabbit_user1 mytag
$ sudo rabbitmqctl set_permissions -p myvhost rabbit_user1 ".*" ".*" ".*"

当我做sudo rabbitmqctl status时,我得到Status of node 'rabbit@django2-portfolio',但是奇怪的是,我看不到任何节点像下面那样运行,因为方向here表明我应该看到:

{nodes,[rabbit@myhost]},
{running_nodes,[rabbit@myhost]}]

我遵循的步骤:

  1. 我在我所说的位置创建了.conf和.log文件。
  2. sudo systemctl启用管理员
  3. sudo systemctl启动主管
  4. sudo administratorctl重读
  5. sudo administratorctl更新# no errors up to this point
  6. sudo超级用户状态

6点后出现此错误:

project_celery FATAL can't find command '/home/djangodeply/myvenv/bin/celery'

更新:我检查了错误日志,并且在/ var / log / rabbitmq / rabbit@django2-portfolio.log 中有以下多个实例:

=INFO REPORT==== 9-Aug-2018::18:26:58 ===
connection <0.690.0> (127.0.0.1:42452 -> 127.0.0.1:5672): user 'guest' authenticated and granted access to vhost '/'

=ERROR REPORT==== 9-Aug-2018::18:29:58 ===
closing AMQP connection <0.687.0> (127.0.0.1:42450 -> 127.0.0.1:5672):
missed heartbeats from client, timeout: 60s

闭幕声明:

任何人都知道发生了什么事吗?当我查看project_celery.conf文件中的绝对路径时,我会看到所有设置正确,但是显然有些错误。仔细查看我的代码,rabbitmq说没有节点在运行。当我做sudo rabbitmqctl status时,但芹菜却当我做celery status时(<{>显示OK 1 node online)。

任何帮助将不胜感激。我什至专门创建了这个帐户,因为我遇到了这个问题。它使我发疯。如果有人需要更多信息,请询问。这是我第一次部署任何东西,所以我不是专业人士。

1 个答案:

答案 0 :(得分:2)

您可以在project_celery.conf

中尝试以下任何一项吗?
command=/home/djangodeply/myvenv/bin/celery worker -A celery --loglevel=INFO
directory=/home/djangodeploy/portfolio-project/project

command=/home/djangodeply/myvenv/bin/celery worker -A project.celery --loglevel=INFO
directory=/home/djangodeploy/portfolio-project/

此外,您可以在celery.py中将project模块的父文件夹添加到sys.path中(或确保已正确打包了部署并已通过pip或否则)?

我怀疑(根据@Jack Shedd的评论,由于相对于magic celery.py文件设置了目录,因此您引用的项目不存在。)