多个mod_wsgi应用在一个虚拟主机上指向错误的应用
我正在尝试在同一个域名下设置两个(或更多)Django应用程序,放在不同的子目录里,比如:
http://example.com/site1/
http://example.com/site2/
我知道通常通过设置apache的虚拟主机可以做到这一点,像这样:
<VirtualHost *:80>
...
WSGIScriptAlias /site1 /path/to/site1.wsgi
WSGIScriptAlias /site2 /path/to/site2.wsgi
</VirtualHost>
现在,我已经确认每个网站单独运行都没问题。但是当我尝试同时运行这两个网站时,apache总是把我引导到第一个加载的那个网站。例如:
- 重启apache,配置为服务6个线程
- 访问example.com/site1/,能看到正确的页面
- 访问example.com/site2/,也能看到正确的页面
- 再重复第2和第3步两次。
- 不断刷新example.com/site1/,你会发现它在两个网站之间循环。
实际上,对于任何给定数量的工作进程,它会在这些进程中循环,把请求发送到第一个命中的那个,而不管WSGIScriptAlias指令是什么。不管我怎么做(设置WSGIProcessGroup、守护进程模式还是嵌入模式,或者其他指令),它依然表现出这种行为。
如果有人能指出我哪里做错了,那就太好了!
4 个回答
我自己也遇到过这个问题。与其费劲去调整Apache的配置,不如我直接使用一个简单的WSGIScriptAlias,并通过WSGI中间件来把请求引导到正确的应用程序上。我的代码可以在这个链接找到:https://github.com/zhemao/flotilla。我还没有进行太多测试,所以使用的时候要小心,但我希望这能对你有所帮助。
Domingo Ignacio的回答让我找到了正确的方向。我想强调一个重要的事实,那就是要让它正常工作,两个进程组必须在同一个虚拟主机下。(这是我在使用Ubuntu 12.04.3 LTS、Apache 2.2.22和几个用Python写的WSGI应用程序时的测试结果。)
举个例子,这样做并没有成功,我可以访问app1,但app2却出现了404错误:
<VirtualHost *>
WSGIDaemonProcess app1 user=someuser group=somegroup threads=5
WSGIScriptAlias /app1 /app1/app1.wsgi
<Location /app1>
WSGIProcessGroup app1
</Location>
</VirtualHost>
<VirtualHost *>
WSGIDaemonProcess app2 user=someuser group=somegroup threads=5
WSGIScriptAlias /app2 /app2/app2.wsgi
<Location /app2>
WSGIProcessGroup app2
</Location>
</VirtualHost>
去掉中间的和标签,确保只有一个虚拟主机,这样就解决了问题:
<VirtualHost *>
WSGIDaemonProcess app1 user=someuser group=somegroup threads=5
WSGIScriptAlias /app1 /app1/app1.wsgi
<Location /app1>
WSGIProcessGroup app1
</Location>
WSGIDaemonProcess app2 user=someuser group=somegroup threads=5
WSGIScriptAlias /app2 /app2/app2.wsgi
<Location /app2>
WSGIProcessGroup app2
</Location>
</VirtualHost>
我在一个Apache服务器上运行了多个WSGI应用,发现最简单的方法就是为每个应用设置多个进程组。
这样做的一个缺点是,和尝试让一个进程同时运行多个应用相比,这可能会占用更多的内存。不过,这样可以让它们之间保持很好的隔离,避免麻烦。而且这对你来说可能不是个问题(对我来说就不是)。
其实也不一定会占用太多内存,它们可能能共享很多文本页面?这只是我的猜测;我并没有验证这一点,因为我的设置并没有内存不足的问题。
以下是我httpd.conf文件的一些片段,大致如下:
WSGIDaemonProcess khdx_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /khdx /home/galdosd/khdxweb/rel/khdx/apache/django.wsgi
<Location /khdx>
WSGIProcessGroup khdx_wsgi
</Location>
WSGIDaemonProcess sauron_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /sauron /home/galdosd/finalsauronweb/django-root/apache/django.wsgi
<Location /sauron>
WSGIProcessGroup sauron_wsgi
</Location>