一个虚拟主机上的多个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>
现在,我已经validation每个网站都是单独运作的。 但是,当我尝试并行运行时,apache会将我发送到工作进程首先加载的任何一个站点。 例:
- 重新启动configuration为服务6个线程的Apache
- 加载example.com/site1/,获取正确的页面
- 加载example.com/site2/,获取正确的页面
- 重复2和3 2次。
- 重复刷新example.com/site1/,观看它从一个站点到另一个站点的循环。
实际上,对于任何给定数量的工作进程,无论WSGIScriptAlias指令是什么,它都会将发送请求的请求总数循环到先到达的那个请求中。 无论我做什么(设置WSGIProcessGroup,守护进程模式与embedded模式或指令),它都会继续出现这种行为。
如果任何人都可以指出我在这里做错了什么,这将是惊人的!
我有多个WSGI应用程序在一个Apache安装上运行,发现最简单的事情就是拥有多个进程组 – 每个应用程序都有一个进程组。
其中一个缺点是,实际上试图让一个进程运行两个(或更多)应用程序,这是因为这可能会使用更多的常驻内存,否则就无法实现。 但它保持了很好的分离,避免了麻烦。 这可能不是你的问题(这不是我的)。
(这可能不是那么糟糕,他们可能能够分享很多文本页面?这只是空闲的猜测;我没有以任何方式validation这一点,因为我的设置并不是所有的内存都不足)
以下是我的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>
多明戈·伊格纳西奥的回答让我走上了正轨。 我想指出一个关于使其工作的重要事实:两个进程组必须在同一个 VirtualHost中。 (这是基于我对Ubuntu 12.04.3 LTS,Apache 2.2.22和几个使用Python编写的WSGI应用程序的testing。)
例如,这对我不起作用,导致访问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,解决了这个问题:
<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的configuration,而是决定使用一个WSGIScriptAlias,并且让WSGI中间件将请求路由到正确的应用程序。 我的代码是在https://github.com/zhemao/flotilla 。 我没有testing过这么多,所以谨慎使用它,但我希望它有帮助。