一个Apache上的两个mod_wsgi Django应用程序正试图使用​​彼此的configuration文件

我有两个不相关的mod_wsgi Django应用程序,它们需要在Apache2的一个实例中从两个虚拟主机提供。

我制作了一个虚拟主机,每个主机都有自己的目录settings.py和wsgi.py。

我一直看到的错误是:

[Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] mod_wsgi (pid=6375): Exception occurred processing WSGI script '/srv/app1/app1/wsgi.py'., referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] Traceback (most recent call last):, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] self.load_middleware(), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 39, in load_middleware, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] for middleware_path in settings.MIDDLEWARE_CLASSES:, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 184, in inner, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] self._setup(), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] self._wrapped = Settings(settings_module), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 95, in __init__, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)), referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ [Wed Jun 03 16:31:48 2015] [error] [client 1.2.3.4] ImportError: Could not import settings 'app0.settings' (Is it on sys.path?): No module named app0.settings, referer: http://app1.example.com/admin/mdtconfig/locationtoservice/ 

app0.wsgi:

 import os import sys sys.path.append('/srv/app0') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app0.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application() 

app1.wsgi:

 import sys sys.path.append('/srv/app1') import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app1.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application() 

两个应用程序如何混淆?

从app1的页面的请求是抱怨,它无法加载从app0的设置 – 为什么它甚至尝试?


更新:

我特别担心,每个wsgi.py都将DJANGO_SETTINGS_MODULE设置为它自己的设置名称 – 这是问题的原因吗?

读:

不要使用os.environ.setdefault() ,使用os.environ[]

也使用mod_wsgi的守护进程模式,而不是embedded模式。


要在更新之后添加到此,环境variables的设置通常不是问题,因为您的两个应用程序将在该进程的不同子解释器上下文中运行。 在哪里跌倒是因为你正在使用os.environ.setdefault()因为如果环境variables已经设置,这将不会执行任何操作。 该环境variables实际上是过程广泛的,意味着哪个WSGI脚本文件首先将其设置为赢。 当你使用os.environ[]时,这个问题不会发生,因为它会覆盖子解释器上下文的环境variables,并忽略从进程级别inheritance的环境variables,因此请阅读博客文章并执行解释。