如何将芹菜设置为守护进程

How to setup celery as daemon

我需要在 Ubuntu 16.04 服务器上为我的 django 项目设置 celery 作为守护进程,同时我遇到了几个误解,我将在我的问题中描述。我知道根据 Stack 的规则,提问应该只问一个明确的问题,但我会在一个问题中问几个,因为第一个问题来自第二个等等。

为了将 celery 调为守护进程,我决定使用 SystemD。在文档 Demonization celery 中提供了一个指南,但它不是我想要的那么清楚,也许是因为我是初学者。我的第一个问题是:我应该单独设置 celery 和 celerybeat 吗? 这是文档提供的配置示例

[Unit] 
Description=Celery Service    
After=network.target 

[Service] 
Type=forking 
User=celery 
Group=celery 
EnvironmentFile=/etc/conf.d/celery 
WorkingDirectory=/opt/celery 
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

我所有的误解都与这段代码有关,下一个问题是:

我应该在配置的服务部分指定什么 usergroup?在上面的文档示例中,为用户和组指定了芹菜,但是当我检查 Ubuntu 上的用户和组时,我没有芹菜用户和组,如果答案是肯定的,我应该创建这种用户和组我应该提供什么权利对于芹菜用户和组?或者我应该在用户和组设置中指定我在服务器上工作的 Ubuntu 用户?

下一个问题与所有变量有关,这些变量用于指定设置的不同部分,例如在上面的配置示例中 ExecStart 设置有多个变量

${CELERY_BIN}   
${CELERYD_NODES} 
${CELERY_APP} 
${CELERYD_PID_FILE} 
${CELERYD_LOG_FILE} 
${CELERYD_LOG_LEVEL} 
${CELERYD_OPTS}' 

我应该在哪里指定这个变量我认为它应该在 django settings.py 文件中但是上面的文档提供了让我感到困惑的例子也许你可以想一想为什么我不能尝试在 [=] 中配置这个变量37=] 而不是在这里问,但我无法测试它,因为我不了解用户和组问题

下一个问题是关于这个设置的

EnvironmentFile=/etc/conf.d/celery

我应该在这里指定什么,因为我的系统上没有这个文件?我应该创建它吗?这似乎是 celery 的默认设置,但我使用 django 和我在我的 django 项目 settings.py 文件

中指定的 celery 的所有相关设置

有人可以指导我吗?提前致谢

是,创建新用户(celery 是个好名字)。不需要任何特殊属性。普通用户应该没问题。您在 /etc/conf.d/celery 文件中定义必要的环境变量。

假设您在 /home/celery 中创建了 celery 用户...以该用户身份登录,并创建 Python 3 虚拟环境:python3 -m venv ~/venv。之后你的 /etc/conf.d/celery 应该是这样的:

CELERY_BIN=/home/celery/venv/bin/celery   
CELERY_APP=myproject.myapp               # change this to however you named it
CELERY_OPTS=-Ofair -c12                  # any other options here

您需要在这里定义您在 systemd 服务文件中使用的所有变量。

此外,在 Exec{Start/Stop/Reload} 中不需要 /bin/sh -c - ${CELERY_BIN} multi ... 将起作用,因为 ${CELERY_BIN} 应该指向 Celery 脚本你的虚拟环境,它是可执行的。

我也很难理解和执行 celeryproject.org 的 systemd 守护进程指南中给出的说明。最后我只是使用了通用的守护进程指令并且它起作用了。我正在使用 Flask,但我想这也适用于您:

这是我的 celery.service 文件。我在虚拟环境中有烧瓶和芹菜 运行 (venv) :

[Unit]
Description=Celery Service
After=network.target

[Service]
User=your_username
WorkingDirectory=/home/your_username/your_projdir
Environment="PATH=/home/your_username/your_projdir/venv/bin"
ExecStart=/home/your_username/your_projdir/venv/bin/celery worker -A celery_worker.celery --loglevel=info

[Install]
WantedBy=default.target

您可以在此处添加更多命令,并选择包括 EnvironmentFile,但这个简单的设置对我来说效果很好。