Rails - Nginx необходимо перезапустить после развертывания с Capistrano?

Я использую Capistrano для развертывания моего приложения Rails. при каждом развертывании изменения не будут отображаться в браузере, и мне все равно нужно перезапустить nginx для обновления сайта (запуск sudo/etc/init.d/nginx restart). Я не уверен, почему, но разве он не должен обновляться после перезапуска приложения? (используя touch/app/tmp/restart.txt)

Здесь мой deploy.rb

require "rvm/capistrano"
set :rvm_ruby_string, '[email protected]_name'
set :rvm_type, :user

require "bundler/capistrano"

set :application, "app_name"
set :user, "me"

set :deploy_to, "/home/#{user}/#{application}"
set :deploy_via, :copy

set :use_sudo, false

set :scm, :git
set :repository,  "~/Sites/#{application}/.git"
set :branch, "master"

role :web, '1.2.3.4'
role :app, '1.2.3.4'
role :db,  '1.2.3.4', :primary => true
role :db,  '1.2.3.4'

namespace :deploy do
 task :start do ; end
 task :stop do ; end
 task :restart, :roles => :app, :except => { :no_release => true } do
   run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
 end
end

Ответ 1

Я понял, что настройка развертывания соответствует http://coding.smashingmagazine.com/2011/06/28/setup-a-ubuntu-vps-for-hosting-ruby-on-rails-applications-2/

Когда я последовал этому руководству (около года назад), я установил несколько более новые версии nginx и пассажира. Из того, что я помню, я думаю, что эти новые версии побудили меня использовать nginx в качестве службы, когда я запускал любой тип команды init.d. (Ubuntu 10.04)

В любом случае я бы отключил код

run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"

к

run "#{sudo} service nginx #{command}"

И посмотрите, работает ли это.

Ответ 2

Вам не нужно перезапускать или перезагружать nginx. Просто коснуться tmp/restart.txt должно быть достаточно, чтобы сообщить пассажиру перезагрузить приложение.

Если вы используете последнюю версию capistrano, вы можете даже отбросить часть "пространство имен: развернуть". Capistrano уже касается tmp/restart.txt после успешного развертывания.

Ответ 3

Возможно, проблема в том, как именно вы начали Пассажир. Капистрано указывает символическую ссылку "текущий" на последнюю версию. Задача

run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"

использует этот "ток" для размещения файла restart.txt. Но согласно http://code.google.com/p/phusion-passenger/issues/detail?id=547, пассажир "закреплен" на "текущем", в котором он был запущен, а задача записывает "restart.txt", к текущему "текущему", так сказать. Поэтому Passenger не видит, что он должен перезагрузиться.

Если вы cd'ed к текущему "текущему" и запущенному Пассажиру, он привязывается к каталогу, на который указывает текущая символическая ссылка, и не следует за изменениями символической ссылки. Поэтому вам может понадобиться избавиться от "cd... && пассажирского старта..." и предоставить путь к Пассажиру напрямую. Я расширил развертывание: запуск и развертывание: остановить задачи, которые у вас есть в вашем рецепте, а также сказать

task :start, :roles => :app, :except => { :no_release => true } do
  run "passenger start #{current_path} -a 127.0.0.1 -p 3000 -e production -d"
end
task :stop, :roles => :app, :except => { :no_release => true } do
  run "passenger stop #{current_path} -p 3000"
end