【问题标题】:multiple django apps on a apache vhost where one is on root with mod_wsgiapache vhost 上的多个 django 应用程序,其中一个使用 mod_wsgi 在 root 上
【发布时间】:2016-08-09 14:14:03
【问题描述】:

类似这样: 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 别名似乎不起作用。我尝试将它们放在位置指令中,但这也不起作用。有没有办法做到这一点?


在下面格雷厄姆的回答之后,我尝试了这个:

<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 处理。我是不是配置有误?

【问题讨论】:

    标签: django apache mod-wsgi


    【解决方案1】:

    错误的顺序。使用:

    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 解释器上下文,避免一些带有 C 扩展的 Python 包没有正确实现以便与 Python 子解释器一起工作时可能出现的问题。

    【讨论】:

    • 嗯,好的。所以顺序很重要。会尝试。谢谢
    • 我已经根据这个答案更新了我的问题。你介意快速看一下,如果我犯了一个愚蠢的错误,让我知道吗?谢谢。
    猜你喜欢
    • 2012-07-15
    • 2012-03-17
    • 2012-12-20
    • 2012-08-21
    • 2012-12-19
    • 2012-04-17
    • 2019-05-16
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多