Назад | Перейти на главную страницу

Два приложения mod_wsgi Django на одном Apache пытаются использовать файлы конфигурации друг друга

У меня есть два несвязанных приложения mod_wsgi Django, которые должны обслуживаться с двух виртуальных хостов в одном экземпляре Apache2.

Я сделал каждый виртуальный хост, каждый со своим собственным каталогом settings.py и wsgi.py.

Ошибка, которую я все время вижу:

[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] mod_wsgi (pid=6375): Exception occurred processing WSGI script '/srv/app1/app1/wsgi.py'., referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] Traceback (most recent call last):, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]     self.load_middleware(), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 39, in load_middleware, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]     for middleware_path in settings.MIDDLEWARE_CLASSES:, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]   File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 184, in inner, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]     self._setup(), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]   File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]     self._wrapped = Settings(settings_module), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]   File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 95, in __init__, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4]     raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/
[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] ImportError: Could not import settings 'app0.settings' (Is it on sys.path?): No module named app0.settings, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/

app0.wsgi:

import os
import sys
sys.path.append('/srv/app0')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app0.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

app1.wsgi:

import sys
sys.path.append('/srv/app1')
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app1.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Как можно спутать два приложения?

Запрос страницы из app1 жалуется, что не может загрузить настройки из app0 - зачем оно вообще пытается?


Обновить:

Меня особенно беспокоит то, что каждый wsgi.py устанавливает для DJANGO_SETTINGS_MODULE свое собственное имя настроек - это причина проблемы?

Читать:

Не используй os.environ.setdefault(), используйте os.environ[].

Также используйте режим демона mod_wsgi, а не встроенный режим.


Чтобы добавить к этому после вашего обновления, установка переменной среды обычно не является проблемой, так как ваши два приложения будут работать в разных контекстах субинтерпретатора процесса. Он падает, потому что вы используете os.environ.setdefault() поскольку это ничего не сделает, если переменная среды уже установлена. Эти переменные среды фактически являются общими для всего процесса, а это означает, что любой файл сценария WSGI, который он установит первым, победит. Эта проблема не возникает, когда вы используете os.environ[] так как он перезапишет переменную среды для контекста субинтерпретатора и проигнорирует то, что унаследовано от уровня всего процесса, поэтому прочитайте сообщения в блоге и сделайте то, что объясняется.