2012-07-16 117 views
20

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

 
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文件这两个应用程序

 
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 ... Sometiems时,我得到site1的欢迎页面,有时我会得到site2的欢迎页面!我打F5并获得不同的欢迎页面。我已经检查一切为了先前小时,并没有发现什么异样......

请告诉我,我发疯之前可能是什么问题...

谢谢!

回答

41

这与Django的1.4生成的wsgi.py文件有问题。在尝试在同一个进程中托管两个不同的Django实例的情况下,即使在单独的子解释器中,它也不起作用。

变化:

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

到:

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

或者更好的使用守护进程模式,并委托各在不同的守护进程运行组。

也就是说,代替:

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 

使用:

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} 

UPDATE

注意,有关于这个问题和其他原因,整个博客文章了。

+2

这实际上工作,谢谢!但是现在我又遇到了另一个问题:当我尝试在同一个浏览器中访问这两个站点时,它有时会从site2注销我(当我访问site1时) - 但不是相反......这是因为我有/ site1和/ site2?我应该尝试一下Erik提出的建议并拥有site1.sites.gr和site2.sites.gr吗? – Serafeim 2012-07-17 07:28:39

+3

您需要为每个网站设置不同的SESSION_COOKIE_NAME或SESSION_COOKIE_PATH,因为它们位于同一个域中。请参阅http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango – 2012-07-18 03:31:58

2

您的应用程序在同一个端口上侦听,并且似乎没有代理将它们委派给不同的端口。

你要么必须设置VirtualHosts阿帕奇范围内或使用Nginx的,lighttpd的或别的东西来创建正确的代理服务器

+0

我不能通过不同的url委托给正确的脚本(site1 vs site2)吗?我不想使用不同的端口或配置代理!我只想在同一个apache主机上运行两个django应用程序 - 我已在其他地方看到这是可能的:( – Serafeim 2012-07-16 13:58:27

+3

是的,这就是虚拟主机的用途,readthedocs – 2012-07-16 13:59:29

+0

所以,我应该运行我的两个站点在不同的端口上使用gunicorn然后只是添加下面的“ProxyPass/site1 http://127.0.0.1:8111/ ProxyPassReverse/site1 http://127.0.0.1:8111/”为我的httpd.conf上的两个站点?? – Serafeim 2012-07-16 15:09:58

1

格雷厄姆邓普尔顿的回应是,你可能想读最接近的一个,但我会建议在不同的子域的根托管你的两个Django的自己节省了大量灼热的,而不是在在同一个域上的非根位置。有很多陷阱运行非根Django网站恕我直言。

祝你好运!

+2

那么,经过大约8个月(不是重)的生产使用后,有四个不同的网站(/ site1,/ site2,site3和site4),所有内容工作真的很棒(是的,即使是SESSION_COOKIE_NAME设置的会话)!唯一要记住的就是永远不要使用绝对的URL,而只能通过revels和{%url%} - 所有这些都是django-DRY-way :) – Serafeim 2013-02-20 21:02:10

相关问题