Я успешно развернул приложение 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
Под тем же single_user
, Я добавил второе приложение Rails, второй виртуальный сервер Nginx и использовал ту же самую конфигурацию Unicorn, замена app_one
с участием app_two
во всех подходящих местах.
Мое второе приложение развернулось нормально, но теперь у меня проблемы с развертыванием первого. В /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.