Herokuに似たシステムをセットアップして、秘密鍵を環境変数に格納し、次のように私のRailsアプリからそれらにアクセスします。
secret = ENV['EMAIL_PASSWORD']
Herokuでheroku config:add EMAIL_PASSWORD=secret
を実行できることは知っています。nginxとPassengerを実行している自分のubuntuボックスに対して、そのようなことをしたいと思っていました。
これらの変数を.bashrc
または.bash_login
のexport
sとして追加して、システムの再起動時にこれらの変数が自動的に設定されるようにする必要がありますか?
これらの各ファイルがいつ読み込まれるかわかりません。
dotenv gem を使用して、環境変数として.envファイルをロードできます。さまざまな環境で.envファイルを生成できます。リポジトリにチェックインする必要はありません。
これは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構成ファイル自体にこれらを入れたいと思います。
編集:リンクを修正
(これはおそらくやり過ぎですが、多分役に立つでしょう)
覚えておくべきいくつかの事柄:
環境変数はある程度公開されており、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つのSudo
sが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つの使用は完全にユーザーの制御下に置かれます。
/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" "$@"
私はそれらを私の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 を参照してください。
別の質問に対するこの回答を読む必要があります。
私はバージョンマネージャーとしてrbenvを使用しています。プロジェクトの環境変数を保存するための適切な解決策は、 rbenv-vars プラグインをインストールして.rbenv-vars
ファイル。
ここに便利な投稿があります:
Rbenv、Passenger、Capistranoを使用したアプリENV変数のデプロイ
RVMを使用しているこれと戦う人のために。デフォルトの環境ファイルにユーザーの.bashrcファイルと.profileファイルが含まれていることを確認してください
file: $rvm_path/environments/default
パスを見つけるには、次のコマンドを実行します。
ls -lah `whereis rvm`/environments/default
そのファイルの最初の行の前に次の2行を追加します。
source $HOME/.bashrc
source $HOME/.profile
プロジェクトの環境変数を保持するのに最適な場所は/etc/profile.d/YOUR_FILE.sh、 ここ さまざまなシナリオで環境変数をどこに保持するかを詳細に説明するドキュメントを見つけることができます。
編集:
わかりました。読みすぎたので、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
...
}
誰かが私と同じタイプの質問をした場合に備えて、さまざまな.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