2012-02-07 56 views
2

所以我必须在生产几台机器正在运行在机架顶部的西纳特拉应用。通常情况下,所有的事情都是蠢蠢欲动的,直到Puppet - 我们用来将更改同步到我们的服务器 - 注意到项目的Gemfile.lock已更改,因此需要发出命令bundle install --binstubs --deployment,以便我们获得新的宝石。发生这种情况时,任何http请求在调用Bundler来请求我们的宝石时都会导致500错误,因为新的宝石尚未安装。架:在`束捆扎机:: GemNotFound错误安装--deployment`

我们通常至少有一个机架过程游逛由于另一个进程定期发出HTTP请求,以确保服务器是活的,但是当这种情况发生,没有货架的过程活着。如果问题出现在新实例中,PassengerMinInstances指令可能会有所帮助,但我们也有一个定期提取页面以测试服务器仍然运行的进程,所以至少应该有一个Rack进程处于活动状态以处理请求。

我应该注意到,在bundle install完成之后,木偶并没有真正重新启动Rack(通过touch重新启动restart.txt文件),因此我们的Rack进程在此时会消失时间。有没有人遇到过这样的事情?是否有一些Rack选项不能在我忽略的每个请求中重新加载整个环境?

回答

0

为后人的缘故,我来回答这个问题。作为部署的一部分,所有文件都被chown -R所触及,它更新文件的ctime(但不是mtime)。 Passenger中还有一个有趣的bug/feature,他们将在/tmp/restart.txt文件的mtime或ctime更改时重新启动服务器。

解决方案:停止部署期间chowning的目录。

1

我知道这并不直接回答你的问题,但我已经在过去做了绕过这种情况发生的事情是用软链接指向他们和部署应用程序到版本号迪尔斯(Nginx)代理服务器将请求路由到链路。在部署结束时,部署脚本将链接指向新应用程序。

它似乎工作不够好,对我来说,如果事情真的出问题,你可以随时手动重新指向的链接返回到以前的版本。

+0

有趣。如果您不介意对每个应用程序进行全面检出(可能还有相关的宝石),那么这不是一个糟糕的解决方案。如果你经常部署,那么这是一个很大的带宽。 – tjarratt 2012-02-07 03:24:27