我正在努力找出最好的"体系结构",以便我们在debian服务器上托管的django项目可以使用芹菜和芹菜节拍。他是我的要求:
- 芹菜工作者和芹菜节拍应该能够在服务器重新启动后自动运行
- 最好使用标准的Debian软件包
- 不需要全局安装的,应该安装在项目virtualenv中
- 作为django项目所有者的Linux用户不需要sudo权限即可部署项目
基于这些要求,我得出了以下结论:
- 使用监督员对工人进行监督和殴打是件好事。Supervisord在标准的debian包中,以这种方式安装它意味着在服务器重新启动后Supervisord的运行得到了照顾(这是我不想在每个项目的virtualenv中本地安装它的主要原因)
- Celery可以为virtualenv中的每个项目在本地安装
在这种情况下,当我部署NEW项目时,除了创建新的linux用户、设置apache虚拟主机等,我作为root用户执行这些操作外,我还会为supervisord添加新的配置文件,这对我来说似乎还可以。然后,当我使用Fabric部署新版本的项目时,我只能在项目用户下工作。
这个解决方案中唯一未解决的问题(到目前为止我发现)是,芹菜节拍的调度配置是用django设置编写的,但节拍管理员在重新加载之前无法识别配置中的更改。但是,项目用户不允许进行重新加载。
我的问题是我应该如何解决这个问题,或者你会向我推荐其他什么架构?非常感谢。
我还没有专门在芹菜节拍中尝试过,但我似乎记得它在另一个程序中对我有效。您可以将supervisor配置为在特定用户下运行程序,然后我相信如果从该用户运行程序,您可以使用以下命令而不需要sudo:CCD_ 1。请参阅此处的"用户"参数:
http://supervisord.org/configuration.html#program-x段设置
根据Chris的回答,如何在没有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]