正在尝试使用Django、Redis和ApacheWSGi运行2个芹菜守护进程和队列

正在尝试使用Django、Redis和ApacheWSGi运行2个芹菜守护进程和队列,django,apache,redis,celery,mod-wsgi,Django,Apache,Redis,Celery,Mod Wsgi,我有两个Django 3.0站点(测试和生产),它们作为守护进程运行在apache2 2.4.9、mod_wsgi、redis 4.0.9和celery 4.3.0下,而flower 0.9.7运行在同一台服务器上。每个站点的django代码库是相同的,只是不同的数据库。每个站点都在自己的虚拟环境中运行,但使用相同的requirements.txt文件和python版本。每个站点都有自己的wsgi.py文件、celery.py文件、apache.conf文件、/etc/conf.d/celery

我有两个Django 3.0站点(测试和生产),它们作为守护进程运行在apache2 2.4.9、mod_wsgi、redis 4.0.9和celery 4.3.0下,而flower 0.9.7运行在同一台服务器上。每个站点的django代码库是相同的,只是不同的数据库。每个站点都在自己的虚拟环境中运行,但使用相同的requirements.txt文件和python版本。每个站点都有自己的wsgi.py文件、celery.py文件、apache.conf文件、/etc/conf.d/celery设置文件、/etc/systemd/system/celery.service文件和settings.py文件,其中包含芹菜守护进程的不同设置。只有一个redis服务器正在运行,两个守护进程都与该服务器通信

如果我单独运行每个站点(停止另一个站点的芹菜守护进程),那么芹菜任务都会按预期工作。如果我同时启用这两个守护进程,芹菜任务就会失败,并出现非常奇怪的错误消息——例如,在芹菜任务日志文件中,我得到了“匹配查询不存在”的消息,该消息针对的是在每个守护进程单独运行时工作的同一代码,以及我的开发机器上的同一代码

我认为解决方案是为每个站点设置两个单独的芹菜队列,但这不起作用

在“测试”环境的settings.py中

CELERY_TEST_BROKER_URL = 'redis://:' + '<key>' + '@localhost:6379'
CELERY_TEST_RESULT_BACKEND = 'redis://:' + '<key>' + '@localhost:6379'
CELERY_TEST_ACCEPT_CONTENT = ['application/json']
CELERY_TEST_RESULT_SERIALIZER = 'json'
CELERY_TEST_TASK_SERIALIZER = 'json'
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = 'America/Phoenix'
CELERY_DEFAULT_QUEUE = 'test'    # 'production' for production server
CELERY_DEFAULT_EXCHANGE = 'test' # 'production' for production server
CELERY_DEFAULT_ROUTING_KEY = 'test' # 'production' for production server
芹菜测试服务和芹菜测试服务在/etc/systemd/system中/

[Unit]
Description=Celery Service
After=network.target redis.service
Requires=redis.service

[Service]
Type=forking
User=www-data
Group=www-data
EnvironmentFile=/etc/conf.d/celery_test  # celery_prod for production
WorkingDirectory=/home/mark/python-projects/test-archive  # ../python-projects/archive for production
ExecStart=/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi start $CELERYD_NODES \
    --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} --loglevel="${CELERYD_LOG_LEVEL}"'
ExecReload=/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi restart $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
Restart=always

[Install]
WantedBy=multi-user.target
MemorabilitiaJSON/celery.py(每个虚拟环境中有单独的文件)

如果你能解释一下芹菜任务失败的原因,我将不胜感激。这可能是因为我混淆了芹菜工人、队列、路由器和multi,文档对我帮助不大

谢谢

标记

[Unit]
Description=Celery Service
After=network.target redis.service
Requires=redis.service

[Service]
Type=forking
User=www-data
Group=www-data
EnvironmentFile=/etc/conf.d/celery_test  # celery_prod for production
WorkingDirectory=/home/mark/python-projects/test-archive  # ../python-projects/archive for production
ExecStart=/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi start $CELERYD_NODES \
    --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} --loglevel="${CELERYD_LOG_LEVEL}"'
ExecReload=/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi restart $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
Restart=always

[Install]
WantedBy=multi-user.target
# http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.apps import apps
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MemorabiliaJSON.settings.test-rex') # ...settings.t-rex for production

#app = Celery('MemorabiliaJSON')
#https://browniebroke.com/making-celery-work-nicely-with-django-transactions/
# see BetterTask.py
app = Celery(
    'MemorabiliaJSON',
    task_cls='MemorabiliaJSON.BetterTask:BetterTask',
)
app.config_from_object('django.conf:settings', namespace='CELERY_TEST') # namespace='CELERY_PROD' for production
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])
#app.autodiscover_tasks()
app.conf.task_default_queue = 'test'  # _queue = 'production' for production

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))