我一直在试图研究如何使用Apache VirtualHosts进行多个Python / Django部署。
我遇到的问题似乎很直接,
ImportError: Could not import settings 'hub.settings' (Is it on sys.path?): No module named hub.settings, referer: proposals.internal.local
我遇到的麻烦是,proposal.internal.local使用的是proposal.settings,而hub.settings实际上来自hub.internal.local。
如果我自己运行提案或集线器,我不会遇到上述问题,但是,当我运行它们 – 当人们使用它们。 sys.path似乎更新了两个项目。
[APACHE CONFIGS – HUB]
<VirtualHost *:80> ServerName hub.internal.local DocumentRoot /var/www/hub.internal.local/hub/hub/static Alias /static/ /var/www/hub.internal.local/hub/hub/static/ <Directory /var/www/hub.internal.local/hub/hub/static> Allow from all </Directory> WSGIScriptAlias / /var/www/hub.internal.local/hub/hub/wsgi.py </VirtualHost>
[APACHE CONFIGS – build议]
<VirtualHost *:80> ServerName proposals.internal.local DocumentRoot /var/www/proposals.internal.local/proposal/proposal/static Alias /static/ /var/www/proposals.internal.local/proposal/proposal/static/ <Directory /var/www/proposals.internal.local/proposal/proposal/static> Allow from all </Directory> WSGIScriptAlias / /var/www/proposals.internal.local/proposal/proposal/wsgi.py </VirtualHost>
[wsgi.py – HUB]
import os import sys os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hub.settings") sys.path.append('/var/www/hub.internal.local') sys.path.append('/var/www/hub.internal.local/hub') from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
[wsgi.py – 提案]
import os import sys os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proposal.settings") sys.path.append('/var/www/proposals.internal.local') sys.path.append('/var/www/proposals.internal.local/proposal') from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
显然我错过了一些东西,但是我没有看到文档中的任何exception。
不要使用os.environ.setdefault() 。 当Django切换到设置环境variables的方式时,Django在一个mod_wsgi进程中搞砸了多个应用程序的托pipe。
这在我的博客中有logging: 请求在Apache / mod_wsgi下运行在错误的Django实例中。
如果这是原因,有两种解决scheme。 最快的方法是使用setdefault()来replaceWSGI脚本文件中的环境variables。
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'另外一个涉及更多工作但可以带来其他好处的方法是切换到使用mod_wsgi的守护进程模式来运行Django实例,并将其分别委托给一组独立的进程。 通过在单独的进程中运行Django实例,环境variables不可能从一个泄露到另一个。
WSGIDaemonProcess project-2 WSGIScriptAlias /suburl /some/path/project-2/wsgi.py process-group=project-2 WSGIDaemonProcess project-1 WSGIScriptAlias / /some/path/project-1/wsgi.py process-group=project-1