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

2024-04-27 00:08:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在同一个域的子目录中设置两个(或更多)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 2次。
  5. 反复刷新example.com/site1/,观察它在站点之间的循环。

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

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


Tags: topathcomhttpwsgi进程站点example
3条回答

我自己也有麻烦。我决定使用一个WSGIScriptAlias,并使用WSGI中间件将请求路由到正确的应用程序,而不是试图获得正确的Apache配置。我的代码在https://github.com/zhemao/flotilla。我没有测试过那么多,所以要小心使用,但我希望它能有帮助。

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

多明戈·伊格纳西奥的回答使我走上了正轨。我想指出一个重要的事实:这两个进程组必须在相同的虚拟主机中。(这是基于我对Ubuntu 12.04.3lts、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>

相关问题 更多 >