27

我试图建立一个类似于heroku的系统,我将在环境变量中存储密钥,然后从我的rails应用程序中访问它们,如下所示:

secret = ENV['EMAIL_PASSWORD']

我知道 heroku 可以让你这样做heroku config:add EMAIL_PASSWORD=secret,我想为我自己的运行 nginx 和 Passenger 的 ubuntu 盒子做类似的事情。

我应该将这些变量添加为exports.bashrc还是.bash_login在系统重新启动时自动设置这些变量?

我不确定每个文件何时被读入。

4

13 回答 13

10

您可以使用dotenv gem将 .env 文件加载为环境变量。您可以为不同的环境生成 .env 文件,而不必将其签入您的存储库。

于 2013-05-20T17:54:26.890 回答
8

请记住,nginx 可能不在与您相同的环境下运行,通常(发音为“Apache”)我们通过 SetEnv 在服务器配置文件中添加 env-vars。但是,nginx 没有这样的功能......我相信它也不需要它。

sudo -E /usr/local/sbin/nginx

在运行 nginx 时,它会知道您自己的用户环境变量。

或者,查看env命令(参见此处):

env EMAIL_PASSWORD=secret

要回答您的问题,是的,您应该export在 shell 配置文件中使用语句。

于 2012-04-09T22:51:30.380 回答
7

(这可能是一个矫枉过正,但也许它会很有用)

需要记住的一些事项:

环境变量在某种程度上是公开的,其他进程可以很容易地看到,就像在ps(1)命令中添加一个选项(如ps e $$在 bash 中)或查看/proc/*/environ,尽管在现代系统上两者都至少限制为同一个用户(或 root)。如果您有另一个相当简单的选择,请不要依赖它们是秘密的。

~/.bashrc是环境变量的错误位置,因为它们可以在登录时计算一次~/.bash_login,〜/ .bash_profile,或~/.profile根据您的使用情况,并传递给所有后代shell。相比之下,~/.bashrc动作往往会在每次 shell 调用时重新计算(除非明确禁用)。

将 bash 代码放入其中~/.profile可能会混淆其他 sh-descendent shell 和尝试读取该文件的非 shell 工具,因此让 bash-specific~/.bash_login或 -_profile 包含 bash-specific 的东西,并. ~/.profile用于更一般的东西(LESS, EDITOR、VISUAL、LC_COLLATE、LS_COLORS 等),对其他工具更友好。

中的环境变量~/.profile应采用旧的 Bourne shell 形式 ( VAR=value ; export VAR)。在 Linux 上,这通常并不重要,但在其他 Unixen 上,当旧版本的“sh”试图读取它们时,这可能是一个大问题。

一些 X 会话只会读取~/.profile,而不是~/.bash_login上面提到的其他会话。有些人会寻找一个~/.xsession需要修改的文件,. $HOME/.profile如果它还没有的话。

系统范围的设置将放在类似/etc/profile.d/similar-to-heroku.sh. 请注意,“.sh”仅存在,因为该文件将与“.”一起使用。或 "source" - shell 脚本在任何形式的 Unix/Linux 中都不应该命令名扩展。

sudo正如 ybakos 指出的那样,大多数环境变量在root 时都会被丢弃。类似的问题出现在 crontabs、jobs 等中。如果有疑问,添加env | sort > /tmp/envvars或类似的可疑脚本确实有助于调试。

请注意,某些发行版的 shell 启动脚本如此扭曲,最终实际上违反了 bash(1) 手册页中给出的顺序。每当您发现默认用户~/.profile检查 $BASH 或 $BASH_VERSION 时,您可能处于其中一个,嗯...,“有趣”的环境中,并且可能必须通读它们以找出控制流的去向(他们应该使用特定于 bash 的~/.bash_profileor ~/.bash_login,其中包含更通用~/.profile的引用,从而让 bash 可执行文件完成工作,而不必在 shell 代码中编写 $BASH 检查)。

~/.bash_profile(或~/.bash_login)当然可以包括. ~/.bashrc,但环境变量属于~/.bash_profile(如果特定于bash)或~/.profile包含在其中(如果您使用此机制并且其中包含其他所有内容的环境变量),正如DeWitt所说,只要记住把. ~/.bashrc.bash_profile. ~/.profile和其他环境变量之后,以便登录和所有其他调用都~/.bashrc可以依赖已经设置的环境变量。一个例子~/.bash_profile

# .bash_profile
[ -r ~/.profile ] && . ~/.profile  # envvars
[ -r ~/.bashrc ]  && . ~/.bashrc   # functions, per-tty settings, etc.
#---eof

[ -r ... ] && ...任何 Bourne shell 后代中都可以使用,并且如果缺少 .profile 也不会导致错误/中止(我个人也有一个~/.profile.d/*.sh设置,但这留作完全可选的练习)。

请注意,bash 只读取它找到的这三个文件中的第一个文件:

~/.bash_profile
~/.bash_login
~/.profile

...所以一旦你有了那个,从 bash 的角度来看,其他两个的使用完全在用户的控制之下。

于 2013-05-17T05:59:28.527 回答
6

这记录在 nginx 中。它会删除所有环境变量,除非 TZ在运行工作程序时。如果要添加环境变量,请将以下内容添加到 nginx 配置的顶部

# The top of the configuration usually has things like:
user user-name;
pid pid-file-name;

# Add to this:
env VAR1=value1;
env VAR2=value2;

# OR simply add:
env VAR1;
# To inherit the VAR1 from whatever you set in bash

export由于 init 脚本的编写方式(我们不知道他们是否在干净的环境中使用 sudo 等),您在 bash 中执行的正常操作或任何操作都不能保证传递给 nginx。所以我宁愿把这些放在nginx配置文件本身,而不是依赖shell来做。

编辑:修复链接

于 2013-05-19T20:39:28.890 回答
5

我将它们放在我的 nginx 配置中,特别是使用以下passenger_env_var命令在应用程序的服务器定义中:

服务器 {
    server_name www.foo.com;
    根/webapps/foo/public;
    乘客启用;

    乘客env_var DATABASE_USERNAME foo_db;
    乘客 env_var DATABASE_PASSWORD 秘密;
    乘客 env_var SECRET_KEY_BASE the_secret_keybase;
}

这对我有用。有关更多信息,请参阅 phusion 乘客文档

于 2016-08-10T19:37:22.487 回答
4

I have a script in /usr/local/bin folder that sets some env vars and then executes Ruby. I define the path to Ruby in my (Apache, not Nginx) conf file to that file in /usr/local/bin.

example:

#!/bin/sh

# setup env vars here
export FOO=bar
export PATH_TO_FOO=/bar/bin
export PATH=$PATH:PATH_TO_FOO

# and execute Ruby with any arguments passed to this script
exec "/usr/bin/ruby" "$@"
于 2013-05-21T02:08:09.897 回答
2

您应该阅读对另一个问题的回复,它会有所帮助:

https://stackoverflow.com/a/11765775/1217298

于 2013-05-20T17:11:25.747 回答
1

编辑:

好的抱歉我读得太快了,你可以在这里查看如何保存你的 ENV 变量:

https://help.ubuntu.com/community/EnvironmentVariables

http://www.cyberciti.biz/faq/set-environment-variable-linux/

如果你在本地计算机上使用 Nginx 作为服务器,你可以在你的 nginx 配置文件中定义你的环境变量。

location / {
...
   fastcgi_param   EMAIL_PASSWORD  secret; #EMAIL_PASSWORD = secret
...
}
于 2013-05-14T12:14:16.580 回答
1

I'm using rbenv as a version manager. Good solution to store environment variables for the project was installing the rbenv-vars plugin and putting them in .rbenv-vars file.

Here is a useful post:
Deploying app ENV variables with Rbenv, Passenger and Capistrano

于 2015-04-14T16:23:43.030 回答
1

为您的项目保留 env 变量的最佳位置是 /etc/profile.d/YOUR_FILE.sh, 您可以在此处找到文档,该文档详细说明了为不同场景保留 env 变量的位置。

于 2018-03-28T13:26:00.433 回答
1

对于那些使用 RVM 的人来说。确保您的默认环境文件包含用户的 .bashrc 和 .profile 文件

file: $rvm_path/environments/default

要查找路径,请运行以下命令:

ls -lah `whereis rvm`/environments/default

在该文件的第一行之前添加这两行:

source $HOME/.bashrc
source $HOME/.profile
于 2016-11-02T05:05:34.077 回答
0

如果有人和我有同样类型的问题,这里有一个关于不同.bash*文件的不错的小文章:http: //www.joshstaiger.org/archives/2005/07/bash_profile_vs.html

总之:

大多数情况下: .bash_profile在您登录计算机.bashrc时读取,在您启动新终端时读取。对于 Mac OSX .bash_profile,您启动的每个终端窗口都会读取。

因此,推荐的过程是来源.bashrc.bash_profile以便在您登录计算机时设置所有变量。只需将其添加到.bash_profile

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi
于 2013-05-15T13:35:39.477 回答
-1

您必须将导出行添加到您的主文件夹下的 .profile 文件中...

登录时正在设置环境变量...

于 2012-04-09T22:45:42.920 回答