在同一台服务器上运行多个Django Celery网站

8
我在同一台服务器上使用apache2虚拟服务器运行多个Django/apache/wsgi网站,并且想要使用celery。但是如果我为多个网站启动celeryd,所有网站都会使用我最后启动的celeryd实例的配置(日志、数据库等)。
有没有办法使用多个Celeryd(每个网站一个)或一个适用于所有网站的Celeryd?看起来应该是可行的,但我找不到具体方法。

2
你的Celery设置中针对每个网站使用不同的broker_user和broker_password,这样做有帮助吗? - Crazyshezy
是的!我只需要一个不同的broker_user和broker_vhost。谢谢! - Tickon
@Crazyshezy,对于排队任务,是的,但守护进程还需要指向正确的Django设置文件,以便在正确的环境中执行它。我认为OP正在询问如何执行后者。如果您只运行单个守护程序,则没有简单的方法可以做到这一点。frog32的答案可能是最佳解决方案。 - Cerin
2个回答

8

这个问题让我很头疼,一开始来这里的时候没有注意到@Crazyshezy的评论。我只是通过更改每个Web应用程序中settings.py中的代理URL来解决了这个问题。

app1.settings.py

BROKER_URL = 'redis://localhost:6379/0'

app2.settings.py

BROKER_URL = 'redis://localhost:6379/1'

你是否在一个监管实例下运行它们?当我启动我的监管程序时,它为每个应用程序使用相同的设置文件(即使我在 supervisord.conf 的“command”部分中使用不同的 manage.py 文件),因此我的不同 BROKER_URL 设置没有任何效果。 - Felix Böhme
1
@FelixBöhme 我没有使用supervisor来运行这个程序。你能否直接使用"manage.py celery worker --settings=app.settingsx"指定设置呢? - Ryu_hayabusa
啊,好主意。谢谢,那样会更容易些。不过我太晚看到这个了,很遗憾。最终我只好将其从Django-supervisor中移除,直接使用Supervisord。但至少我知道如果需要的话,我可以回到使用Django-supervisor。 - Felix Böhme

3

是的,有一种方法。

我们使用supervisor为需要使用celery的每个项目启动守护进程。

Supervisor配置文件如下:

[program:PROJECTNAME]
command=python manage.py celeryd --loglevel=INFO --beat
environment=PATH=/home/www-data/projects/PROJECTNAME/env/bin:/usr/bin:/bin
directory=/home/www-data/projects/PROJECTNAME/
user=www-data
numprocs=1
umask=022
stdout_logfile=/home/www-data/logs/%(program_name)s.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stderr_logfile=/home/www-data/logs/%(program_name)s.error.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
autorestart=true
autostart=True
startsecs=10
stopwaitsecs = 60
priority=998

如果您使用此设置,还有另一个优点:celery守护程序完全在用户空间中运行。

请记住为您的项目使用不同的代理后端。如果您为每个项目使用相同的rabbitmq虚拟主机或相同的redis数据库,则无法正常工作。


谢谢,我只是通过使用不同的Rabbitmq用户和vhost就让它工作了。但是使用supervisor会有什么优势吗? - Tickon
它为我们提供了职责的清晰分割。服务器管理员必须确保supervisor始终运行。我们只需要处理我们的工作进程,不需要root权限来执行此操作。 - frog32
@frog32 如果项目版本发布在时间戳目录中,这将如何工作呢?(在这种情况下,Apache指向一个WSGI文件符号链接,该符号链接由部署脚本在每个发布时更新,因此无法真正确定虚拟环境的绝对目录,除非我们创建另一个符号链接)。 - user2298943
1
@user2298943 使用符号链接作为目录应该没有问题。为了安全起见,您应该先停止任务,然后更改符号链接,最后再启动任务。 - frog32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接