一个虚拟主机上的多个 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>

现在,我已经验证每个站点都可以单独运行。但是当我尝试同时运行两者时,apache 将我发送到工作进程首先加载的站点。例子:

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

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

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

原文由 Gabriel Hurley 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 531
2 个回答

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

原文由 Domingo Ignacio 发布,翻译遵循 CC BY-SA 3.0 许可协议

Domingo Ignacio 的回答让我走上了正确的轨道。我想指出一个关于让它工作的重要事实:两个进程组必须在 同一个 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>

原文由 Steve Saporta 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题