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

Gab*_*ley 43 python apache mod-wsgi wsgi apache2

我正在尝试在同一域下的子目录中设置两个(或更多)Django应用程序,例如:

http://example.com/site1/
http://example.com/site2/
Run Code Online (Sandbox Code Playgroud)

我知道通常这可以通过设置这样的apache虚拟主机来正常工作:

<VirtualHost *:80>
    ...
    WSGIScriptAlias /site1 /path/to/site1.wsgi
    WSGIScriptAlias /site2 /path/to/site2.wsgi
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

现在,我已经确认每个网站都是单独运作的.但是当我尝试并排运行时,apache会将我发送到工作进程首先加载的任何站点.例:

  1. 重启apache配置为服务6个线程
  2. 加载example.com/site1/,获取正确的页面
  3. 加载example.com/site2/,获取正确的页面
  4. 重复2次和3次2次.
  5. 重复刷新example.com/site1/,观察它从站点到站点的循环.

实际上,对于任何给定数量的工作进程,无论WSGIScriptAlias指令如何,它都会循环执行将请求发送到其首先命中的总数.无论我做什么(设置WSGIProcessGroup,守护进程模式与嵌入模式或指令),它都会继续表现出这种行为.

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

Dom*_*cio 54

我在单个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>
Run Code Online (Sandbox Code Playgroud)

  • 对于生产站点,不鼓励使用最大请求,除非您确实有一个严重的内存泄漏,您无法立即修复. (3认同)
  • 可悲的是,它对我不起作用,可能是因为我的`WSGIScriptAlias`es是`/`和`/ foo`.有什么方法吗? (2认同)
  • "不要这样做":-) ...听起来你希望Apache在每次使用/ foo处理程序时都会"...匹配"某些内容,但在其他情况下使用/ handler.这不是它的工作原理.没有机制可以动态地回到Apache并说"没关系我毕竟不能处理这个请求,让其他人试试"./ handler将获得所有内容,而/ foo将永远不会有机会.也许你可以拥有/ foo和/ bar并在/ to/bar或类似的解决方案中有一些重定向.(请注意,通过执行此操作,您的重定向集充当边界的显式定义) (2认同)

Ste*_*rta 11

Domingo Ignacio的回答让我走上正轨.我想指出一个关于使其工作的重要事实:两个进程组必须位于同一个 VirtualHost中.(这是基于我使用Ubuntu 12.04.3 LTS,Apache 2.2.22和一些用Python编写的WSGI应用程序的测试.)

例如,这并没有为我工作,导致访问APP1的能力,但一个404错误APP 2:

<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>
Run Code Online (Sandbox Code Playgroud)

删除中间和标记,以便拥有一个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>
Run Code Online (Sandbox Code Playgroud)