如何将 celery 设置为守护进程

Наг*_*мер 2 django celery

我面临着在 Ubuntu 16.04 服务器上将 celery 设置为我的 django 项目的守护进程的必要性,同时我遇到了几个误解,我将在我的问题中进行描述。我知道根据 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

${CELERY_BIN}   
${CELERYD_NODES} 
${CELERY_APP} 
${CELERYD_PID_FILE} 
${CELERYD_LOG_FILE} 
${CELERYD_LOG_LEVEL} 
${CELERYD_OPTS}' 
Run Code Online (Sandbox Code Playgroud)

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

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

EnvironmentFile=/etc/conf.d/celery
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以指导我吗?预先感谢

小智 6

我也很难理解和实施 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
Run Code Online (Sandbox Code Playgroud)

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


Dej*_*kic 1

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

假设您已celery在...中创建了用户/home/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
Run Code Online (Sandbox Code Playgroud)

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

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