使用Puma实现零停机部署

时间:2017-06-03 00:24:43

标签: ruby-on-rails puma

puma的文档表明可以使用USR1信号启动分阶段重启。但我不知道如何使用它来进行滚动重启。如果我有目录/ home / abc / rails_app和/ home / abc / rails_app_updated包含我的代码的副本以及新的更改,是否有一种方法可以告诉puma我的新代码在重新启动时的位置?我找不到任何确定的东西。

1 个答案:

答案 0 :(得分:1)

Puma在启动时会加载你的代码,之后你可以删除rails应用程序并且事情仍然可以继续工作(基本上)。所以你可以更新代码,Puma甚至都不会注意到。发送USR1信号的作用是让puma重新加载(新)代码,同时优雅地处理现有连接。因此,不需要有两个单独的目录,您可以更新代码。

如果你确实需要分开目录,你可以只有一个符号链接的目录,指向你想要当前的代码和Puma使用的代码(capistrano使用这个策略,它有一个符号链接'当前'指向在最新版本)。然后发送puma USR1,它将从给定的目录重新加载代码。

如果您需要更多指示,请告诉我。

编辑:Probabaly我不是很精确。 Puma实际上并没有处理文件的(重新)加载,这是由Rails处理的(Puma只是启动Rack应用程序,或者在USR1信号上,将重启应用程序)。在开发模式下,Rails将在每个请求上重新加载文件,这在更改代码时很方便。在生产时,这些设置通常适用(来自config/environments/production.rb):

  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both thread web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

更多详情in the rails guides

如果你真的想要走下去,可以看一下cache_classes在导轨源中的确切做法,但我对此并不熟悉。

尼尔斯