Назад | Перейти на главную страницу

Несколько приложений Unicorns / Rails, Nginx, один пользователь

  1. Я успешно развернул приложение Rails с помощью Capistrano, Unicorn, Nginx, используя следующую конфигурацию единорога:

    env = ENV["RAILS_ENV"] || "development"
    
    worker_processes 4
    
    listen "/tmp/app_one.socket", :backlog => 64
    
    preload_app true
    
    timeout 60
    
    pid "/tmp/unicorn.app_one.pid"
    
    if env == "production"
      working_directory "/home/single_user/app_one/current"
    
      user 'single_user'
    
      shared_path = "/home/single_user/app_one/shared"
    
      stderr_path "#{shared_path}/log/unicorn.stderr.log"
      stdout_path "#{shared_path}/log/unicorn.stdout.log"
    end
    
    before_fork do |server, worker|
      if defined?(ActiveRecord::Base)
        ActiveRecord::Base.connection.disconnect!
      end
    
      old_pid = "/tmp/unicorn.app_one.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
          # already dead
        end
      end
    end
    
    after_fork do |server, worker|
      if defined?(ActiveRecord::Base)
        ActiveRecord::Base.establish_connection
      end
    end
    
  2. Под тем же single_user, Я добавил второе приложение Rails, второй виртуальный сервер Nginx и использовал ту же самую конфигурацию Unicorn, замена app_one с участием app_two во всех подходящих местах.

  3. Мое второе приложение развернулось нормально, но теперь у меня проблемы с развертыванием первого. В /tmp/unicorn.app_one.pid не существует, но сайт по-прежнему работает нормально (top показаны десять процессов, как и ожидалось). тем не мение /tmp/app_one.socket существует, что мешает мне запустить Unicorn вручную.

Так это подходящая практика - запускать несколько Rails / Unicorn / Nginx под одним и тем же пользователем? Вызвал ли я какой-то конфликт в процессе развертывания? Как мне действовать, не нарушая app_one, который жив и используется?

Почему бы вам не использовать каталог tmp для конкретного приложения и не поместить туда unicorn.pid, например "# {working_directory} /tmp/unicorn.pid". Аналогично для любых файлов, специфичных для приложения, таких как socket. Если вы не хотите помещать его в рабочий_ каталог, используйте shared_path. Храните все, что относится к app1, в определенном для app1 месте, а все, что связано с app2, в каталоге, специфичном для app2.