重启unicorn时重新启动.bashrc?

时间:2011-11-07 22:12:38

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

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

我的rails应用程序依赖于某些功能,例如,在application.rb:

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

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

export MY_HOST="staging3.example.com"

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

不幸的是,当我使用USR2重新启动Unicorn时,它似乎没有获取对这些变量的更改。执行硬停和启动将正确加载任何更改。

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

1 个答案:

答案 0 :(得分:2)

最后,我完全放弃了这种方法,转而支持从app_config.yml文件加载我的app配置。 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 vars相比,这种策略具有以下优势:

  • 通过capistrano
  • 部署到所有节点
  • 我们只需更改相应服务器上的文件即可完成条件主机
  • 因为所有内容都是在rails
  • 内完成的,因此Unicorn将会更改USR2
  • 一切都保存在一个地方,环境不受代码库之外的其他变量的影响