Ruby on rails Nginx使用capistrano滚动重启Rails应用程序

Ruby on rails Nginx使用capistrano滚动重启Rails应用程序,ruby-on-rails,deployment,nginx,passenger,capistrano,Ruby On Rails,Deployment,Nginx,Passenger,Capistrano,就我的一生而言,我不知道如何使它正常工作 该问题与其他问题类似,例如: 然而,我们使用的是Nginx/Passenger,而不是Mongrel 问题是,在部署中,如果我们使用以下标准:重新启动任务: task :restart, :roles => [:app], :except => {:no_release => true} do run "cd #{deploy_to}/current && touch tmp/restart.txt" end 它在

就我的一生而言,我不知道如何使它正常工作

该问题与其他问题类似,例如:

然而,我们使用的是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是负载平衡器查找的文件)

    但是,这几乎可以工作,在部署期间,它似乎会对:app角色中列出的每个服务器在服务器上运行一次循环。我们目前有6台应用服务器,因此循环运行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
    

    我遇到了这个gemcapify-ec2,它具有滚动重启功能

    我即将安装并试用它

    以下是自述文件中的描述,描述了滚动重启功能的功能:

    “此功能允许您将代码一次部署到一个实例,而不是同时部署到一个实例。这对于部署后可能需要较长时间启动的更复杂的应用程序非常有用。Capistrano将执行完全部署(包括任何自定义挂钩)对于单个实例,可以选择对该实例执行HTTP healthcheck,如果部署成功,则继续下一个实例


    部署后,将显示一个状态报告,指示部署成功、失败或未开始的实例。如果出现某些故障,可能需要手动采取进一步的操作;例如,如果从ELB中删除实例(请参阅下面的“使用弹性负载平衡器”部分)如果部署失败,出于安全原因,实例将不会使用ELB重新注册。”

    我发现了一些额外的东西,可能有用,也可能没用……如果循环中没有“run”行,那么每个任务只执行一次,这意味着它在循环中做了我想要的事情。但是,添加“run”行后,角色中的每个服务器都会重复一次,因此返回到6次,而不是1次。
    run "cd #{deploy_to}/current && echo 'ok' > public/lb.txt", :hosts => s.host