2012-07-08 68 views
1

我最近设置了一个Web服务器,它目前承载了几个静态页面网站和两个Django项目。托管多个Django站点的问题(设置交叉)

这两个django项目是'abc'和'xyz',分别位于主文件夹的不同目录中。每个都有自己的wsgi脚本,它们指向它们各自的settings.py文件。

最近,虽然我一直注意到'xyz'上的几个500错误。通常情况下刷新会纠正问题,但这是不可接受的,所以我检查了apache error.log,并注意到有时当我点击'xyz'时,会出现异常,提示无法在xyz项目中找到abc.settings。不知何故,这两个项目正在交叉并相互干扰。我还没有做足够的工作,但是知道问题是否相同。以下是我的例外。

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

任何帮助/建议将不胜感激。干杯

回答

4

您正在运行的问题是,虽然mod_wsgi的给每个Django应用程序自身的Python解释器,它们仍然共享相同的操作系统环境,这就是Django的存储设置模块的名称。我找到的解决方法是在创建WSGI应用程序对象之前更改Django查找settings模块的环境变量的名称。

我稍微修改wsgi.py看起来是这样的:

import os 

# change the env variable where django looks for the settings module 
import django.conf 
django.conf.ENVIRONMENT_VARIABLE = "DJANGO_SECOND_SETTINGS_MODULE" 

os.environ.setdefault("DJANGO_SECOND_SETTINGS_MODULE", "second.settings") 

# This application object is used by any WSGI server configured to use this 
# file. This includes Django's development server, if the WSGI_APPLICATION 
# setting points here. 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 
+0

这很好。非常感谢! :) – Scalamoosh 2012-08-10 21:08:05

2

目前看起来您并不像使用单独的虚拟环境来处理您的两个项目,如果不是,我会强烈建议您这样做,看看问题是否会在此后继续存在。您仍然可以使用相同的Apache实例,但运行两个独立的Django实例(以及项目的所有其他需求,这些需求可能会也可能不会有所不同)。这通常是任何Django项目的推荐方法。

如果你不了解虚拟环境,下面是关于使用virtualenv和Django的quickstart tutorial,我还建议使用Doug Hellman的非常漂亮的Virtualenv Wrapper。希望这可以帮助!

+0

我遇到同样的问题,但我不确定virtualenv是否能解决这个问题。真正的问题是被其他应用程序覆盖的DJANGO_SETTINGS_MODULE环境变量。 – stschindler 2012-07-10 05:26:17

+0

感谢有关virtualenv的信息。我一直想让它成立一段时间,但从未接近它。不幸的是,它并没有解决我的问题。就像@Tank提到的,每次使用不同的应用程序时,DJANGO_SETTING_MODULE变量(在apache(?)中)都会被覆盖。 – Scalamoosh 2012-07-29 19:52:40

0

您是否使用memcached作为高速缓存,或者其他两种实例可以写入同一个高速缓存文件的其他高速缓存方法?这可以解释为什么这两种环境混合起来。在这种情况下,只需在设置'CACHES字典中添加KEY_PREFIX变量即可。

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 
     'LOCATION': '127.0.0.1:11211', 
     'KEY_PREFIX': 'scalamoosh' 
    } 
} 
+0

我目前没有在任何一个网站上设置任何缓存,所以怀疑这会解决我的问题。谢谢你的信息。 – Scalamoosh 2012-07-29 19:54:19

2

的mod_wsgi的默认配置在同一过程的不同的子解释器运行两个Django的网站。不幸的是,Django在1.4中改变了他们生成的wsgi.py,并且新的文件使用了默认的mod_wsgi行为。要解决这个问题,如果使用Django 1.4,进入wsgi.py文件,更改:

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

到:

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

也就是说,不使用os.environ.setdefault(),因为由于环境变量在子解释器之间泄漏的方式,当变量已经被另一个子解释器中的其他Django站点设置时,它将不会执行任何操作。

更好的是,使用mod_wsgi守护进程模式并为每个站点创建不同的守护进程组,并委派它们在不同的进程集中运行。这可以解决Django版本中的一个类似问题,那就是使用了不完全正确的VirtualHosts Apache配置。