mod_wsgi在virtualenv中找不到环境变量

时间:2013-07-18 19:37:33

标签: python django virtualenv

我在ec2实例的环境变量中设置了一些用户名,密码和其他配置。我创建了一个virtualenv设置,并在我运行我的django服务器时处于活动状态。在该django服务器的设置文件中,我以os.environ ['variable']的形式访问环境变量。

在virtualenv之外,网站可以很好地访问这些变量。当我运行printenv时,我会看到所有变量和值。

然而,当我在它们上面调用os.environ时,服务器找不到它们并且正在抛出关键错误。

setup = ec2 instance - mod_wsgi - nginx - apache

更新 这开始通过以下方式在django.wsgi中设置变量来开始工作。

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

一旦我升级到新的ec2硬件,这一点就停止了工作。我不确定这是如何相关的。

现在,最终的工作是使用apache配置文件中的SetEnv单独设置变量。仍然不是最佳的,因为我必须在生产机器上检查配置文件,但它会解锁我。

SetEnv SQL_PASSWORD password

1 个答案:

答案 0 :(得分: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

Voila,设置由一个单独管理的仓库(厨师)控制,并加载到应用程序中。这可能不是 BEST 的方式,但它是相当安全的b / c如何锁定主厨仓库和目标服务器上的权限,并且易于部署。