重新启动unicorn时重新获取.bashrc源?

发布于 2024-12-14 05:01:10 字数 695 浏览 0 评论 0原文

我有一些为 deploy 用户提供的 ENV 变量。 (类似于 Heroku 建议的,但不使用 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 我猜这可能与它有关。有什么想法吗?

I have some ENV variables that are sourced for the deploy user. (Similar to what Heroku recommends, but without using Heroku.)

My rails app depends on these for certain functions, for example, in application.rb:

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

This is necessary because we have several staging hosts. Each host has MY_HOST defined to its correct hostname in .bashrc like so:

export MY_HOST="staging3.example.com"

This allows us to only use one rails staging environment, but still have each host's correct hostname used for testing, sending email, etc since this can be set on a per-machine basis.

Unfortunately it looks like when I restart Unicorn using USR2 it doesn't pick up changes to those variables. Doing a hard-stop and start will correctly load any changes.

I'm using preload_app = true which may I'm guessing has something to do with it. Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七秒鱼° 2024-12-21 05:01:11

最后,我完全放弃了这种方法,转而从 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 内部完成
  • 一切都保存在一个地方,并且环境不受代码库之外的其他一些变量的影响

In the end I went away from this approach altogether in favor of loading my app config from an app_config.yml file. Ryan Bates covers this approach in Railscast #226.

The only thing I did differently is that I load a shared app_config.yml for each server I use. Since I'm using capistrano, I just symlink the file on deploy.

For example, on staging2 my shared/configs/app_config.yml looks like this:

staging:
  host: "staging2.example.com"

... whereas on staging3 it looks like this:

staging:
  host: "staging3.example.com"

Now my application.rb has this line instead:

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

I removed the actual config/app_config.yml from git so that it's not included on deploy. (I moved it to config/app_config.yml.template.) Then on deploy I use a capistrano task to symlink shared/configs/app_config.yml to 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

This strategy has these benefits over using ENV vars:

  • Deployed to all nodes via capistrano
  • We can do conditional hosts by simply changing the file on the appropriate server
  • Unicorn will get changes with USR2 since everything's done inside of rails
  • Everything's kept in one place, and the environment isn't affected by some other variables outside of the codebase
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文