Как избежать размещения переменных окружения в нескольких местах с помощью Django, nginx и uWSGI?
Я пытаюсь настроить nginx + uWSGI для обслуживания моего приложения Django.
Когда я помещал переменные среды в myapp_uwsgi.ini
:
uid = username
gid = username
env = DJANGO_SITE_KEY="..."
работает как ожидалось.
Однако у моего приложения есть несколько команд управления, которые также должны иметь доступ к переменным среды, которые я определил.
Если я поместил переменные среды в /home/username/.bashrc
:
export DJANGO_SITE_KEY="..."
uWSGI не загружает их.
Я попытался поместить переменные среды в отдельный файл:
#!/bin/sh
export DJANGO_SITE_KEY="..."
а затем вызовите его как из .bashrc
:
. /home/username/environment
и myapp_uwsgi.ini
:
exec-pre-app = . /home/username/environment
В журналах uWSGI я вижу эту строку:
running ". /home/username/environment" (pre app)...
Но мое приложение Django не может получить доступ к переменным среды с помощью os.environ
.
Я также попытался поместить команды export
в hook preactivate
virtualenvwrapper и использовать параметр virtualenv =
uWSGI, но он тоже не работает (я полагаю, что крючки выполняются только при использовании команд virtualenvwrapper, таких как workon
.
Ответы
Ответ 1
Вот ответ от разработчиков uWSGI:
просто поместите каждую из них (по одной в строке) в текстовый файл в форме
VAR = VALUE
затем в конфигурации uWSGI
[uwsgi]
for-readline = yourfile
env = %(_)
endfor =
Это также работает с конфигурационными файлами yml:
for-readline: filename
env: %(_)
endfor:
Ответ 2
Я использую django-dotenv. Поместите свои env vars в файл как .env внутри вашего проекта, а затем загрузите его в manage.py и wsgi.py. Никакой другой конфигурации не требуется. Команды uwsgi и manage.py будут работать, как ожидалось, и все ваши env vars хранятся только в одном файле.
Ответ 3
Другим подходом является использование систем управления конфигурацией, таких как Salt или Ansible.
С их помощью можно создать шаблоны Jinja для uWSGI и Django с {{variables}}, определенными в одном месте.