在 Puma 的配置文件示例中,它为 on_restart 函数说明了以下内容:
在重新启动之前运行的代码。此代码应关闭日志文件、数据库连接等。
我是否需要为 Rails 应用程序实现此功能,以关闭与数据库和日志文件的连接,还是自动处理?如果没有,我该怎么做呢?
在 Puma 的配置文件示例中,它为 on_restart 函数说明了以下内容:
在重新启动之前运行的代码。此代码应关闭日志文件、数据库连接等。
我是否需要为 Rails 应用程序实现此功能,以关闭与数据库和日志文件的连接,还是自动处理?如果没有,我该怎么做呢?
不,你不需要,Rails 会自动重新加载你的代码。但是这个代码重载支持是有限的。例如,对 application.rb 的更改在您重新启动应用服务器之前不会应用。
但我会推荐Phusion Passenger而不是 Puma。Phusion Passenger 设置起来要容易得多,尤其是在您投入生产时。Phusion Passenger 直接集成到 Apache 和 Nginx 中,并提供动态工作者管理等高级功能。Phusion Passenger 非常成熟、稳定和高性能,被纽约时报、赛门铁克、AirBnB 等公司使用。
我发现每次我的 Rails/Puma 服务器重新启动时,使用 Redis 作为我的 Rails.cache 提供程序都会在第一次请求时导致错误页面。我得到的错误是:
Redis::InheritedError(试图使用来自子进程的连接而不重新连接。您需要在fork后重新连接到Redis。)
为了解决这个错误,我没有向on_restart添加任何内容,但确实必须向on_worker_boot添加代码 (我正在使用 workers=4 运行 Puma):
puma-config.rb
on_worker_boot do
puts "Reconnecting Rails.cache"
Rails.cache.reconnect
end