我刚刚在 512MB VPS 切片(Ubuntu 12.04)上启动了一个新应用程序。我是第一次尝试 nginx/unicorn 堆栈,我或多或少地遵循了Ryan Bates 的 Railscast进行部署,结果相当不错。
在我使用 capistrano 部署任何更改后:
- 我对任何 erb 文件所做的更改都不会反映在生产中,并且
- 似乎旧的独角兽流程仍然存在。当我尝试点击应用程序时出现 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代码一起工作以进行零停机部署?我无法判断,在部署期间我的系统上的负载是如此之高(编译资产并停止和启动所有内容)以至于无论如何它都会杀死我的服务器......如果有人能对此有所了解,我将不胜感激。