在同一台服务器上运行多个 Django Celery 网站
Posted
技术标签:
【中文标题】在同一台服务器上运行多个 Django Celery 网站【英文标题】:Running multiple Django Celery websites on same server 【发布时间】:2012-12-05 04:25:30 【问题描述】:我正在使用 apache2 虚拟服务器在同一台服务器上运行多个 Django/apache/wsgi 网站。而且我想使用 celery,但是如果我为多个网站启动 celeryd,所有网站都将使用我启动的最后一个 celeryd 实例的配置(日志、数据库等)。
有没有办法使用多个 Celeryd(每个网站一个)或一个 Celeryd 用于所有这些?看起来应该是可行的,但我不知道如何。
【问题讨论】:
不会在您的芹菜设置中为每个网站设置不同的 broker_user、broker_password 帮助吗? 是的!我只需要一个不同的 broker_user 和 broker_vhost。谢谢! @Crazyshezy,对于排队任务,是的,但是守护进程还需要指向正确的 Django 设置文件,以便在正确的环境中执行它。我认为 OP 会问以后该怎么做。如果您只运行一个守护程序,则没有简单的方法可以做到这一点。 frog32 的答案可能是最好的解决方案。 【参考方案1】:这个问题很头疼,刚来的时候没有注意到@Crazyshezy 的评论。我刚刚通过在 settings.py 中为每个 Web 应用更改代理 URL 来完成此操作。
app1.settings.py
BROKER_URL = 'redis://localhost:6379/0'
app2.settings.py
BROKER_URL = 'redis://localhost:6379/1'
【讨论】:
您是否在一个主管实例下运行它们?当我启动我的主管时,它为每个应用程序使用相同的设置文件(即使我在 supervisord.conf 的“命令”部分使用不同的 manage.py 文件),所以我不同的 BROKER_URL 设置无效。 @FelixBöhme 我没有使用主管运行它。你不能只使用“manage.py celery worker --settings=app.settingsx”来指定设置吗? 啊,好主意。谢谢,那会更容易。看到这个太晚了,可惜。我最终把它从 django-supervisor 中取出,直接使用 supervisord。但至少我知道如果需要我可以重新使用 django-supervisor。【参考方案2】:是的,有办法。 我们使用主管为我们需要的每个项目启动 celery 守护进程。
主管配置文件如下所示:
[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 用户和虚拟主机就可以使用它。但是使用supervisor会有好处吗? 它为我们提供了清晰的职责划分。服务器管理员必须确保主管始终在运行。我们只需要惹恼我们的工人,并且不需要root权限就可以做到这一点。 @frog32 如果项目版本在带时间戳的目录中发布,这将如何工作(在这种情况下,apache 指向一个 wsgi 文件符号链接,该符号链接由部署脚本在每次发布时更新,因此没有真正的方法将绝对目录告诉 virtualenv,除非我们创建另一个符号链接)。 @user2298943 使用符号链接作为目录应该没有问题。为了安全起见,您应该先停止任务,然后更改符号链接,然后再次启动任务。以上是关于在同一台服务器上运行多个 Django Celery 网站的主要内容,如果未能解决你的问题,请参考以下文章
托管在同一台服务器上的 Django 和 React 的 CORS 问题