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

Запуск нескольких проектов Django в Apache, sys.path перезаписывается

Я пытался исследовать, как выполнить множественное развертывание 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