所以我有几台机器正在生产中,它们在 Rack 上运行 Sinatra 应用程序。通常一切都是笨拙的,直到 Puppet(我们用来将更改同步到我们的服务器)注意到项目的 Gemfile.lock 已更改,因此需要发出bundle install --binstubs --deployment
命令以便我们获得新的 gem。发生这种情况时,任何 http 请求在调用 Bundler 以要求我们的 gem 时都会导致 500 错误,因为尚未安装新的 gem。
我们通常至少有一个 Rack 进程挂起,因为另一个进程会定期发出 http 请求以确保服务器处于活动状态,但是当这种情况发生时,没有 Rack 进程处于活动状态。如果问题出在新实例上,该指令似乎PassengerMinInstances
可能会有所帮助,但我们还有一个进程会定期获取页面以测试服务器是否仍在运行,因此至少应该有一个 Rack 进程处于活动状态来处理请求.
我可能应该注意到 puppettouch
直到bundle install
完成之后才真正重新启动 Rack(通过重新启动.txt 文件),所以我们的 Rack 进程在这个时候消失是没有任何意义的。有没有人遇到过这样的事情?是否有一些 Rack 选项可以在我忽略的每个请求上不重新加载整个环境?