在生产环境(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。他是我的要求:
- Celery workers 和 celery beats 应该能够在服务器自动重启后运行。
- 首选使用标准的 Debian 软件包。
- 不需要全局安装的,应该安装在项目virtualenv中。
- Linux 作为 django 项目所有者的用户不需要 sudo 权限即可部署项目
根据这些要求,我得出了这些结论:
- 最好用supervisord去妖化worker和beat。 Supervisord 在标准的 debian 包中,以这种方式安装它意味着 运行 在服务器重启后 supervisord 被处理(这是我不想为每个项目在 virtualenv 本地安装它的主要原因)
- Celery 可以在 virtualenv 中的每个项目本地安装。
在这种情况下,当我部署新项目时,除了创建新的 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]
I"m trying to figure out the best "architecture" 所以我们托管在debian服务器上的django项目可以使用celery和celery beat。他是我的要求:
- Celery workers 和 celery beats 应该能够在服务器自动重启后运行。
- 首选使用标准的 Debian 软件包。
- 不需要全局安装的,应该安装在项目virtualenv中。
- Linux 作为 django 项目所有者的用户不需要 sudo 权限即可部署项目
根据这些要求,我得出了这些结论:
- 最好用supervisord去妖化worker和beat。 Supervisord 在标准的 debian 包中,以这种方式安装它意味着 运行 在服务器重启后 supervisord 被处理(这是我不想为每个项目在 virtualenv 本地安装它的主要原因)
- Celery 可以在 virtualenv 中的每个项目本地安装。
在这种情况下,当我部署新项目时,除了创建新的 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
基于
[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]