ruby-on-rails – 使用capistrano重新启动Rails应用程序的Nginx

对于我的生活,我无法弄清楚如何使这项工作正常.

问题类似于其他人的问题,例如:How to do a rolling restart of a cluster of mongrels

但是,我们使用的是Nginx / Passenger而不是Mongrel.

如果我们使用此标准,问题是在部署时:重启任务:

task :restart,:roles => [:app],:except => {:no_release => true} do
  run "cd #{deploy_to}/current && touch tmp/restart.txt"
end

它触及每个Web服务器上的restart.txt文件,但是当前正在提供请求的任何乘客实例都需要在新的生成之前完成.这会造成严重的延迟并导致我们的应用程序在最多2分钟内无法使用,而所有内容都会重新启动.

为了解决这个问题,计划是做以下事情:

>部署代码
>转到服务器1,将其从负载均衡器中删除
>在服务器1上重启Nginx-passenger
>等待60秒
>将服务器1添加负载均衡器
>转到服务器2(重复步骤3 – 5)

为了做到这一点,我尝试了这个:

(lb.txt是负载均衡器查找的文件)

task :restart,:except => {:no_release => true} do
  servers = find_servers_for_task(current_task)
  servers.map do |s|
    run "cd #{deploy_to}/current && echo '' > public/lb.txt",:host => s.host
    run %Q{rvmsudo /etc/init.d/Nginx-passenger restart > /dev/null},:host => s.host
    sleep 60
    run "cd #{deploy_to}/current && echo 'ok' > public/lb.txt",:host => s.host
  end
end

这几乎可行,但是,在部署期间,它似乎在:app角色中列出的每个服务器上运行一次通过服务器的循环.我们目前有6个app服务器,因此循环运行6次,每个服务器重启Nginx-passenger 6次.

我只需要这个循环就可以运行一次.

我知道似乎最终乘客会重新开始,但它们似乎还不存在.

如果它有帮助,我们使用Capistrano 2.x和Rails 3

任何帮助都会很棒.

谢谢.

解决方法

run "cd #{deploy_to}/current && echo 'ok' > public/lb.txt",:host => s.host

应该是:

run "cd #{deploy_to}/current && echo 'ok' > public/lb.txt",:hosts => s.host

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...