【问题标题】:Nginx rolling restart of Rails app with capistrano使用 capistrano 滚动重启 Rails 应用程序的 Nginx
【发布时间】:2011-09-30 13:44:19
【问题描述】:

在我的一生中,我无法弄清楚如何使它正常工作。

问题和其他人类似,如: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. 部署代码
  2. 转到服务器 1,将其从负载平衡器中删除
  3. 在服务器 1 上重新启动 nginx-passenger
  4. 等待 60 秒
  5. 将服务器 1 添加回负载平衡器
  6. 转到服务器 2(重复步骤 3 - 5)

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

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

task :restart, :roles => [:app], :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 台应用服务器,因此循环运行 6 次,每台服务器重启 nginx-passenger 6 次。

我只需要这个循环运行一次。

我知道乘客似乎最终会得到滚动重启,但它们似乎还不存在。

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

任何帮助都会很棒。

谢谢。

【问题讨论】:

  • 我发现了一些额外的东西,可能有帮助也可能没有帮助......如果循环中没有“运行”行,那么每个任务只执行一次,这意味着它可以满足我的要求的循环。但是,添加“运行”行的那一刻,它会在角色中的每个服务器重复一次,所以回到 6 次而不是 1 次。

标签: ruby-on-rails deployment nginx passenger capistrano


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    我遇到了这个具有滚动重启功能的 gem capify-ec2。 capify-ec2 on github.

    我即将安装并试用。

    这是自述文件中的描述,描述了他们的滚动重启功能的作用:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2012-08-09
      • 2020-06-06
      • 2016-04-11
      • 2010-12-14
      • 2020-04-22
      • 1970-01-01
      • 2015-11-14
      • 2017-03-16
      相关资源
      最近更新 更多