我有一些来自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
我可能猜测它与它有关。有什么想法吗?
答案 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相比,这种策略具有以下优势: