apache vhost 上的多个 django 应用程序,其中一个位于根目录 mod_wsgi

multiple django apps on a apache vhost where one is on root with mod_wsgi

类似这样: Deploying multiple django apps on Apache with mod_wsgi

我正在尝试在 mod_wsgi 上托管两个 Django 应用程序,但其中一个在 root 上。即 WSGI 指令将是

WSGIScriptAlias / <path to django wsgi file for app1>
WSGIScriptAlias /app2 <path to django wsgi file for app2>

像这样只使用 WSGIScript 别名似乎行不通。我尝试将它们放在位置指令中,但这也不起作用。有办法实现吗?


在 Graham 的下面回答之后我尝试了这个:

<VirtualHost <server ip>:80>
    ServerName site1.com    

    ##### app2 CONFIG
    WSGIDaemonProcess app2 python-path=/<path to django app2>/:/<path to virtualenv app2>/ threads=15 display-name=%{GROUP}

    WSGIProcessGroup app2

    WSGIScriptAlias /app2 /<path to app2 wsgi file>/


    ##### app1 CONFIG    
    WSGIDaemonProcess app1 python-path=/<path to django app1>/:/<path to virtualenv app1>/ threads=15 display-name=%{GROUP}

    WSGIProcessGroup app1

    WSGIScriptAlias / /<path to app1 wsgi file>
</VirtualHost>

但不幸的是,对 site1 的请求。com/app2 仍然由 Django 应用程序 app1 处理。我是不是配置有误?

顺序错误。使用:

WSGIScriptAlias /app2 <path to django wsgi file for app2>
WSGIScriptAlias / <path to django wsgi file for app1>

嵌套最深的必须在最前面,否则 '/' 将首先匹配并覆盖其他所有内容。


更新 1

补充问题后。现在使用:

<VirtualHost <server ip>:80>
    ServerName site1.com    

    ##### app2 CONFIG
    WSGIDaemonProcess app2 python-path=/<path to django app2>/:/<path to virtualenv app2>/ threads=15 display-name=%{GROUP}

    <Location /app2>
    WSGIProcessGroup app2
    </Location>

    WSGIScriptAlias /app2 /<path to app2 wsgi file>/


    ##### app1 CONFIG    
    WSGIDaemonProcess app1 python-path=/<path to django app1>/:/<path to virtualenv app1>/ threads=15 display-name=%{GROUP}

    WSGIProcessGroup app1

    WSGIScriptAlias / /<path to app1 wsgi file>
</VirtualHost>

您需要将 WSGIProcessGroup 指令的范围限定到子 URL,以便只有子 URL 的请求被委托给 mod_wsgi 守护进程组。

上面的另一种写法是:

<VirtualHost <server ip>:80>
    ServerName site1.com    

    ##### app2 CONFIG
    WSGIDaemonProcess app2 python-path=/<path to django app2>/:/<path to virtualenv app2>/ threads=15 display-name=%{GROUP}

    WSGIScriptAlias /app2 /<path to app2 wsgi file>/ process-group=app2

    ##### app1 CONFIG    
    WSGIDaemonProcess app1 python-path=/<path to django app1>/:/<path to virtualenv app1>/ threads=15 display-name=%{GROUP}

    WSGIScriptAlias / /<path to app1 wsgi file> process-group=app1
</VirtualHost>

换句话说,使用 process-group 选项 WSGIScriptAlias 来指示每个应该 运行.

当使用守护进程模式且每个进程只有一个应用程序时,还建议添加:

WSGIApplicationGroup %{GLOBAL}

这会强制 WSGI 应用程序在各自的进程中使用主要的 Python 解释器上下文,避免在某些 Python 具有 C 扩展的包未正确实现以使用 Python副翻译。