红宝石 – 使用Capistrano 3.x启动或重新启动Unicorn

当我使用Capistrano 3.0.1进行帽子生产部署时,我试图启动或重新启动Unicorn.我有一些例子,我使用Capistrano 2.x与以下工作:

namespace :unicorn do
  desc "Start unicorn for this application"
  task :start do
    run "cd #{current_path} && bundle exec unicorn -c /etc/unicorn/myapp.conf.rb -D"
  end
end

但是当我尝试使用deploy.rb中的运行Capistrano 3.x时,我会收到一个未定义的方法错误.

以下是我尝试过的几件事情:

# within the :deploy I created a task that I called after :finished
namespace :deploy do
...

  task :unicorn do
    run "cd #{current_path} && bundle exec unicorn -c /etc/unicorn/myapp.conf.rb -D"
  end

  after :finished, 'deploy:unicorn'

end

我也尝试将运行放在:重新启动任务

namespace :deploy do
  desc 'Restart application'
  task :restart do

  on roles(:app), in: :sequence, wait: 5 do
    # Your restart mechanism here, for example:
    # execute :touch, release_path.join('tmp/restart.txt')
    execute :run, "cd #{current_path} && bundle exec unicorn -c /etc/unicorn/deployrails.conf.rb -D"
  end
end

如果我使用只是运行“cd …”,那么我将得到一个参数(1为0)`在本地shell中.

我可以使用unicorn -c /etc/unicorn/deployrails.conf.rb -D从我的ssh’d VM shell启动独角兽进程.

我可以使用kill USR2从VM shell中杀死主Unicorn进程,但是即使进程被杀死,我得到一个错误.我可以再次使用unicorn -c启动该过程

$kill USR2 58798
bash: kill: USR2: arguments must be process or job IDs

我对Ruby,Rails和部署总体来说非常新鲜.我有一个VirtualBox设置与Ubuntu,Nginx,RVM和独角兽,我很兴奋到目前为止,但这一个真的搞砸了我,任何建议或洞察力是赞赏.

不能说任何具体的capistrano 3(我使用2),但我认为这可能有帮助: How to run shell commands on server in Capistrano v3?.
另外我可以分享一些独角兽相关的经验,希望这有帮助.

我假设你想要24/7的优雅重启方法.

请咨询unicorn documentation这个问题.为了平稳重启(不停机),您可以使用两种策略:

> kill -HUP unicorn_master_pid它需要您的应用程序使“preload_app”指令被禁用,从而增加每个独角兽工作人员的开始时间.如果你能活着,继续下去,这是你的电话.
kill -USR2 unicorn_master_pid
kill -QUIT unicorn_master_pid

更复杂的方法,当您已经在处理性能问题.基本上它将重新执行独角兽主程序,那么你应该杀死它的前身.理论上你可以处理usr2-sleep-quit方法.另一个(和正确的一个,我可以说)的方法是使用独角兽before_fork钩子,它将被执行,当新的主进程将被产生并将尝试为新的孩子本身.
你可以把这样的东西放在config / unicorn.rb中:

# Where to drop a pidfile
pid project_home + '/tmp/pids/unicorn.pid'

before_fork do |server, worker|
  server.logger.info("worker=#{worker.nr} spawning in #{Dir.pwd}")

  # graceful shutdown.
  old_pid_file = project_home + '/tmp/pids/unicorn.pid.oldbin'
  if File.exists?(old_pid_file) && server.pid != old_pid_file
    begin
      old_pid = File.read(old_pid_file).to_i
      server.logger.info("sending QUIT to #{old_pid}")
      # we're killing old unicorn master right there
      Process.kill("QUIT", old_pid)
    rescue Errno::ENOENT, Errno::ESRCH
      # someone else did our job for us
    end
  end
end

当新的人准备好分岔员工时,大概可以杀死旧独角兽.你不会得到这样的停机时间,旧的独角兽会等待工人完成.

还有一件事 – 你可能想把它放在runit或初始监督下.这样你的capistrano任务将像sv重新加载独角兽一样简单,重新启动unicorn或/etc/init.d/unicorn重新启动.这是件好事

相关文章
相关标签/搜索