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。
祝你好运!