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

在我的生产/登台/等设置文件的开头,我有以下块来读取环境文件

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

瞧,设置在单独管理的存储库(厨师)中进行源代码控制并加载到应用程序中。这可能不是最好的方法,但它是相当安全的 b/c 权限是如何锁定在 chef repo 和目标服务器上并且易于部署的。

于 2013-09-10T14:15:50.670 回答