所以我有一些正在生产的机器在Rack上运行Sinatra应用程序。通常一切都很糟糕,直到Puppet - 我们用来将更改同步到我们的服务器 - 注意到项目的Gemfile.lock已经改变,因此需要发出bundle install --binstubs --deployment
命令以便我们得到新宝石。发生这种情况时,任何http请求在调用Bundler时都会导致500错误,因为尚未安装新宝石。
我们通常至少有一个Rack进程挂起,因为另一个进程定期发出http请求以确保服务器处于活动状态,但是当发生这种情况时,没有Rack进程处于活动状态。如果问题出现在新实例中,似乎PassengerMinInstances
指令可能会有所帮助,但我们还有一个定期提取页面以测试服务器仍在运行的进程,因此仍然应该至少有一个Rack进程活着来处理请求。
我应该注意到,在touch
完成之后,puppet实际上并没有重新启动Rack(通过bundle install
restart.txt文件),所以我们没有任何意义机架流程此时会消失。有人遇到过这样的事吗?是否有一些Rack选项不能在我忽略的每个请求上重新加载整个环境?
答案 0 :(得分:1)
我知道这并没有直接回答你的问题,但我过去做过的事情就是将这个应用程序部署到版本编号的dirs中,并带有指向它们的软链接和(Nginx)代理服务器路由请求到链接。在部署结束时,部署脚本将链接指向新应用程序。
它对我来说似乎运行得很好,如果出现问题,您可以随时手动将链接重新指定回以前的版本。
答案 1 :(得分:0)
为了后人的缘故,我会回答这个问题。作为部署的一部分,所有文件都被chown -R触及,它更新了文件的ctime(但不是mtime)。 Passenger中还有一个有趣的bug/feature,只要/tmp/restart.txt文件的mtime或ctime发生变化,它们就会重新启动服务器。
解决方案:在部署期间停止chowning目录。