繁体   English   中英

在Phusion Passenger上使用Capistrano设置Ruby on Rails应用程序环境

[英]Setting the Ruby on Rails application environment using Capistrano on Phusion Passenger

我有2个环境, 制作舞台演出 ,我正在使用Capistrano和capistrano-ext gem。

当我使用Capistrano部署到登台并重新启动乘客时,我希望部署的应用程序在暂存中运行,但它在默认生产中运行

我尝试过设置:

set :rails_env, "staging"

在我的部署配方中,但这没有任何效果。

我知道这可以通过在Apache中设置虚拟主机来完成,但我使用的是共享主机,因此无法访问。 我的主人提供以下建议:

将以下内容添加到environment.rb:ENV ['RAILS_ENV'] ='staging'

但这并没有帮助我使用Capistrano自动完成这个过程。

设置时正在执行的操作:rails_env, "staging"环境正在设置迁移环境。 换句话说,这是一个仅在运行capistrano时设置的环境。 如果我理解正确,您希望在运行应用程序时更改环境,而不是部署。

为了回答您的问题,我需要知道您如何启动(启动)您的应用程序。

如果您正在使用Phusion Passenger,则需要为乘客编辑RAILS_ENV

鉴于您处于共享环境中,您可能希望使用.htaccess路由。

解决此问题的正确方法是在Passenger配置中设置Rails环境。 让您的共享托管服务提供商为您设置此功能。 在Apache中,它完成了RailsEnv指令。

如果你真的不能这样做,你可以考虑在你的Rails预初始化器(config / preinitializer)的顶部放一个像这样的可怕的HACK:

forced_environment = './config/force_environment'
if File.exists?(forced_environment)
  ENV['RAILS_ENV'] = File.new(forced_environment).readline.chomp
end

...在将Rails加载到该config / forced_environment文件中的字符串之前设置环境。 对于舞台服务器,您可以将“舞台”设置为环境。

这是一个可怕的,可怕的黑客。 你的旅费可能会改变。

您可以使用capistrano挂钩在服务器上创建文件,或者从例如shared/部署时将它们符号链接。

对于Rails 2.3:

在您的Web主机上,创建文件shared/preinitializer.rb

ENV['RAILS_ENV'] = 'staging'

然后将此添加到您的Capfile (或者如果您使用带有Rails 2.x的更新版本的capistrano,则可能将其添加到config/deploy.rb

after 'deploy:symlink', 'localize:copy_shared_configurations'
namespace :localize do
  desc 'copy shared configurations to current'
  task :copy_shared_configurations, :roles => [:app] do
    # I put database.yml here to keep deployed db credentials out of git
    %w[
      preinitializer.rb
    ].each do |f|
      run "ln -nsf #{shared_path}/#{f} #{current_path}/config/#{f}"
    end
  end
end

对于Rails 3

由于Rails 3的初始化序列发生了变化,因此在加载config/environment.rb之后才会加载config/preinitializer.rb 因此对于Rails 3,您只想在服务器上修改config/environment.rb 您可以使用类似的设置(如上面的Rails 2),但使用config/environment.rb符号链接副本,并在尝试符号链接之前添加删除现有文件的步骤。

另一种选择是从capistrano覆盖服务器上的environment.rb。 config/deploy.rb

after 'deploy:symlink', 'localize:munge_environment'
namespace :localize do
  desc 'munge environment.rb to set staging environment'
  task :munge_environment, :roles => [:app] do
    new_env = "ENV['RAILS_ENV'] = 'staging'\n" + File.read(Rails.root.join('config', 'environment.rb'))
    put new_env, "#{current_path}/config/environment.rb"
  end
end

您需要的是nginx配置中的environment指令。 如果您使用的是Apache,那里应该有类似的指令。 (应该很容易谷歌)

server {
        listen                  80;
        passenger_enabled       on;
        rails_env               staging;
        server_name             foo.com;
        root                    /your/app/path;

}

你不能只用capistrano来切换它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM