Я пытался исследовать, как выполнить множественное развертывание Python / Django с помощью Apache VirtualHosts.
Проблема, с которой я столкнулся, кажется очевидной,
ImportError: Could not import settings 'hub.settings' (Is it on sys.path?): No module named hub.settings, referer: proposals.internal.local
Проблема, с которой я сталкиваюсь, заключается в том, что предложения .internal.local используют предложения.settings, а hub.settings фактически взяты из hub.internal.local.
Если я запускаю только предложение или концентратор самостоятельно, я не сталкиваюсь с вышеупомянутой проблемой, однако, когда я запускаю их оба - поскольку люди их используют. Кажется, что sys.path обновлен для обоих проектов.
[APACHE CONFIGS - HUB]
<VirtualHost *:80>
ServerName hub.internal.local
DocumentRoot /var/www/hub.internal.local/hub/hub/static
Alias /static/ /var/www/hub.internal.local/hub/hub/static/
<Directory /var/www/hub.internal.local/hub/hub/static>
Allow from all
</Directory>
WSGIScriptAlias / /var/www/hub.internal.local/hub/hub/wsgi.py
</VirtualHost>
[APACHE CONFIGS - ПРЕДЛОЖЕНИЯ]
<VirtualHost *:80>
ServerName proposals.internal.local
DocumentRoot /var/www/proposals.internal.local/proposal/proposal/static
Alias /static/ /var/www/proposals.internal.local/proposal/proposal/static/
<Directory /var/www/proposals.internal.local/proposal/proposal/static>
Allow from all
</Directory>
WSGIScriptAlias / /var/www/proposals.internal.local/proposal/proposal/wsgi.py
</VirtualHost>
[wsgi.py - HUB]
import os
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hub.settings")
sys.path.append('/var/www/hub.internal.local')
sys.path.append('/var/www/hub.internal.local/hub')
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
[wsgi.py - ПРЕДЛОЖЕНИЯ]
import os
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proposal.settings")
sys.path.append('/var/www/proposals.internal.local')
sys.path.append('/var/www/proposals.internal.local/proposal')
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Ясно, что мне чего-то не хватает, но я не вижу ничего необычного в документации.
Не используй os.environ.setdefault()
. Django облажался с хостингом нескольких приложений в одном процессе mod_wsgi, когда они переключились на такой способ установки переменных окружения.
Это задокументировано в моем блоге: Запросы выполняются в неправильном экземпляре Django в Apache / mod_wsgi.
Если причина в этом, есть два решения. Самый быстрый - заменить использование setdefault () для установки переменной среды в файле сценария WSGI более обычным назначением.
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
Альтернативой, которая требует немного больше работы, но может иметь другие преимущества, является переключение на использование режима демона mod_wsgi для запуска экземпляров Django и делегирования каждого отдельному набору процессов. При запуске экземпляров Django в отдельных процессах не может быть возможности утечки переменных среды из одного в другой.
WSGIDaemonProcess project-2 WSGIScriptAlias /suburl /some/path/project-2/wsgi.py process-group=project-2 WSGIDaemonProcess project-1 WSGIScriptAlias / /some/path/project-1/wsgi.py process-group=project-1