在Ubuntu上使用nginx和Passenger时放置环境变量的位置

Tyl*_*itt 27 ubuntu ruby-on-rails environment-variables

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

secret = ENV['EMAIL_PASSWORD']
Run Code Online (Sandbox Code Playgroud)

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

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

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

lee*_*asn 10

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


yba*_*kos 8

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

sudo -E /usr/local/sbin/nginx
Run Code Online (Sandbox Code Playgroud)

运行nginx时,要知道自己的用户env变种.

或者,看看env命令(见这里):

env EMAIL_PASSWORD=secret
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*eys 6

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

要注意的一些事项:

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

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

将bash代码放入其中~/.profile会混淆其他sh-descendent shell和尝试读取该文件的非shell工具,因此让bash特定的~/.bash_login或-_profile包含特定于bash的东西,并. ~/.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"仅出现,因为该文件将与"."一起使用.或"来源" - shell脚本应该永远不会有命令扩展名的任何形式的Unix/Linux的.

sudoybakos指出时,大多数环境变量都会被丢弃.类似的问题出现在crontabs,工作等等.如果有疑问,添加env | sort > /tmp/envvars或类似的可疑脚本可以真正帮助调试.

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

~/.bash_profile(或~/.bash_login)肯定可以包括. ~/.bashrc,但环境变量属于~/.bash_profile(如果bash特定)或~/.profile包含它(如果你正在使用这种机制并且有其他所有的envvars),如DeWitt所说,只记得放在. ~/.bashrc.bash_profile . ~/.profile和其他环境变量之后,所以登录和所有其他调用都~/.bashrc可以依赖已经设置的envvars.一个例子~/.bash_profile:

# .bash_profile
[ -r ~/.profile ] && . ~/.profile  # envvars
[ -r ~/.bashrc ]  && . ~/.bashrc   # functions, per-tty settings, etc.
#---eof
Run Code Online (Sandbox Code Playgroud)

[ -r ... ] && ...任何Bourne shell后代的工作,如果.profile丢失,不会导致错误/中止(我个人也有~/.profile.d/*.sh设置,但这是一个完全可选的练习).

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

~/.bash_profile
~/.bash_login
~/.profile
Run Code Online (Sandbox Code Playgroud)

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


Sub*_*has 6

这在nginx中有记录.除了 TZ运行worker 之外,它会删除所有环境变量.如果要添加环境变量,请将以下内容添加到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
Run Code Online (Sandbox Code Playgroud)

export由于init脚本的编写方式(我们不知道他们是否在干净的环境中使用sudo等),因此bash中的正常或任何事情都无法保证传递给nginx.所以我宁愿把它们放在nginx配置文件中,而不是依靠shell来做.

编辑:修复链接

  • 我不得不downvote,因为正如@oma所说,rails应用程序无法访问您在nginx配置中设置的变量.我试图完全按照你的解释设置一些变量......但它不起作用.如果你考虑扩大你的答案,我会再次投票. (3认同)

jos*_*dan 5

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

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

    passenger_env_var DATABASE_USERNAME foo_db;
    passenger_env_var DATABASE_PASSWORD 秘密;
    passenger_env_var SECRET_KEY_BASE the_secret_keybase;
}

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


Ale*_*lex -1

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

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