我如何将一个目录别名到我的文件系统,并将其子目录别名为Apache中的WSGI文件?

时间:2009-11-10 16:49:03

标签: django apache apache-config

我正在使用nginx作为apache / mod_wsgi和Django的反向代理。目前一切都正常工作/别名我的wsgi文件和/ media别名我的媒体目录。但是,我想设置它以便/ media / foo / bar 别名我的wsgi文件,这样/media/foo/example.txt将使用apache提供example.txt,但是/ media / foo / bar / example.txt将传递给我在Django中的urls.py。

我已经尝试将另一个WSGIScriptAlias添加到我的alias for / media /上面的apache.conf中,但是/media/foo/bar/example.txt仍然由apache提供服务。我的apache.conf目前看起来像这样:

<VirtualHost *:8080>
    #DocumentRoot /var/www/mydomain.com/public
    ServerName mydomain.com
    ErrorLog /var/www/mydomain.com/logs/apache_error_log
    CustomLog /var/www/mydomain.com/logs/apache_access_log common

    WSGIScriptAlias /media/foo/bar /var/www/mydomain.com/src/myproject/server/django.wsgi
    Alias /media/ /var/www/mydomain.com/public/media/
    <Directory /var/www/mydomain.com/public/media>
        Order deny,allow
        Allow from all
    </Directory>

    WSGIScriptAlias / /var/www/mydomain.com/src/myproject/server/django.wsgi

    <Directory /var/www/mydomain.com/src/myproject/server>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

2 个答案:

答案 0 :(得分:3)

由于Alias和WSGIScriptAlias具有不同的优先级,因此您无法创建超过2级的多级重叠URL,这些URL在使用它们之间交替。解决方案是对所有子URL使用Alias / AliasMatch指令,这样就可以在相同的优先级下评估它们。人们仍然可以将WSGIScriptAlias用于站点的根目录。

因此,请尝试按顺序使用以下命令,以便大多数嵌套URL模式早于外部URL。

<VirtualHost *:8080>
#DocumentRoot /var/www/mydomain.com/public
ServerName mydomain.com
ErrorLog /var/www/mydomain.com/logs/apache_error_log
CustomLog /var/www/mydomain.com/logs/apache_access_log common

AliasMatch ^/(media/foo/bar/.*) /var/www/mydomain.com/src/myproject/server/django.wsgi/$1
Alias /media/ /var/www/mydomain.com/public/media/
WSGIScriptAlias / /var/www/mydomain.com/src/myproject/server/django.wsgi

<Directory /var/www/mydomain.com/src/myproject/server>
    Options ExecCGI
    AddHandler wsgi-script .wsgi
    # WSGIApplicationGroup %{GLOBAL}
    Order allow,deny
    Allow from all
</Directory>

<Directory /var/www/mydomain.com/public/media>
    Order deny,allow
    Allow from all
</Directory>
</VirtualHost>

AliasMatch用于最嵌套,因为我们需要调整SCRIPT_NAME的值,即挂载点,由Django应用程序看到,因此请求似乎仍然适用于在root上挂载的Django实例。如果不这样做,urls.py模式将无法按预期的那样运行。在使用$ 1的脚本路径后,使用AliasMatch并将匹配的子模式添加到RHS。

虽然Django通过两个不同的指令挂载,但计算的SCRIPT_NAME应该对两者都相同,因此应该使用相同的Python子解释器。如果由于某种原因你认为你的内存使用量是你期望的两倍,即两个Django实例在不同的子解释器中运行,你可以通过取消注释上面的WSGIApplicationGroup指令来强制它们在同一个程序中运行。这不应该是必需的,如果认为你确实需要它,最好转到mod_wsgi邮件列表,并可以指导你如何验证是否应该这样做以及出了什么问题。

答案 1 :(得分:1)

快速破解是在你的Apache配置中将mod_wsgi移到mod_alias之前,但这实际上会导致你的Django应用程序正在处理/ media。

如果AliasMatch支持超前正则表达式,您应该能够这样做:

AliasMatch / media /(?!foo)...

这应该避免这个问题 - 我说,我很想推荐从其他主机名(media.example.org)提供媒体服务,因为并行性可以带来一些不错的客户端性能优势并简化服务器优化问题。