Ruby on rails Capistrano未正确重新启动混合群集
我有一个由三个混血儿组成的集群在nginx下运行,我使用capistrano2.4.3部署了这个应用程序。当我在有运行系统的情况下“cap deploy”时,行为是:Ruby on rails Capistrano未正确重新启动混合群集,ruby-on-rails,ruby,deployment,capistrano,mongrel,Ruby On Rails,Ruby,Deployment,Capistrano,Mongrel,我有一个由三个混血儿组成的集群在nginx下运行,我使用capistrano2.4.3部署了这个应用程序。当我在有运行系统的情况下“cap deploy”时,行为是: 应用程序已部署。代码已成功更新 在cap部署输出中,有以下内容: 正在执行“sudo-p”sudo password:' mongrel_rails群集::重新启动-C /var/www/rails/myapp/current/config/mongrel_cluster.yml” 服务器:[“myip”] [myip]正在执行
- 正在执行“sudo-p”sudo password:' mongrel_rails群集::重新启动-C /var/www/rails/myapp/current/config/mongrel_cluster.yml”
- 服务器:[“myip”]
- [myip]正在执行命令
- **[out::myip]正在停止端口9096
- **[out::myip]正在停止端口9097
- **[out::myip]正在停止端口9098
- **[out::myip]已启动端口9096
- **[out::myip]已启动端口9097
- **[out::myip]已启动端口9098
def run
stop
start
end
在调用“start”之前,它不会等待或检查进程是否退出。这是。我将补丁应用到Mongrel集群,问题消失了 我不喜欢这么简单,但在它尝试启动时,听起来pid文件仍然挂在那里。确保用手挡住杂种狗。手动清理pid文件。然后执行cap部署。首先,通过只调用
cap部署:重新启动来缩小测试范围。您可能希望传递--debug
选项以在远程执行之前进行提示,或者传递--dry run
选项以查看调整设置时发生的情况
乍一看,这听起来像是pid文件或混合进程上的权限问题,但很难确定。我注意到的几件事是:
- 将
:runner
变量显式设置为nil
——是否有具体原因
- Capistrano2.4为
引入了一个新的行为:admin\u runner
变量。没有看到整个配方,这可能与你的问题有关吗?
:跑步者vs:admin\u跑步者(来自)
一些CAPPER已经注意到:runner用户运行deploy:setup和deploy:cleanup会弄乱他们精心设计的权限。我同意这是个问题。在这个版本中,deploy:start、deploy:stop和deploy:restart在sudo时继续使用:runner用户,但是deploy:setup和deploy:cleanup将使用:admin\u runner用户。默认情况下,:admin\u runner变量是未设置的,这意味着这些任务将以root用户身份运行,但如果希望它们以:runner身份运行,只需执行“set:admin\u runner,runner”
我对下一步做什么的建议。手动停止杂种狗并清理PID。手动启动杂种狗。接下来,在调试问题时继续运行cap deploy:restart
。必要时重复。您可以在capistrano配方中添加以下内容,明确告知mongrel_集群配方在开始之前删除pid文件:
# helps keep mongrel pid files clean
set :mongrel_clean, true
这导致它将--clean选项传递给mongrel_cluster_ctl
我回头看了看我的一个部署方法,发现我也改变了重启任务的工作方式。查看mongrel用户组中的以下消息:
以下是我的部署:重新启动任务。我承认这有点像黑客
namespace :deploy do
desc "Restart the Mongrel processes on the app server."
task :restart, :roles => :app do
mongrel.cluster.stop
sleep 2.5
mongrel.cluster.start
end
end
不管怎样,我的杂种狗都是在上一个停止命令关闭它们之前开始的
睡眠2.5不是一个好的解决方案,如果它需要超过2.5秒来停止所有运行的杂种狗
似乎需要:
stop && start
vs
(bash就是这样工作的,&&等待第一个命令完成w/o错误,而“;”只是运行下一个命令)
我想知道是否有:
wait cluster_stop
then cluster_start
讨论得好:谢谢Ryan。我想是你把我弄松了。当我把问题解决后,我会跟进的。这是正确的。请参阅我对问题的编辑:mongrel_cluster有一个补丁修复了该行为。请看以下内容:
wait cluster_stop
then cluster_start