10

我正在使用 Capistrano 来部署我的 Rails 应用程序。每当我部署时,更改都不会反映在浏览器上,我仍然需要重新启动 nginx 来更新站点(运行 sudo /etc/init.d/nginx restart)。我不太确定为什么,但它不应该在重新启动应用程序后更新吗?(使用触摸/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
4

3 回答 3

5

您不必重新启动或重新加载 nginx。只需触摸 tmp/restart.txt 就足以告诉乘客重新加载应用程序。

如果您使用的是最新版本的 capistrano,您甚至可以删除整个 'namespace :deploy' 部分。Capistrano 在成功部署后已经触及 tmp/restart.txt。

于 2012-08-14T18:15:28.087 回答
3

我意识到部署设置与 http://coding.smashingmagazine.com/2011/06/28/setup-a-ubuntu-vps-for-hosting-ruby-on-rails-applications-2/匹配

当我学习本教程时(大约一年前),我安装了稍微新版本的 nginx 和乘客。据我记得,我认为当我运行任何类型的 init.d 命令时,这些较新的版本促使我将 nginx 用作服务。(Ubuntu 10.04)

无论如何,我会切换代码

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

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

看看这是否有效。

于 2012-08-13T18:26:29.163 回答
1

也许问题在于你是如何开始Passenger的。Capistrano 将符号链接“当前”指向最新版本。任务

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

正在使用该“当前”来放置restart.txt。但根据http://code.google.com/p/phusion-passenger/issues/detail?id=547,Passenger 被“固定”到它开始的“当前”,而任务写入“restart.txt” '到当前的'当前',可以这么说。因此,Passenger 没有“看到”它应该重新启动。

如果您 cd'ed 到当时的“当前”并从那里启动乘客,它会被固定到“当前”符号链接指向的目录,并且不会跟随符号链接的更改。因此,您可能需要摆脱“cd ... && 乘客开始...”并直接提供到乘客的路径。我扩展了你在接收者中的 deploy:start 和 deploy:stop 任务

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
于 2013-01-18T12:14:06.200 回答