2013-07-18 24 views
1

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

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

但是,服务器无法找到他们,并抛出键错误,结果当我打电话os.environ他们。

设置= EC2实例 - mod_wsgi的 - nginx的 - 阿帕奇

UPDATE 这开始通过下列方式设置变量django.wsgi工作。

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

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

现在,什么工作终于被单独设置变量,Apache的配置文件使用SETENV。仍然不是最优的,因为我必须在生产机器上检查配置文件,但它会阻止我。

SetEnv SQL_PASSWORD password 
+0

当您运行printenv时,您是否拥有virtualenv活动? – Marcin

+0

是的,据我所知,它是活跃的。 –

+0

shell提示符是这样说的。 –

回答

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。

+0

似乎可能,但应该有更好的方法来做到这一点。当我使用python检查它们时,我在环境中设置了所有密码。为什么mod_wsgi不加载这些? –

+0

哪个用户的环境在?你的SSH用户的,或你的Apache用户的? Apache以apache运行(可能?我是一个uwsgi人) –

+0

变量在.bash_profile中设置。 –