一个虚拟主机上的多个mod_wsgi应用程序重定向到错误的应用程序

时间:2011-07-06 01:19:12

标签: python apache apache2 mod-wsgi 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会将我发送到工作进程首先加载的任何站点。例如:

  1. 重新启动配置为提供6个线程的apache
  2. 加载example.com/site1/,获取正确的页面
  3. 加载example.com/site2/,获取正确的页面
  4. 再重复2次和3次。
  5. 反复刷新example.com/site1/,观察它从站点到站点的循环。
  6. 实际上,对于任何给定数量的工作进程,无论WSGIScriptAlias指令如何,它都会循环显示发送请求的总数。无论我做什么(设置WSGIProcessGroup,守护进程模式与嵌入模式或指令),它都会继续表现出这种行为。

    如果有人能指出我在这里做错了什么,那就太惊人了!

4 个答案:

答案 0 :(得分:53)

我在单个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>

答案 1 :(得分:11)

多明戈·伊格纳西奥的回答让我走上正轨。我想指出一个关于使其工作的重要事实:两个流程组必须位于相同 VirtualHost中。 (这是基于我使用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,解决了这个问题:

<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>

答案 2 :(得分:1)

我自己也遇到了麻烦。我没有试图让Apache配置正确,而是决定使用单个WSGIScriptAlias并使用WSGI中间件将请求路由到正确的应用程序。我的代码位于https://github.com/zhemao/flotilla。我没有那么多测试,所以谨慎使用它,但我希望它有所帮助。

答案 3 :(得分:0)

有人知道如何让它与根目录下的应用程序之一一起工作吗?

这是我目前正在尝试的。根服务上的 app2 找到了,但我收到了一个 400 错误的请求:“浏览器(或代理)发送了一个该服务器无法理解的请求”在 app1 上。

<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.wsgi

    <Location / >
            WSGIProcessGroup app2
    </Location>