2008-09-30 58 views
5

我有一个在nginx下运行的三个mongrels群集,我使用Capistrano 2.4.3部署应用程序。当我在运行系统时进行“cap deploy”时,其行为如下:Capistrano没有正确地重新启动Mongrel群集

  1. 该应用程序已部署。代码已成功更新。
  2. 在帽部署输出,有这样:

    • 执行“命令-p '须藤密码:' mongrel_rails簇::重启-C /无功/网络/轨道/ MyApp的/当前/配置/ mongrel_cluster.yml”
    • 服务器:[ “MYIP”]
    • [MYIP]执行命令
    • ** [出:: MYIP]停止端口9096
    • ** [出:: MYIP]停止港口9097
    • ** [出:: MYIP]停止端口9098
    • ** [出:: MYIP]已经开始端口9096
    • ** [出:: MYIP]已经开始端口9097
    • ** [出:: MYIP]已经开始端口9098
  3. 我立即检查服务器上,发现杂种仍在运行,以及PID文件仍在为前三个实例。
  4. 不久后(不到一分钟),我发现Mongrel不再运行,PID文件不见了,并且重启失败。
  5. 如果我手动启动服务器上的mongrel,应用程序启动就好了。

好像“mongrel_rails集群::重启”尝试在集群的重新启动之前未正确等待一个句号 。如何诊断和解决此问题?

编辑:这里的答案:

mongrel_cluster,在“重启”任务,只要做到这一点:

def run 
    stop 
    start 
end 

它没有做任何等待或检查,看看该程序前退出调用“开始”。这是a known bug with an outstanding patch submitted。我将这个补丁应用于Mongrel Cluster,问题消失了。

回答

4

你可以明确地告诉mongrel_cluster配方中加入你的食谱Capistrano的下一个开始前删除进程文件:

# helps keep mongrel pid files clean 
set :mongrel_clean, true 

这将导致它传递--clean选项mongrel_cluster_ctl。

我回去看看我的一个部署食谱,并注意到我也改变了我的重启任务的工作方式。看看在杂种用户组中的下列信息:

mongrel users discussion of restart

以下是我的部署:重新启动任务。我承认这有点破解。

namespace :deploy do 
    desc "Restart the Mongrel processes on the app server." 
    task :restart, :roles => :app do 
    mongrel.cluster.stop 
    sleep 2.5 
    mongrel.cluster.start 
    end 
end 
+0

这是正确的道路。看到我的编辑问题:有一个修补mongrel_cluster修补行为的补丁。 – Pete 2008-10-02 16:53:12

0

我讨厌这么基本,但听起来好像pid文件在试图启动时仍然处于闲置状态。确保杂种被用手挡住。用手清理pid文件。然后做一个帽子部署。

1

首先,通过调用cap deploy:restart缩小您的测试范围。您可能想通过--debug选项在远程执行前提示或--dry-run选项只是为了在调整设置时看到发生了什么。

乍一看,这听起来像是对pid文件或混杂进程的权限问题,但很难确定。这吸引了我的眼睛有两件事情是:

  • :runner变量被明确地设置为nil - 有没有这种特定的原因是什么?
  • Capistrano 2.4引入了:admin_runner变量的新行为。没有看完整个配方,这可能与你的问题有关?

    :主场迎战亚军:admin_runner(从capistrano 2.4 release) 一些封口机已经注意到,有部署:安装和部署:清理运行为:亚军用户搞砸了他们精心制作的权限。我同意这是一个问题。在此版本中,部署:启动,部署:停止并部署:重新启动所有在sudoing时继续使用:runner用户,但部署:安装和部署:清除将使用:admin_runner用户。 admin_runner变量在默认情况下是未设置的,意味着这些任务将以root身份登录,但是如果您希望他们以runner身份运行,只需执行“set:admin_runner,runner”即可。

我对下一步该怎么做的建议。手动停止杂种并清理PID。手动启动杂种。接下来,在调试问题时继续运行cap deploy:restart。必要时重复。

+0

感谢瑞安。我想你让我失去了知觉。当我解决问题时,我会跟进。 – Pete 2008-10-01 02:40:09

1

无论哪种方式,我的杂种都在上一个停止命令完成之前开始关闭。

睡眠2.5不是一个好的解决方案,如果停止所有正在运行的杂种需要2.5秒以上的时间。

似乎有需要:

stop && start 

stop; start 

(这是怎么了庆典的作品,& &等待第一个命令完成W/O错误,而“;”只是运行下一个命令)。

我不知道是否有一个:

wait cluster_stop 
then cluster_start 
+0

看看这个:http://rubyforge.org/tracker/index.php?func=detail&aid=19657&group_id=1336&atid=5291 – Pete 2008-12-02 18:46:33