我在nginx下运行着由三个mongrels组成的集群,我使用Capistrano 2.4.3部署了该应用程序。当我在运行系统的情况下“上限部署”时,其行为是:

  • 应用已部署。代码已成功更新。
  • 在cap deploy输出中,有以下内容:
  • 执行“sudo -p'sudo密码:'
    mongrel_rails集群::重新启动-C
    /var/www/rails/myapp/current/config/mongrel_cluster.yml“
  • 服务器:[“myip”]
  • [myip]执行命令
  • ** [out::myip]停止端口9096
  • ** [out::myip]停止端口9097
  • ** [out::myip]停止端口9098
  • ** [out::myip]已启动端口9096
  • ** [out::myip]已启动端口9097
  • ** [out::myip]已启动端口9098
  • 我立即在服务器上检查并发现Mongrel仍在运行,并且前三个实例的PID文件仍然存在。
  • 不久之后(不到一分钟),我发现Mongrel不再运行,PID文件消失了,并且无法重新启动。
  • 如果我手动在服务器上启动mongrel,则该应用程序可以正常启动。

  • 似乎'mongrel_rails cluster::restart'没有正确地等待句号
    在尝试重新启动集群之前。我如何诊断和解决此问题?

    编辑:这是答案:

    在“重新启动”任务中,mongrel_cluster只需执行以下操作:
     def run
       stop
       start
     end
    

    在调用“开始”之前,它不会等待或检查进程是否已退出。这是a known bug with an outstanding patch submitted。我将补丁应用到Mongrel Cluster,问题消失了。

    最佳答案

    您可以通过在Capistrano配方中添加以下内容,明确地告诉mongrel_cluster配方在开始之前删除pid文件:

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

    这使它将--clean选项传递给mongrel_cluster_ctl。

    我回过头看了看我的一项部署配方,发现我还改变了重启任务的工作方式。查看“杂种用户”组中的以下消息:

    mongrel users discussion of restart

    以下是我的deploy: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
    

    10-06 03:30