我正在使用Capistrano来部署我的Rails应用程序。每当我部署时,更改都不会反映在浏览器上,我仍然需要重新启动nginx来更新站点(运行sudo /etc/init.d/nginx restart)。我不确定为什么但重启申请后不应该更新? (使用touch /app/tmp/restart.txt)
这是我的deploy.rb
require "rvm/capistrano"
set :rvm_ruby_string, 'ruby-1.9.3-p194@app_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
答案 0 :(得分:5)
您不必重新启动或重新加载nginx。只需触摸tmp / restart.txt即可告诉乘客重新加载应用程序。
如果您使用的是最新版本的capistrano,您甚至可以删除整个'namespace:deploy'部分。成功部署后,Capistrano已触及tmp / restart.txt。
答案 1 :(得分:3)
当我按照本教程(大约一年前)时,我安装了稍微更新版本的nginx和乘客。根据我的记忆,我认为这些较新的版本促使我在运行任何类型的init.d命令时使用nginx作为服务。 (Ubuntu 10.04)
无论如何我会切换代码
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
到
run "#{sudo} service nginx #{command}"
看看是否有效。
答案 2 :(得分:1)
问题可能在于你是如何开始乘客的。 Capistrano将符号链接“当前”指向最新版本。任务
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
正在使用'current'来放置restart.txt。但根据http://code.google.com/p/phusion-passenger/issues/detail?id=547,Passenger被“固定”到它开始的'当前',而任务将'restart.txt'写入当前'当前',可以这么说。所以Passenger没有“看到”它应该重启。
如果你从当时'当前'开始并从那里启动Passenger,它将被固定到当前'符号链接指向该目录的目录,并且不遵循符号链接的更改。所以你可能需要摆脱'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