我將 Celery 作為服務在 Ubuntu 20.04 上運行,RabbitMQ 作為代理。
Celery 反復重啟,因為它無法訪問 RabbitMQ url (RABBITMQ_BROKER),這是一個保存在Django 根目錄外的settings.py 中的變數。
如果我嘗試通過命令列啟動 celery,也會發生同樣的情況。
我已經確認可以從 Django 中通過 views.py 列印陳述句訪問該變數。
如果我將 RABBITMQ_BROKER 變數放在 Django 根芹菜作品中的 settings.py 中。
我的問題是,當 celery 放置在 /etc/opt/mydjangoproject/settings.py 中時,如何讓 celery 識別變數 RABBITMQ_BROKER?
我的 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"
uj5u.com熱心網友回復:
將以下行添加/etc/opt/mydjangoproject/settings.py到 celery的末尾以獲取正確的 broker url(大小寫可能因您使用的 celery 版本而異):
BROKER_URL = broker_url = RABBITMQ_BROKER
這將把配置放在一個地方,它會被呼叫 celery 的config_from_object函式讀取。
接下來,您還必須向 systemd 單元添加一個環境變數。由于您正在訪問設定為mydjangoproject.settings,您必須mydjangoproject在 PYTHONPATH 中設定可訪問目錄的父目錄:
Environment=PYTHONPATH=/etc/opt
在PYTHONPATH提供蟒蛇目錄試圖匯入時嘗試的串列。但是,因為我們有兩個同名的不同目錄用作單個包,所以我們還必須/etc/opt/mydjangoproject/__init__.py/opt/mydjangoproject/__init__.py將以下行添加到和:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
uj5u.com熱心網友回復:
我通過將以下內容添加到 /etc/systemd/system/celery.service 解決了這個問題
Environment="PYTHONPATH=/etc/opt/mydjangoproject:/opt/mydjangoproject"
Environment="DJANGO_SETTINGS_MODULE=settings"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/346387.html
