2013-07-18 51 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中設置。 –