Rails, Capistrano, Nginx, Unicorn — приложение уже инициализировано (RuntimeError)

Может ли кто-нибудь пролить свет на то, к чему именно относится эта ошибка?

У меня проблемы с развертыванием новых версий сайта.

I,  INFO -- : reloading config_file=[snip]/current/config/unicorn.rb
I,  INFO -- : Refreshing Gem list
E, ERROR -- : error reloading config_file=[snip]/current/config/unicorn.rb: Application has been already initialized. (RuntimeError)
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/application.rb:135:in `initialize!'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/railties-3.2.3/lib/rails/railtie/configurable.rb:30:in `method_missing'
E, ERROR -- : [snip]/releases/20120907085937/config/environment.rb:5:in `<top (required)>'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `require'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `block in require'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:236:in `load_dependency'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `require'
E, ERROR -- : config.ru:4:in `block in <main>'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:51:in `instance_eval'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:51:in `initialize'
E, ERROR -- : config.ru:1:in `new'
E, ERROR -- : config.ru:1:in `<main>'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn.rb:44:in `eval'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn.rb:44:in `block in builder'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:696:in `call'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:696:in `build_app!'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:677:in `load_config!'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:303:in `join'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/bin/unicorn:121:in `<top (required)>'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/bin/unicorn:23:in `load'
E, ERROR -- : [snip]/shared/bundle/ruby/1.9.1/bin/unicorn:23:in `<main>'
I,  INFO -- : reaped #<Process::Status: pid 3182 exit 0> worker=0
I,  INFO -- : reaped #<Process::Status: pid 3185 exit 0> worker=1
I,  INFO -- : reaped #<Process::Status: pid 3188 exit 0> worker=2
I,  INFO -- : reaped #<Process::Status: pid 3191 exit 0> worker=3
I,  INFO -- : worker=0 ready
I,  INFO -- : worker=3 ready
I,  INFO -- : worker=1 ready
I,  INFO -- : worker=2 ready

Единорог.рб

root = "/home/[user]/apps/[site]/current"
working_directory root
pid "#{root}/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.log"
stdout_path "#{root}/log/unicorn.log"

listen "/tmp/unicorn.[site].sock", :backlog => 2048

worker_processes 4

preload_app true

timeout 30

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

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

Любая помощь приветствуется - при необходимости я могу вытащить больше файлов конфигурации.


person Andy Copley    schedule 07.09.2012    source источник
comment
Возможно, эта тема поможет вам tutorruby.com/question/show/id/3237 я представляю это как комментарий, потому что я не уверен, что это актуально.   -  person dennis    schedule 10.09.2012
comment
Когда возникает эта ошибка при развертывании из Capistrano? Как Unicorn справляется с новыми развертываниями? Можете ли вы поделиться своей конфигурацией Capistrano?   -  person mguymon    schedule 14.09.2012
comment
Не могли бы вы также поделиться /releases/20120907085937/config/environment.rb, пожалуйста?   -  person tommasop    schedule 16.09.2012


Ответы (2)


Наконец добрался до сути. После повторного прочтения выпуска Railscasts Райана Бейтса о развертывании без простоев , я заметил, что выдавал команду перезапуска/перезагрузки единорога с помощью HUP, а не USR2. Изменив это и повторно включив код из ответа гинеттева (который я ранее отключил, пытаясь понять проблему, теперь я могу развернуть его так, как хотел бы.

Изменение было таким же простым, как изменение моего файла unicorn_init.sh с:

restart|reload)
sig HUP && echo reloaded OK && exit 0
echo >&2 "Couldn't reload, starting '$CMD' instead"
run "$CMD"
;;

to

restart|reload)
sig USR2 && echo reloaded OK && exit 0
echo >&2 "Couldn't reload, starting '$CMD' instead"
run "$CMD"
;;

Надеюсь, это поможет кому-то еще!

person Andy Copley    schedule 19.09.2012

Глядя на конфигурацию единорога, которая работала для меня, в разделе before_fork вы могли бы попробовать добавить следующий код

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
    # someone else did our job for us
  end
end

Также не нужно проверять, определен ли ActiveRecord::Base в конфиге.

person ginettev    schedule 17.09.2012