托管多个django站点的问题(设置交叉)

时间:2012-07-08 12:33:31

标签: python django apache

我最近建立了一个网络服务器,目前有几个静态页面网站和两个django项目。

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

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

[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 个答案:

答案 0 :(得分:4)

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

我稍微修改过的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()

答案 1 :(得分:3)

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站点已经设置了变量时,由于环境变量在子解释器之间泄漏的方式,它不会做任何事情。 / p>

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

答案 2 :(得分:2)

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

如果您不了解虚拟环境,请使用virtualenv和Django进行quickstart tutorial,我还建议使用Doug Hellman设计的非常好的Virtualenv Wrapper。希望这有帮助!

答案 3 :(得分:0)

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

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