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