一个虚拟主机上的多个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会将我发送到工作进程首先加载的任何一个站点。 例:

  1. 重新启动configuration为服务6个线程的Apache
  2. 加载example.com/site1/,获取正确的页面
  3. 加载example.com/site2/,获取正确的页面
  4. 重复2和3 2次。
  5. 重复刷新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过这么多,所以谨慎使用它,但我希望它有帮助。