所以我有几台机器正在生产中,它们在 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 选项可以在我忽略的每个请求上不重新加载整个环境?