1

我刚刚在 512MB VPS 切片(Ubuntu 12.04)上启动了一个新应用程序。我是第一次尝试 nginx/unicorn 堆栈,我或多或少地遵循了Ryan Bates 的 Railscast进行部署,结果相当不错。

在我使用 capistrano 部署任何更改后:

  1. 我对任何 erb 文件所做的更改都不会反映在生产中,并且
  2. 似乎旧的独角兽流程仍然存在。当我尝试点击应用程序时出现 500 错误,并且 exception_notifier 告诉我它正在 /releases/ 内的过时文件夹中查找应用程序

我的deploy.rb文件如下所示:

namespace :deploy do
  %w[start stop restart].each do |command|
    desc "#{command} unicorn server"
    task command, roles: :app, except: {no_release: true} do
     run "/etc/init.d/unicorn_#{application} #{command}"
    end
  end
  # etc...

还有我的unicorn.rb文件(基于零停机部署的设置):

preload_app true 

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{root}/tmp/pids/unicorn.pid.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end

到目前为止,解决此问题的唯一方法是,如果我手动杀死独角兽sudo kill 'cat /home/path/to/myapp/current/tmp/pids/unicorn.pid',然后重新启动它。

在我的 deploy.rb 中执行 unicorn 重启与我的 unicorn.rb 文件中的零停机时间部署设置之间是否存在冲突?

提前感谢您的帮助!

更新

我已经取得了一些进展。看起来我在deploy.rb文件中启动/停止/重启独角兽的任务没有完成这项工作。启动任务似乎可以正常工作,但我相信 unicorn 需要更具体和有针对性的命令来终止和重新启动进程。我借用了在这里找到的代码https://gist.github.com/zires/1003099并进行了一些修改:

更新了 deploy.rb

task :start, :roles => :app, :except => { :no_release => true } do
  run "/etc/init.d/unicorn_#{application} start"
end

task :stop, :roles => :app, :except => { :no_release => true } do
  run "kill -QUIT `cat #{release_path}/tmp/pids/unicorn.pid`"
end

task :restart, :roles => :app, :except => { :no_release => true } do
  run "kill -s USR2 `cat #{release_path}/tmp/pids/unicorn.pid`"
end

像这样停止和重新启动独角兽进程似乎工作得更好,我可以确认在 cap 部署后会产生全新的进程。我真诚地希望这可以帮助解决同样问题的人,这是一个令人沮丧的问题!

一个问题仍然存在,我在deploy.rb中的内容是否与我的unicorn.rb代码一起工作以进行零停机部署?我无法判断,在部署期间我的系统上的负载是如此之高(编译资产并停止和启动所有内容)以至于无论如何它都会杀死我的服务器......如果有人能对此有所了解,我将不胜感激。

4

0 回答 0