使用mod_wsgi在Apache上部署多个django应用程序

Deploying multiple django apps on Apache with mod_wsgi

我想在同一个主机中部署两个不同的django应用程序:第一个应用程序对应于url/site1,第二个应用程序对应于url/site2。以下是我的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py
WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py

WSGIPythonPath /var/www/py/site1:/var/www/py/site2

<Directory"/var/www/py/site1/site1">
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

<Directory"/var/www/py/site2/site2">
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

这里还有两个应用程序的wsgi.py文件

1
2
3
4
5
6
7
8
9
10
import os
import sys

path = '/var/www/py/site1'
if path not in sys.path:
    sys.path.append(path)

os.environ.setdefault("DJANGO_SETTINGS_MODULE","site1.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

现在,这是我的问题。当我转到我的服务器时,假设http://app1.sites.gr/site1它有时加载site1,有时加载site2!!!!!当我访问http://app1.sites.gr/site2时也是如此…有时我会得到站点1的欢迎页面,有时我会得到站点2的欢迎页面!我正在按F5并获得不同的欢迎页面。前几个小时我检查了所有东西,没有发现任何奇怪的东西…

拜托,在我发疯之前告诉我有什么问题…

谢谢!


这是Django1.4生成的wsgi.py文件的问题。如果试图在同一进程中托管两个不同的django实例,即使是在单独的子解释器中,也不会起作用。

变化:

1
os.environ.setdefault("DJANGO_SETTINGS_MODULE","site1.settings")

到:

1
os.environ["DJANGO_SETTINGS_MODULE"] ="site1.settings"

或者更好的做法是仍然使用守护进程模式,并委派每个守护进程组在不同的守护进程组中运行。

也就是说,不是:

1
2
3
4
WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py
WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py

WSGIPythonPath /var/www/py/site1:/var/www/py/site2

用途:

1
2
3
4
5
WSGIDaemonProcess site1 python-path=/var/www/py/site1
WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py process-group=site1 application-group=%{GLOBAL}

WSGIDaemonProcess site2 python-path=/var/www/py/site2
WSGIScriptAlias /site2 /var/www/py/site1/site2/wsgi.py process-group=site2 application-group=%{GLOBAL}

更新

注意,现在有一篇关于这个和其他原因的博客文章。

  • http://blog.dscpl.com.au/2012/10/requests-running-in-wrong-django.html


你的应用程序在同一个端口上监听,而且似乎没有代理将它们委托给不同的端口。

您要么必须在Apache中设置虚拟主机,要么使用nginx、lighttpd或其他方法创建适当的代理。


GrahamDumpleton的回答可能是你最想读的,但是我建议你把你的两个djangos放在不同子域的根目录下,而不是放在同一个域的非根目录下,这样可以让你省下不少心。运行非根Django站点imho有很多gotchas。

祝你好运!