【问题标题】:Ruby, Unicorn, and environment variablesRuby、Unicorn 和环境变量
【发布时间】:2011-04-29 20:09:57
【问题描述】:

在玩 Heroku 时,我发现他们使用环境变量进行服务器本地配置的方法非常棒。现在,在设置自己的应用程序服务器时,我发现自己想知道复制它会有多难。

我正在部署一个 sinatra 应用程序,使用 Unicorn 和 Nginx。我知道 nginx 不喜欢玩弄环境,所以就出局了。我可能可以将 vars 放在 unicorn 配置文件中的某个位置,但由于它与应用程序的其余部分一起处于版本控制之下,这有点违背了将配置放在服务器环境中的目的。就我而言,没有理由不将我的应用特定配置文件与应用的其余部分放在一起。

第三个也是最后一个(据我所知)选项是将它们设置在生成的 shell 中。那是我迷路的地方。我知道登录和非登录 shell 使用不同的 rc 文件,我不确定使用 sudo -u http stuff 调用某些东西是否会产生登录 shell。我做了一些功课,问了谷歌和人,但我仍然不完全确定如何处理它。也许我只是愚蠢...无论哪种方式,如果有人能对整个 shell 环境交易有所了解,我将不胜感激。

【问题讨论】:

  • 我这样做的方法是将这些变量放在 .bashrc 文件中,这样,当我 ssh 到服务器时,我将直接设置这些变量,而无需包装脚本,它们是安全的,因为只有可以登录到可以访问它们的服务器的人。如果您想在多台服务器上部署您的应用程序并设置许多变量,则包装脚本非常有用。

标签: ruby shell nginx environment unicorn


【解决方案1】:

我认为你的第三种可能性是正确的。您缺少的是包装脚本的想法,其唯一功能是设置环境,然后使用所需的任何选项调用主程序。

要制作一个可以用作控制脚本的包装脚本(如果 prodEnv 使用 DB=ProdDB 等),还有一个可以简化此问题的部分。 Bash/ksh 都支持称为源文件的功能。这是 shell 提供的一个操作,用于打开文件并执行文件中的内容,就像它内嵌在主脚本中一样。喜欢 C 和其他语言中的 #include

ksh 和 bash 将自动获取 /etc/profile/var/etc/profile.local(有时)、$HOME/.profile。还有其他文件名也会被提取,但在这种情况下,您需要创建自己的 env 文件并显式加载它。

当我们谈论包装脚本时,您想要管理环境的设置方式,您需要在包装脚本中进行采购。

如何获取环境文件?

envFile=/path/to/my/envFile  
. $envFile

其中 envFile 将填充诸如

之类的语句
dbServer=DevDBServer
webServer=QAWebServer
....

您可能会发现需要导出这些变量才能使其可见

export dbServer webServer

支持备用分配/导出

export dbServer=DevDBServer
export webServer=QAWebServer

根据不同环境的不同程度,您可以让包装脚本确定要加载的环境文件。

case $( /bin/hostame ) in
 prodServerName )
     envFile=/path/2/prod/envFile ;;
 QASeverName )
     envFile=/path/2/qa/envFile ;;
 devSeverName )
     envFile=/path/2/dev/envFile ;;
esac

. ${envFile}

#NOW call your program
myProgram -v -f inFile -o outFile ......

随着您在数据处理环境中开发越来越多的脚本,您始终可以在顶部 source 您的 envFile。当您最终更改服务器的物理位置(或名称)时,您只需在一个地方进行更改。

IHTH

【讨论】:

    【解决方案2】:

    还有一些处理这个问题的宝石。 figaro 无论有无heroku,都可以使用。 Figaro 使用 yaml 文件(在 config 和 git 中被忽略)来跟踪变量。另一个选项是dotenv,它从.env 文件中读取变量。还有another article 以及所有选项。

    【讨论】:

      【解决方案3】:

      要生成交互式 shell(也称为登录 shell),您需要像这样调用 sudo:

      sudo -i -u <user> <command>
      

      您也可以使用 -E 来保护环境。这将允许将您当前环境的一些变量传递给使用 sudo 调用的命令。

      【讨论】:

        【解决方案4】:

        我通过在其init.d 脚本中明确告诉 Unicorn 在启动过程中读取变量文件来解决了类似的问题。首先,我在应用程序根目录上方的目录中创建了一个名为variables 的文件。在此脚本中,我在所有环境变量上调用 export,例如export VAR=value。然后我在/etc/init.d/unicorn 文件中定义了一个变量GET_VARS=source /path/to/variables。最后,我将启动选项修改为su - $USER -c "$GET_VARS &amp;&amp; $CMD",其中$CMD 是启动命令,$USER 是应用程序用户。因此,文件中定义的变量在启动时被导出到 Unicorn 应用程序用户的 shell 中。请注意,我使用的 init.d 脚本几乎与 this article 中的脚本相同。

        【讨论】:

          猜你喜欢
          • 2012-08-22
          • 1970-01-01
          • 2017-10-11
          • 2014-04-22
          • 2011-02-09
          • 1970-01-01
          • 2014-09-16
          • 2015-09-16
          • 2017-10-18
          相关资源
          最近更新 更多