繁体   English   中英

使用 nginx 和 Ubuntu 上的 Passenger 时环境变量放在哪里

[英]Where to put environment variables when using nginx and Passenger on Ubuntu

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

secret = ENV['EMAIL_PASSWORD']

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

我是否应该将这些变量作为export s 添加到.bashrc.bash_login中,以便在系统重新启动时自动设置这些变量?

我不确定这些文件中的每一个何时被读入。

您可以使用dotenv gem加载 .env 文件作为环境变量。 您可以为不同的环境生成 .env 文件,并且不需要而不是不应该签入您的存储库。

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

sudo -E /usr/local/sbin/nginx

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

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

env EMAIL_PASSWORD=secret

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

(这可能有点矫枉过正,但也许会有用)

一些事情要记住:

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

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

将 bash 代码放在~/.profile中可能会混淆其他尝试读取该文件的 sh-descendent shell 和非 shell 工具,因此让特定于 bash 的~/.bash_login或 -_profile 包含特定于 bash 的东西,并使用. ~/.profile . ~/.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 . $HOME/.profile如果它还没有以某种方式。

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

正如 ybakos 指出的那样,大多数环境变量都会在一个sudo到 root 时被丢弃。 类似的问题出现在 crontabs、at jobs 等中。如有疑问,请添加env | sort > /tmp/envvars 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 . ~/.bashrc ,但环境变量属于~/.bash_profile (如果特定于 bash)或其中包含的~/.profile (如果您使用此机制并且其中的所有其他内容都有 envvars)作为 DeWitt说,只要记得把. ~/.bashrc . ~/.bashrc在 .bash_profile 之后. ~/.profile . ~/.profile和其他环境变量,以便登录和~/.bashrc的所有其他调用都可以依赖于已经设置的环境变量。 一个例子~/.bash_profile

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

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

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

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

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

这记录在 nginx 中 它在运行 worker 时删除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或您在 bash 中执行的任何操作都不能保证传递给 nginx,这是由于 init 脚本的编写方式(我们不知道它们是否在干净的环境中使用 sudo 等)。 所以我宁愿把这些放在 nginx 配置文件本身,而不是依赖 shell 来做。

编辑:修复链接

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

server {
    server_name www.foo.com;
    root /webapps/foo/public;
    passenger_enabled on;

    passenger_env_var DATABASE_USERNAME foo_db;
    passenger_env_var DATABASE_PASSWORD secret;
    passenger_env_var SECRET_KEY_BASE the_secret_keybase;
}

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

我在/usr/local/bin文件夹中有一个脚本,它设置了一些环境变量,然后执行 Ruby。我在我的(Apache,而不是 Nginx)conf 文件中定义了到 Ruby 的路径到/usr/local/bin中的那个文件。

例子:

#!/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" "$@"

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

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

编辑:

好的,对不起,我读得太快了,你可以在这里查看如何保存你的 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
...
}

我使用 rbenv 作为版本管理器。 为项目存储环境变量的好方法是安装rbenv-vars插件并将它们放入.rbenv-vars文件中。

这是一个有用的帖子:
使用 Rbenv、Passenger 和 Capistrano 部署应用程序 ENV 变量

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

file: $rvm_path/environments/default

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

ls -lah `whereis rvm`/environments/default

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

source $HOME/.bashrc
source $HOME/.profile

为您的项目保存环境变量的最佳位置是/etc/profile.d/YOUR_FILE.sh,在这里您可以找到详细说明在不同场景下保存环境变量的文档。

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

总之:

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

因此,推荐的程序是从.bash_profile获取.bashrc ,这样所有变量都在您登录计算机时设置。 只需将其添加到.bash_profile

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM