在Apache上使用Django和mod_wsgi的多个站点

MrM*_*ddy 12 apache django mod-wsgi

我目前正在使用两个Django应用程序(说A&B)通过Apache托管在同一个域上(但在不同的端口上提供服务).我相信我的设置是正确的,但我在两个网站上随机获得500.500 on A(例如)发生在请求被提供之后B(反之亦然).

在检查错误日志(都说A例如),我看到A的WSGI模块试图访问Bsettings.py文件(这显然不会发生在那里,因为项目路径是不同的),这确实发生了另外,B的wsgi引发了一个例外,抱怨缺少A的settings.py文件].我不确定他们为什么要查找其他设置文件,所有视图的导入(对于settings.py)都是特定于各个项目的.

这是我的设置:

A正在港口服务8080,B正在港口服务80.

虚拟主机:

<VirtualHost *:8080>

  ServerAdmin x@x.net
  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 x@x.net

  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>
Run Code Online (Sandbox Code Playgroud)

ports.conf:

NameVirtualHost *:8080
Listen 8080
Listen 80

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

<IfModule mod_gnutls.c>
 Listen 443
</IfModule>
Run Code Online (Sandbox Code Playgroud)

'A'上的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()
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

正如你所看到A的错误日志抱怨Bsettings.py缺失.请说清楚,我不知道出了什么问题.我不明白为什么一个应用程序会寻找另一个要导入的settings.py文件?

两个应用程序都按预期工作和执行,但它们确实在服务500的随机请求中中断(如果我再次刷新则会被清除).

谢谢!

Gra*_*ton 15

Django打破了生成的wsgi.py,在不同的子解释器中以相同的进程运行多个Django实例.使用mod_wsgi守护进程模式并将每个模式委派给一个单独的守护程序进程组,无论如何都更好,或者更改:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_A.settings")
Run Code Online (Sandbox Code Playgroud)

至:

os.environ["DJANGO_SETTINGS_MODULE"] = "PROJECT_A.settings"
Run Code Online (Sandbox Code Playgroud)

与其他wsgi.py文件类似.

  • 顺便说一句,另一个[问题](http://stackoverflow.com/questions/9581197/two-django-projects-running-simultaneously-and-mod-wsgi-acting-werid)是格雷厄姆本人的一个实际例子.使用单独的守护程序进程组.帮助了我很多,你得到了格雷厄姆的选票! (2认同)