代码之家  ›  专栏  ›  技术社区  ›  Josh Ourisman

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

  •  0
  • Josh Ourisman  · 技术社区  · 15 年前

    我使用nginx作为apache/mod wsgi和django的反向代理。当前,使用/aliasing my wsgi file和/media aliasing my media directory,一切都正常。但是,我想设置它以便/media/foo/bar 为我的wsgi文件命名,这样/media/foo/example.txt将与apache一起提供example.txt,但是/media/foo/bar/example.txt将被传递到django中的urls.py。

    我尝试在我的/media/别名上方的apache.conf中添加另一个wsgiscriptaalias,但是/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 回复  |  直到 15 年前
        1
  •  3
  •   Graham Dumpleton    15 年前

    由于alias和wsgiscriptaalias处于不同的优先级级别,因此不能创建多个级别重叠的URL集,两个级别之间交替使用。解决方案是对所有子URL使用alias/aliasmatch指令,这样就可以在相同的优先级别对它们进行评估。对于站点的根目录,仍然可以使用wsgiscriptaalias。

    因此,尝试在指令中使用以下命令,以便大多数嵌套的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>
    

    别名匹配用于最嵌套的,因为我们需要调整脚本名称的值,即Django应用程序看到的mount point,以便请求看起来仍然是针对安装在根目录上的Django实例。如果不这样做,urls.py模式将不会像您对该子URL期望的那样工作。使用aliasmatch,并在脚本路径使用$1之后将匹配的子模式添加到rhs中,可以实现这一点。

    虽然Django是通过两个不同的指令安装的,但是计算出的脚本名称对于这两个指令都应该是相同的,因此应该使用相同的python子解释器。如果出于某种原因,您认为内存使用是预期的两倍,即在不同的子解释程序中运行的两个Django实例,则可以通过取消对上述wsgiapplicationGroup指令的注释来强制它们在同一个实例中运行。但这不应该是必需的,如果你认为你确实需要它,最好去mod wsgi邮件列表,并可以指导你如何验证是否应该这样做以及什么是错误的。

        2
  •  1
  •   Chris Adams    15 年前

    快速黑客将把mod wsgi移到apache配置中的mod_别名之前,但这实际上会导致django应用程序处理/media。

    如果aliasmatch支持lookahead regexps,则应该能够执行以下操作:

    别名匹配/媒体/(?啊!!!

    这样可以避免这个问题——也就是说,我建议您从另一个主机名提供媒体服务( media.example.org )由于并行性和简化了服务器优化问题,因此这会带来一些不错的客户机性能优势。