У меня есть два несвязанных приложения 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[]
так как он перезапишет переменную среды для контекста субинтерпретатора и проигнорирует то, что унаследовано от уровня всего процесса, поэтому прочитайте сообщения в блоге и сделайте то, что объясняется.