用mod_wsgi在Apache上部署多个django应用程序
我想在同一主机上部署两个不同的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并获得不同的欢迎页面。我已经检查一切为了先前小时,并没有发现什么异样......
请告诉我,我发疯之前可能是什么问题...
谢谢!
这与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
注意,有关于这个问题和其他原因,整个博客文章了。
您的应用程序在同一个端口上侦听,并且似乎没有代理将它们委派给不同的端口。
你要么必须设置VirtualHosts阿帕奇范围内或使用Nginx的,lighttpd的或别的东西来创建正确的代理服务器
我不能通过不同的url委托给正确的脚本(site1 vs site2)吗?我不想使用不同的端口或配置代理!我只想在同一个apache主机上运行两个django应用程序 - 我已在其他地方看到这是可能的:( – Serafeim 2012-07-16 13:58:27
是的,这就是虚拟主机的用途,readthedocs – 2012-07-16 13:59:29
所以,我应该运行我的两个站点在不同的端口上使用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
格雷厄姆邓普尔顿的回应是,你可能想读最接近的一个,但我会建议在不同的子域的根托管你的两个Django的自己节省了大量灼热的,而不是在在同一个域上的非根位置。有很多陷阱运行非根Django网站恕我直言。
祝你好运!
那么,经过大约8个月(不是重)的生产使用后,有四个不同的网站(/ site1,/ site2,site3和site4),所有内容工作真的很棒(是的,即使是SESSION_COOKIE_NAME设置的会话)!唯一要记住的就是永远不要使用绝对的URL,而只能通过revels和{%url%} - 所有这些都是django-DRY-way :) – Serafeim 2013-02-20 21:02:10
这实际上工作,谢谢!但是现在我又遇到了另一个问题:当我尝试在同一个浏览器中访问这两个站点时,它有时会从site2注销我(当我访问site1时) - 但不是相反......这是因为我有/ site1和/ site2?我应该尝试一下Erik提出的建议并拥有site1.sites.gr和site2.sites.gr吗? – Serafeim 2012-07-17 07:28:39
您需要为每个网站设置不同的SESSION_COOKIE_NAME或SESSION_COOKIE_PATH,因为它们位于同一个域中。请参阅http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango – 2012-07-18 03:31:58