2016-01-12 3 views
1

Я использую capistrano в своем приложении rails4 и каждый раз, когда я выпускаю новую версию (=>cap production deploy) Мне нужно убить мастера единорога на сервере, чтобы capistrano может ходить без каких-либо сбоев.В настоящее время мой хозяин единорога должен быть убит вручную перед каждым развертыванием

### How can I automate the process of killing the unicorn process? 

This is how my deploy.rb is looking like: 

lock '3.4.0' 

set :application, 'maalify' 
set :repo_url, '[email protected]:iNeedCode/Maalify.git' 
set :deploy_to, '/opt/www/maalify' 
set :user, 'root' 
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets} 


set :rbenv_ruby, '2.2.1' 
set :rbenv_type, :user 
set :rbenv_path, "~/.rbenv" 
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec" 
set :rbenv_map_bins, %w(rake gem bundle ruby rails) 
set :rbenv_roles, :all 
set :linked_files, %w{config/database.yml .rbenv-vars} # create these files manually ones on the server 



# Capristrano3 unicorn 
set :unicorn_pid, "/opt/www/maalify/current/shared/tmp/pids/unicorn.pid" 
set :unicorn_config_path, "/opt/www/maalify/current/config/unicorn.rb" 

# Clean up all older releases 
before :deploy, "unicorn:stop" 
after "deploy:publishing", "unicorn:start" 
after "deploy:restart", "deploy:cleanup" 


namespace :deploy do 
    after :restart, :clear_cache do 
    on roles(:web), in: :groups, limit: 3, wait: 10 do 
     execute :rake, 'cache:clear' 
    end 
    end 

end 

Update

Вот это Unicorn.rb

# set path to application 
app_dir = "/opt/www/maalify" 
shared_dir = "#{app_dir}/shared" 
working_directory "#{app_dir}/current" 

# Set unicorn options 
worker_processes 1 
preload_app true 
timeout 30 

# Set up socket location 
listen "#{shared_dir}/tmp/sockets/unicorn.sock", :backlog => 64 

# Logging 
stderr_path "#{shared_dir}/log/unicorn.stderr.log" 
stdout_path "#{shared_dir}/log/unicorn.stdout.log" 

# Set master PID location 
pid "#{shared_dir}/tmp/pids/unicorn.pid" 

После добавления before_fork я все еще получаю ту же ошибку, как и раньше, когда я не убивал единорог вручную:

/opt/www/maalify/shared/bundle/ruby/2.2.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:206:in `pid=': Already running on PID:16268 (or pid=/opt/www/maalify/shared/tmp/pids/unicorn.pid is stale) (ArgumentError) 
     from /opt/www/maalify/shared/bundle/ruby/2.2.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:135:in `start' 
     from /opt/www/maalify/shared/bundle/ruby/2.2.0/gems/unicorn-4.8.3/bin/unicorn:126:in `<top (required)>' 
     from /opt/www/maalify/shared/bundle/ruby/2.2.0/bin/unicorn:23:in `load' 
     from /opt/www/maalify/shared/bundle/ruby/2.2.0/bin/unicorn:23:in `<main>' 
+0

Пожалуйста, добавьте единорога конфигурационный файл – axvm

ответ

3

Я заметил в вашем конфигурационном файле unicorn следующую директиву:

preload_app true 

Вот информация от docs:

HUP - перезагружает конфигурационный файл и грациозно перезапустить все рабочие. Если директива «preload_app» имеет значение false (по умолчанию), тогда работники также получат при каждом изменении кода приложения. Если значение «preload_app» истинно, изменения кода приложения не будут иметь никакого эффекта; USR2 + QUIT (см. Ниже) должен использоваться для загрузки более нового кода в этом случае.

Вы можете установить директиву preload_app ложь, а затем, если необходимо перезагрузить код, отправить HUP сигнал ведущего процесса.

Но вот еще один способ перезагрузить код без простоя. Вам нужно реализовать метод USR2 + QUIT в config. Это означает, что когда вы отправляете сигнал USR2, единорог запускает новый экземпляр приложения, не убивая старый. Вы можете подключить обратный вызов before_fork, который будет убивать старый экземпляр безболезненным для вас.

Вот пример, добавьте в единорога конфигурации:

before_fork do |server, worker| 
    ActiveRecord::Base.connection.disconnect! 

    old_pid = "#{server.config[: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 
end 

after_fork do |server, worker| 
    ActiveRecord::Base.establish_connection 
end 

Теперь послать сигнал USR2 в мастер-процесс и проверить его!

Следующий шаг - изменить ваш deploy.rb. Вы должны удалить все unicorn крючки и добавить следующий:

after 'deploy:publishing', 'deploy:restart' 
namespace :deploy do 
    task :restart do 
    invoke 'unicorn:legacy_restart' 
    end 
end 

И последний шаг: исправить Pid путь в deploy.rb.

set :unicorn_pid, "/opt/www/maalify**/current/shared/**tmp/pids/unicorn.pid" 

Должно быть:

set :unicorn_pid, "/opt/www/maalify/shared/tmp/pids/unicorn.pid" 
+0

Я использую 'USR2' который я определил в'// init.d/unicorn_maalify' файл и т.д. – imalik8088

+0

@ затем, как вы можете видеть в документе, вам нужно реализовать before_fork в config для рабочих или установить директиву 'preload_app' на' false'. Дайте мне секунду, я обновлю ответ. – axvm

+0

попытались добавить before_block, а также переключили 'preload_app', но получили ту же ошибку. – imalik8088