web-dev-qa-db-ja.com

UbuntuでnginxとPassengerを使用するときに環境変数を配置する場所

Herokuに似たシステムをセットアップして、秘密鍵を環境変数に格納し、次のように私のRailsアプリからそれらにアクセスします。

secret = ENV['EMAIL_PASSWORD']

Herokuでheroku config:add EMAIL_PASSWORD=secretを実行できることは知っています。nginxとPassengerを実行している自分のubuntuボックスに対して、そのようなことをしたいと思っていました。

これらの変数を.bashrcまたは.bash_loginexportsとして追加して、システムの再起動時にこれらの変数が自動的に設定されるようにする必要がありますか?

これらの各ファイルがいつ読み込まれるかわかりません。

27
Tyler DeWitt

dotenv gem を使用して、環境変数として.envファイルをロードできます。さまざまな環境で.envファイルを生成できます。リポジトリにチェックインする必要はありません。

10
leenasn

これはnginxに記載されています 。ワーカーの実行時にすべての環境変数を除きますTZを削除します。環境変数を追加する場合は、nginx構成のtopに以下を追加します。

# 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で行うことは、initスクリプトの記述方法が原因でnginxに渡される保証はありません(クリーンな環境でSudoを使用しているかどうかはわかりませんが、等)。したがって、シェルに依存するのではなく、nginx構成ファイル自体にこれらを入れたいと思います。

編集:リンクを修正

6
Subhas

(これはおそらくやり過ぎですが、多分役に立つでしょう)

覚えておくべきいくつかの事柄:

環境変数はある程度公開されており、ps(1)コマンドにオプションを追加する(bashのps e $$など)か、/proc/*/environを見るのと同じくらい簡単に他のプロセスから見ることができます。最近のシステムでは、少なくとも同じユーザー(またはroot)に制限されています。別のかなり簡単なオプションが利用できる場合は、それらが秘密であることを信頼しないでください。

~/.bashrcは環境変数の不適切な場所です。これは、使用時に、~/.bash_login、〜/ .bash_profile、または~/.profileでログイン時に一度計算され、すべてに渡されるためです。子孫シェル。対照的に、~/.bashrcアクションは、シェルが呼び出されるたびに再計算される傾向があります(明示的に無効にしない限り)。

~/.profileにbashコードを配置すると、他のsh子孫シェルとそのファイルを読み取ろうとする非シェルツールが混乱する可能性があるため、bash固有の~/.bash_loginまたは-_profileにbash固有のものを含めます。そして、より一般的なもの(LESS、EDITOR、VISUAL、LC_COLLATE、LS_COLORSなど)に. ~/.profileを使用することは、他のツールにやさしいものです。

~/.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」はファイルが「。」で使用されるため、存在するだけであることに注意してください。または「ソース」-シェルスクリプトはneverコマンド名の拡張子を任意の形式のUnix/Linuxに持つ必要があります。

Ybakosが指摘しているように、1つのSudosがrootになると、ほとんどの環境変数が破棄されます。同様の問題がcrontabやジョブなどに現れます。疑わしい場合は、疑わしいスクリプトをenv | sort > /tmp/envvarsなどに追加すると、デバッグに役立ちます。

一部のディストリビューションにはシェルスタートアップスクリプトが含まれているため、ゆがんでいるため、bash(1)のマニュアルページに記載されている順序に実際には反抗します。 $ BASHまたは$ BASH_VERSIONをチェックしているデフォルトのユーザー~/.profileを見つけると、いつでも、「興味深い」環境のいずれかにいる可能性があり、それらを読んで、コントロールの場所を見つける必要がある場合があります。フローが進みます(参照により、より一般的な~/.bash_profileを含むbash固有の~/.bash_loginまたは~/.profileを使用する必要があるため、bash実行可能ファイルに$を書く代わりに作業を実行させます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は、これら3つのうち最初に見つかったファイルのみを読み取ることに注意してください。

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

...そのため、1つを取得すると、bashの観点から、他の2つの使用は完全にユーザーの制御下に置かれます。

6
Alex North-Keys

/usr/local/binフォルダーに、いくつかの環境変数を設定してRubyを実行するスクリプトがあります。私の(NginxではなくApache)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" "$@"
4
Teddy

私はそれらを私の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; 
} 

これでうまくいきます。詳細については、プーシオンの乗客 docs を参照してください。

3
joshaidan

別の質問に対するこの回答を読む必要があります。

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

私はバージョンマネージャーとしてrbenvを使用しています。プロジェクトの環境変数を保存するための適切な解決策は、 rbenv-vars プラグインをインストールして.rbenv-varsファイル。

ここに便利な投稿があります:
Rbenv、Passenger、Capistranoを使用したアプリENV変数のデプロイ

1
Marsio

RVMを使用しているこれと戦う人のために。デフォルトの環境ファイルにユーザーの.bashrcファイルと.profileファイルが含まれていることを確認してください

file: $rvm_path/environments/default

パスを見つけるには、次のコマンドを実行します。

ls -lah `whereis rvm`/environments/default

そのファイルの最初の行の前に次の2行を追加します。

source $HOME/.bashrc
source $HOME/.profile
1
Jeff Davenport

プロジェクトの環境変数を保持するのに最適な場所は/etc/profile.d/YOUR_FILE.sh、 ここ さまざまなシナリオで環境変数をどこに保持するかを詳細に説明するドキュメントを見つけることができます。

1
rakeshpatra

編集:

わかりました。読みすぎたので、ENV変数を保存する方法をここで確認できます。

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

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

ローカルコンピューターでNginxをサーバーとして使用する場合は、env変数をnginx構成ファイルに定義できます。

location / {
...
   fastcgi_param   EMAIL_PASSWORD  secret; #EMAIL_PASSWORD = secret
...
}
1
rbinsztock

誰かが私と同じタイプの質問をした場合に備えて、さまざまな.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
0
Tyler DeWitt