在生产环境(debian 服务器)中,运行 celery(和 celery beat)最好的 "architecture" 是什么?

What is the best "architecture" for running celery (and celery beat) in production environment (debian server)?

I"m trying to figure out the best "architecture" 所以我们托管在debian服务器上的django项目可以使用celery和celery beat。他是我的要求:

根据这些要求,我得出了这些结论:

在这种情况下,当我部署新项目时,除了创建新的 linux 用户、设置 apache 虚拟主机等(我以 root 身份执行)外,我还会为supervisord,这对我来说似乎没问题。然后,当我使用 Fabric 部署新版本的项目时,我只在项目用户下工作。

此解决方案唯一未解决的问题(直到现在我才发现)是 celery beat 的计划配置是在 django 设置中编写的,但 beat deamon 在重新加载之前无法识别配置中的更改。但是,不允许项目用户进行重新加载。

我的问题是我应该如何解决这个问题或者你会向我推荐什么其他架构?谢谢。

我还没有专门用 celery beat 尝试过这个,但我似乎记得它在另一个程序上对我有用。您可以将主管配置为 运行 特定用户下的程序,然后我相信您可以使用以下命令而不需要 sudo 如果它是来自该用户的 运行: supervisorctl [stop/start/restart] [program_name]。请参阅此处的 "user" 参数:

http://supervisord.org/configuration.html#program-x-section-settings

基于,无sudo权限重启supervisord程序的解决方法: 您必须编辑 supervisord.conf 以更改套接字权限(在我的例子中位于 /etc/supervisor/supervisord.conf]

[unix_http_server]
file=/var/run//supervisor.sock   ; (the path to the socket file)
chmod=0766                       ; sockef file mode (default 0700)

然后你要确定,配置文件中写的用户就是重启程序的用户:

[program:projectx_celerybeat]
; Set full path to celery program if using virtualenv
command=/path_to_project_root/env/bin/celery beat -A main -s /path_to_project_root/celerybeat-schedule --loglevel=INFO

; remove the -A myapp argument if you are not using an app instance

directory=/home/xxx/project_root/celery_root/
user=YOUR_USER
numprocs=1
stdout_logfile=/path_to_log/beat.log
stderr_logfile=/path_to_log/beat.log
autostart=true
autorestart=true
startsecs=10

然后由 YOUR_USER 运行的这个命令应该工作:

supervisorctl [stop/start/restart] [program_name]