我面临着在Ubuntu 16.04服务器上为我的django项目设置芹菜作为守护进程的必要性。在这样做的过程中,我遇到了几个误解,我将在问题中描述这些误解。我知道根据Stack的规则,提问应该只问一个明确的问题,但我会在一个问题中问几个,因为第一个问题来自第二个问题等等。
对于作为守护进程的tune-celeni,我决定使用SystemD
。在文档Demonization芹菜提供了一个指南,但它并不像我想要的那样清晰,也许是因为我是初学者。我的第一个问题是:我应该分别设置芹菜和芹菜吗?以下是文档提供的配置示例
[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
我所有的误解都与这段代码有关,下一个问题是:
我应该在配置的服务部分指定什么user
和group
?在上面的文档示例中,芹菜为用户和组指定,但当我在Ubuntu上检查用户和组时,我还没有芹菜用户和组。如果答案是肯定的,我应该创建这种用户和组吗?或者我应该在用户和组设置中指定我在服务器上工作的Ubuntu用户?
下一个问题涉及用于指定设置的不同部分的所有变量,例如在ExecStart
设置中的上述配置示例中,这些变量具有多个变量
${CELERY_BIN}
${CELERYD_NODES}
${CELERY_APP}
${CELERYD_PID_FILE}
${CELERYD_LOG_FILE}
${CELERYD_LOG_LEVEL}
${CELERYD_OPTS}'
在我应该指定这个变量的地方,我认为它应该在djangosettings.py
文件中,但上面的文档提供了一个让我困惑的例子,也许你可以思考为什么我不能尝试在settings.py中配置这个变量,而不是在这里问它,但我不能测试它,因为我不了解用户和组的问题
下一个问题是关于这个设置
EnvironmentFile=/etc/conf.d/celery
因为我的系统上没有这个文件,所以我应该在这里指定什么?我应该创建它吗?这似乎是芹菜的默认设置,但我使用django和我在django项目设置.py文件中指定的芹菜的所有相关设置
有人能给我指路吗?提前感谢
我也很难理解和实现celeryproject.org的systemd守护程序指南中给出的说明。最后,我只使用了一般的守护程序指令,它就工作了。我正在使用烧瓶,但我想这也应该适用于你:
这是我的celeb.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,但这个简单的设置对我来说效果很好。
是的,创建新用户(celery
是个好名字(。不需要任何特殊属性。普通用户应该可以。您可以在/etc/conf.d/celery文件中定义必要的环境变量。
假设您已经在/home/celery
中创建了celery
用户。。。以该用户身份登录,并创建Python3虚拟环境: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脚本,该脚本是可执行的。