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

cotxawn7  于 2022-11-16  发布在  Apache
关注(0)|答案(4)|浏览(144)

我正在尝试在同一个域的子目录下设置两个(或更多)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
1.加载example.com/site1/,获取正确的页面
1.加载example.com/site2/,获取正确的页面
1.重复2和3两次以上。
1.反复刷新example.com/site1/,观察它在站点之间的循环。
实际上,对于任何给定数量的工作进程,它都会循环遍历它们的总数,将请求发送给它首先命中的任何一个进程,而不管WSGIScriptAlias指令是什么。无论我做什么(设置WSGIProcessGroup、守护程序模式还是嵌入式模式,或者指令),它都会继续表现出这种行为。
如果有人能指出我在这里做错了什么,那将是惊人的!

llycmphe

llycmphe1#

我 已经 在 一 个 Apache 安装 上 运行 了 多 个 WSGI 应用 程序 , 并 发现 最 简单 的 方法 就是 拥有 多 个 进程 组 - - 每个 应用 程序 一 个 进程 组 。
与 实际 尝试 让 一 个 进程 同时 运行 两 个 ( 或 更多 ) 应用 相比 , 这样 做 的 一 个 缺点 是 , 可能 会 占用 比 其他 方法 多 一 点 的 驻留 内存 。 但 它 可以 很 好 地 将 它们 分开 , 避免 麻烦 。 这 可能 不是 你 所 担心 的 ( 我 不是 ) 。
(It也许 也 不是 那么 糟糕 , 他们 也许 可以 共享 很多 文本 页面 ?我 还 没有 以 任何 方式 验证 这 一 点 , 因为 我 的 设置 根本 不 需要 内存 )
下面 是 我 的 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>

中 的 每 一 个

qcuzuvrc

qcuzuvrc2#

多明戈 · 伊格 纳西 奥 的 回答 让 我 走 上 了 正确 的 道路 。 我 想 指出 一 个 重要 的 事实 , 让 它 发挥 作用 :这 两 个 进程 组 必须 位于 * * 相同 的 * * 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>

格式

k3fezbri

k3fezbri3#

我自己也遇到过这样的问题。我没有尝试正确配置Apache,而是决定使用一个WSGIScriptAlias,并让WSGI中间件将请求路由到正确的应用程序。我的代码是https://github.com/zhemao/flotilla。我还没有对它进行太多测试,所以要小心使用,但我希望它能有所帮助。

fiei3ece

fiei3ece4#

有人知道如何让它与根目录下的应用程序一起工作吗?
这是我目前正在尝试的。根目录上的app2 serves find,但我得到了一个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>

相关问题