Несколько сайтов, использующих Django и mod_wsgi на Apache

В настоящее время я использую два приложения Django (скажем, A и B), размещенные в одном домене (но обслуживаемые на разных портах) через Apache. Я считаю, что мои настройки верны, но я случайно получаю 500 на обоих сайтах. 500 на A (скажем, например) происходит в основном после того, как запрос был обслужен на B (и наоборот).

Изучив журнал ошибок (например, A), я вижу, что модуль wsgi A пытается получить доступ к файлу settings.py B (которого, очевидно, там нет, поскольку пути проекта разные) [и это действительно происходит с другой стороны, wsgi B вызывает исключение, жалуясь на отсутствие файла settings.py A]. Я не уверен, зачем им искать другой файл настроек, импорт (для settings.py) во всех представлениях специфичен для соответствующих проектов.

Вот моя установка:

A обслуживается через порт 8080, B обслуживается через порт 80.

Виртуальный хост:

<VirtualHost *:8080>

  ServerAdmin [email protected]
  ServerName  string1

  Alias /static/ /home/PATH_TO_PROJECT_A/static/

  <Directory /home/PATH_TO_PROJECT_A/static>
  Order deny,allow
  Allow from all
  </Directory>

  WSGIScriptAlias / /home/PATH_TO_PROJECT_A/wsgi.py

  <Directory /home/PATH_TO_PROJECT_A>
  <Files wsgi.py>
  Order deny,allow
  Allow from all
  </Files>
  </Directory>


  LogLevel warn
  ErrorLog  /SOME_PATH/errorA.log
  CustomLog /SOME_PATH/accessA.log combined
</VirtualHost>


<VirtualHost *:80>
  ServerName string1
  ServerAdmin [email protected]

  Alias /APP_B/static/ /home/PATH_TO_PROJECT_B/static/

  <Directory /home/PATH_TO_PROJECT_B/static>
  Order deny,allow
  Allow from all
  </Directory>

  WSGIScriptAlias /APP_B /home/PATH_TO_PROJECT_B/wsgi.py/

  <Directory /home/PATH_TO_PROJECT_B>
  <Files wsgi.py>
  Order deny,allow
  Allow from all
  </Files>
  </Directory>

  ErrorLog /home/SOME_PATH/error2.log
  CustomLog /home/SOME_PATH/access2.log combined

  # All other files on B:80 (other than /APP_B are served normally
  DocumentRoot /home/foo/public_html/xyz/public

</VirtualHost>

порты.conf:

NameVirtualHost *:8080
Listen 8080
Listen 80

<IfModule mod_ssl.c>
 Listen 443
</IfModule>

<IfModule mod_gnutls.c>
 Listen 443
</IfModule>

wsgi.py на «А»:

import os, sys

sys.path.append('home/PATH_TO_PROJECT_A') #1

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_A.settings") #2

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

И точно так же на B, с изменениями в строке №1 и №2.

Ошибка, которую я получаю от error.log, например, от A:

 [Sun Aug 26 17:01:49 2012] [error] [client x] Traceback (most recent call last):
 [Sun Aug 26 17:01:49 2012] [error] [client x]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__
 [Sun Aug 26 17:01:49 2012] [error] [client x]     self.load_middleware()
 [Sun Aug 26 17:01:49 2012] [error] [client x]   File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 39, in load_middleware
 [Sun Aug 26 17:01:49 2012] [error] [client x]     for middleware_path in settings.MIDDLEWARE_CLASSES:
 [Sun Aug 26 17:01:49 2012] [error] [client x]   File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 184, in inner
 [Sun Aug 26 17:01:49 2012] [error] [client x]     self._setup()
 [Sun Aug 26 17:01:49 2012] [error] [client x]   File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup
 [Sun Aug 26 17:01:49 2012] [error] [client x]     self._wrapped = Settings(settings_module)
 [Sun Aug 26 17:01:49 2012] [error] [client x]   File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 95, in __init__
 [Sun Aug 26 17:01:49 2012] [error] [client x]     raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
 [Sun Aug 26 17:01:49 2012] [error] [client x] ImportError: Could not import settings 'PROJECT_B.settings' (Is it on sys.path?): No module named PROJECT_B.settings

Как вы видите, журнал ошибок A жалуется, что settings.py B отсутствует. Пожалуйста, пролейте немного света, я понятия не имею, что не так. Я не понимаю, почему одно приложение будет искать файл settings.py другого для импорта?

Оба приложения работают и выполняются, как и ожидалось, но они прерываются при случайных запросах, обслуживающих 500 (которые очищаются, если я снова обновляю).

Спасибо!


person MrMuddy    schedule 26.08.2012    source источник


Ответы (1)


Django ломает сгенерированный wsgi.py для запуска нескольких экземпляров Django в одном процессе в разных подинтерпретаторах. Либо используйте режим демона mod_wsgi и делегируйте каждый в отдельную группу процессов демона, в любом случае это лучше, либо измените:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_A.settings")

to:

os.environ["DJANGO_SETTINGS_MODULE"] = "PROJECT_A.settings"

Аналогично для другого файла wsgi.py.

person Graham Dumpleton    schedule 26.08.2012
comment
Между прочим, этот другой вопрос практический пример самого Грэма использования отдельных групп процессов демона. Мне очень помог, ты получил мои голоса, Грэм! - person Gerard Yin; 13.09.2012
comment
Не думайте, что у вас та же проблема, и не ждите, что люди будут читать мысли. Создайте отдельный вопрос и подробно опишите, в чем именно заключается ваша проблема. - person Graham Dumpleton; 20.03.2014