【问题标题】:Setting the Ruby on Rails application environment using Capistrano on Phusion Passenger在 Phusion Passenger 上使用 Capistrano 设置 Ruby on Rails 应用程序环境
【发布时间】:2011-08-11 20:05:27
【问题描述】:

我有 2 个环境,productionstaging,我正在使用 Capistrano 和 capistrano-ext gem。

当我使用 Capistrano 部署到 staging 并重新启动乘客时,我希望部署的应用程序在 staging 中运行,但它在默认 production 中运行em>

我试过设置:

set :rails_env, "staging"

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

我知道这可以通过在 Apache 中设置虚拟主机来完成,但我使用的是共享主机,所以没有访问权限。我的主人提出了这个建议:

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

但这并不能帮助我使用 Capistrano 自动化该过程。

【问题讨论】:

  • 添加ENV['RAILS_ENV'] = 'staging' 本身是否有效?如果它有效,那么只需编写一个 Capistrano 配方来自动化它。
  • 您是否尝试过要求您的托管公司为您更改环境?这是解决这个问题的最好方法。如果他们拒绝合作,您可以得出关于他们的结论。
  • @htanata - 是的,这行得通,我想从 Capistrano 自动化,谢谢。

标签: ruby-on-rails deployment passenger capistrano


【解决方案1】:

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

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

如果您使用 Phusion Passenger,您将 need to edit your RAILS_ENV for Passenger

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

【讨论】:

  • 我不是这样开始的,phusion 乘客会处理。
  • 啊,很高兴知道。您需要为乘客编辑 RAILS_ENV。阅读此内容:modrails.com/documentation/… 鉴于您处于共享环境中,您可能希望使用 .htaccess 路由。
  • 谢谢 cory,你想补充一下吗?
  • 嗨 Pingu,我将回复移至我的答案。
【解决方案2】:

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

对于 Rails 2.3:

在您的网络主机上,创建文件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/preinitializer.rb 直到 config/environment.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

【讨论】:

    【解决方案3】:

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

    如果你真的做不到,你可以考虑在你的 Rails 预初始化器(config/preinitializer)的顶部放置一个像这样的 TERRIBLE 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 文件中的字符串之前设置环境。对于您的舞台服务器,您可以将“舞台”设置为环境。

    这是一个可怕的、可怕的黑客攻击。您的里程可能会有所不同。

    【讨论】:

      【解决方案4】:

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

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

      你不能只用 capistrano 来切换它。

      【讨论】:

      • 说他正在使用共享主机。无法更改。
      • 如果什么都不做,那么在 capistrano 中设置 :rails_env 有什么意义?
      • 使用set :rails_env 只是确保在需要它的任务上前面有一个命令,例如RAILS_ENV=#{rails_env} rake db:migrate
      • 应该明确,这不是这个问题的有效答案,但它是我非共享托管情况下的答案。
      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2012-05-30
      • 2019-04-12
      相关资源
      最近更新 更多