【发布时间】:2021-12-16 20:49:54
【问题描述】:
我在 Ubuntu 20.04 上将 Celery 作为服务运行,并使用 RabbitMQ 作为代理。
Celery 反复重启,因为它无法访问 RabbitMQ url (RABBITMQ_BROKER),这是一个保存在 Django 根目录 outside 中的变量。
如果我尝试通过命令行启动 celery,也会发生同样的情况。
我已确认可以在 Django 中通过 views.py 打印语句访问该变量。
如果我将 RABBITMQ_BROKER 变量放在 Django 根芹菜的 settings.py 中。
我的问题是,当变量 RABBITMQ_BROKER 放在 /etc/opt/mydjangoproject/settings.py 中时,如何让 celery 识别它?
我的 celery.py 文件:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjangoproject.settings')
app = Celery('mydjangoproject')
default_config = 'mydjangoproject.celery_config'
app.config_from_object(default_config)
app.autodiscover_tasks()
我的 celery_config.py 文件:
from django.conf import settings
broker_url = settings.RABBITMQ_BROKER
etc...
/etc/opt/mydjangoproject/ 中的 settings.py(不相关的东西已删除):
from mydangoproject.settings import *
RABBITMQ_BROKER = 'amqp://rabbitadmin:somepassword@somepassword@webserver:5672/mydangoproject'
etc...
我的 /etc/systemd/system/celery.service 文件:
[Unit]
Description=Celery Service
After=network.target
[Service]
Type=forking
User=DJANGO_USER
Group=DJANGO_USER
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/opt/mydjangoproject
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
我的 /etc/conf.d/celery 文件:
CELERYD_NODES="worker"
CELERY_BIN="/opt/mydjangoproject/venv/bin/celery"
CELERY_APP="mydjangoproject"
CELERYD_CHDIR="/opt/mydjangoproject/"
CELERYD_MULTI="multi"
CELERYD_OPTS="--time-limit=300 --without-heartbeat --without-gossip --without-mingle"
CELERYD_PID_FILE="/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"
【问题讨论】: