【问题标题】:Re-source .bashrc when restarting unicorn?重新启动独角兽时重新获取.bashrc?
【发布时间】:2011-12-24 00:12:14
【问题描述】:

我有一些来自deploy 用户的 ENV 变量。 (类似于 Heroku recommends,但没有使用 Heroku。)

我的 rails 应用程序依赖这些来实现某些功能,例如,在 application.rb 中:

config.action_mailer.default_url_options = { host: ENV['MY_HOST'] }

这是必要的,因为我们有多个临时主机。每个主机都在.bashrc 中将MY_HOST 定义为其正确的主机名,如下所示:

export MY_HOST="staging3.example.com"

这允许我们只使用一个 rails staging 环境,但仍然让每个主机的正确主机名用于测试、发送电子邮件等,因为这可以在每台机器的基础上设置。

不幸的是,当我使用 USR2 重新启动 Unicorn 时,它看起来并没有对这些变量进行更改。执行硬停止和启动将正确加载任何更改。

我正在使用preload_app = true,我猜这可能与它有关。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 capistrano unicorn


    【解决方案1】:

    最后,我完全放弃了这种方法,转而从 app_config.yml 文件中加载我的应用配置。 Ryan Bates 在Railscast #226 中介绍了这种方法。

    唯一不同的是我为我使用的每台服务器加载了一个共享的 app_config.yml。由于我使用的是 capistrano,我只是在部署时对文件进行符号链接。

    例如,在 staging2 上,我的 shared/configs/app_config.yml 看起来像这样:

    staging:
      host: "staging2.example.com"
    

    ...而在 staging3 上它看起来像这样:

    staging:
      host: "staging3.example.com"
    

    现在我的application.rb 改成了这一行:

    config.action_mailer.default_url_options = { host: APP_CONFIG[:host] }
    

    我从 git 中删除了实际的 config/app_config.yml,因此它不包含在部署中。 (我将其移至config/app_config.yml.template。)然后在部署时我使用capistrano 任务将shared/configs/app_config.yml 符号链接到config/app_config.yml

    namespace :deploy do
      desc "Symlinks the app_config.yml"
      task :symlink_app_config, :roles => [:web, :app, :db] do
        run "ln -nfs #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml"
      end
    end
    

    与使用 ENV 变量相比,此策略具有以下优势:

    • 通过 capistrano 部署到所有节点
    • 我们可以通过简单地更改相应服务器上的文件来进行条件主机
    • Unicorn 将使用 USR2 进行更改,因为一切都在 rails 内完成
    • 一切都保存在一个地方,环境不受代码库之外的其他一些变量的影响

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多