2013-07-18 2 views
1

У меня есть несколько имен пользователей, паролей и других конфигураций в переменных среды экземпляра ec2. Я создал виртуальную установку и активен, когда я запускаю свой сервер django. В файле настроек этого сервера django я обращаюсь к переменным среды как os.environ ['variable'].mod_wsgi не находит переменную окружения в virtualenv

Вне виртуальных сайтов сайт может получить доступ к этим переменным в порядке. Когда я запускаю printenv, я вижу все переменные и значения.

Однако сервер не может их найти и бросает ключевые ошибки в результате, когда я вызываю os.environ на них.

установка = ec2 экземпляр - mod_wsgi - Nginx - апач

UPDATE Это начал работать, установив переменные в django.wsgi следующим образом.

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

Это само по себе перестало работать, как только я обновился до нового оборудования ec2. Я не уверен, как это было связано.

Теперь то, что работало, наконец, устанавливало переменные индивидуально, используя SetEnv в конфигурационном файле apache. Все еще не оптимально, потому что я должен сохранить файл конфигурации, извлеченный на производственной машине, но он блокирует меня.

SetEnv SQL_PASSWORD password 
+0

У вас есть virtualenv active при запуске printenv? – Marcin

+0

Да, насколько я могу судить, он активен. –

+0

В командной строке командной строки сказано так. –

ответ

0

Я использую nginx и uwsgi на Ec2 и имею рецепт шеф-повара, который строит мои серверы. Чтобы решить эту проблему, у шеф-повара у меня есть роли, содержащие учетные данные, которые не хранятся в репозитории приложения.

файл /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 

Вуаля, настройки источника контролируется в отдельно управляемый репо (шеф-повара) и загружается в приложение. Это может быть не BEST, но довольно безопасно b/c того, как разрешения блокируются на рефери шеф-повара и целевых серверах и легко развертываются.

+0

Кажется возможным, но должен быть лучший способ сделать это. У меня есть все пароли, установленные в среде, когда я проверяю их с помощью python.Почему mod_wsgi не загружает их? –

+0

, в какой среде они находятся? ваш пользователь ssh или ваш пользователь apache? Apache работает как apache (возможно? Im a uwsgi man) –

+0

Переменные задаются в .bash_profile. –