1

EC2 インスタンスの環境変数にいくつかのユーザー名、パスワード、およびその他の構成を設定しています。virtualenv セットアップを作成し、django サーバーを実行する場所でアクティブにしました。その django サーバーの設定ファイルで、環境変数に os.environ['variable'] としてアクセスします。

virtualenv の外では、サイトはこれらの変数に問題なくアクセスできます。printenv を実行すると、すべての変数と値が表示されます。

ただし、サーバーはそれらを見つけることができず、それらで os.environ を呼び出すと、結果としてキーエラーがスローされます。

セットアップ = ec2 インスタンス - mod_wsgi - nginx - apache

更新 これは、次の方法で django.wsgi の変数を設定することで機能し始めました。

os.environ['SQL_PASSWORD'] = 'password'

新しいec2ハードウェアにアップグレードすると、それだけで機能しなくなりました。それがどのように関連していたのかはわかりません。

さて、最終的に機能したのは、Apache構成ファイルでSetEnvを使用して変数を個別に設定することでした。運用マシンで構成ファイルをチェックアウトしたままにしておく必要があるため、まだ最適ではありませんが、ブロックが解除されます。

SetEnv SQL_PASSWORD password
4

1 に答える 1

0

私は Ec2 で nginx と uwsgi を使用しており、サーバーを構築するシェフのレシピがあります。この問題を解決するために、シェフには、アプリのリポジトリに保存されていない資格情報を含むロールがあります。

/home/user/web/site/environmentロールに基づいてシェフが作成するファイル。

MYSQL_DATABASE=databasename
MYSQL_USER=databaseuser
MYSQL_PASSWORD=databasepassword
MYSQL_HOST=databaseip
MYSQL_PORT=3306

REDIS_HOST=redishost
REDIS_PASSWORD=redispassword
REDIS_PORT=6379
REDIS_DB=0

MEDIA_ROOT=/home/user/web/site/media
STATIC_ROOT=/home/user/web/site/static

production/staging/etc 設定ファイルの先頭に、環境ファイルを読み取るための次のブロックがあります。

import os, re

try:
    dirname = os.path.dirname(os.path.abspath(__file__))
    # my environment file is always in the same place relative to my project's settings file
    env_path = os.path.normpath(os.path.join(dirname, '..', '..', '..', '..', 'environment'))
    with open(env_path) as f:
        content = f.read()

        for line in content.splitlines():
            m1 = re.match(r'\A([A-Za-z_0-9]+)=(.*)\Z', line)
            if m1:
                key, val = m1.group(1), m1.group(2)
                m2 = re.match(r"\A'(.*)'\Z", val)
                if m2:
                    val = m2.group(1)
                m3 = re.match(r'\A"(.*)"\Z', val)
                if m3:
                    val = re.sub(r'\\(.)', r'\1', m3.group(1))
                os.environ.setdefault(key, val)
except IOError:
    pass

出来上がり、設定は個別に管理されたレポ (シェフ) でソース管理され、アプリに読み込まれます。これは最善の方法ではないかもしれませんが、Chefリポジトリとターゲット サーバーでアクセス許可がロックされ、デプロイが容易であることを考えると、かなり安全です。

于 2013-09-10T14:15:50.670 に答える