使用 Puma 进行零停机部署
Zero downtime deployment with Puma
puma 的文档表明可以使用 USR1 信号启动分阶段重启。但我不清楚如何使用它进行滚动重启。如果我的目录 /home/abc/rails_app 和 /home/abc/rails_app_updated 包含我的代码的副本和新的更改,是否有一种方法可以告诉 puma 在重新启动时我的新代码在哪里?我找不到关于此的任何明确信息。
Puma 在启动时会加载您的代码,之后您可以删除 rails 应用程序,一切仍会继续工作(基本上)。所以你可以更新代码,而 Puma 甚至不会注意到。发送 USR1 信号的作用是让 puma 重新加载(新)代码,同时优雅地处理现有连接。所以不需要有两个单独的目录,可以原地更新代码。
如果你确实需要分开目录,你可以只拥有一个符号链接目录,它指向你想要成为当前代码的代码,它被 Puma 使用(capistrano 使用这种策略,它有一个符号链接 'current' 指向最新版本)。然后发送 puma USR1 ,它将从给定的目录重新加载代码。
如果您需要更多指点,请告诉我。
编辑:可能我不是很准确。 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
在 rails 源代码中到底做了什么,但我对此并不熟悉。
尼尔斯
puma 的文档表明可以使用 USR1 信号启动分阶段重启。但我不清楚如何使用它进行滚动重启。如果我的目录 /home/abc/rails_app 和 /home/abc/rails_app_updated 包含我的代码的副本和新的更改,是否有一种方法可以告诉 puma 在重新启动时我的新代码在哪里?我找不到关于此的任何明确信息。
Puma 在启动时会加载您的代码,之后您可以删除 rails 应用程序,一切仍会继续工作(基本上)。所以你可以更新代码,而 Puma 甚至不会注意到。发送 USR1 信号的作用是让 puma 重新加载(新)代码,同时优雅地处理现有连接。所以不需要有两个单独的目录,可以原地更新代码。
如果你确实需要分开目录,你可以只拥有一个符号链接目录,它指向你想要成为当前代码的代码,它被 Puma 使用(capistrano 使用这种策略,它有一个符号链接 'current' 指向最新版本)。然后发送 puma USR1 ,它将从给定的目录重新加载代码。
如果您需要更多指点,请告诉我。
编辑:可能我不是很准确。 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
在 rails 源代码中到底做了什么,但我对此并不熟悉。
尼尔斯