【问题标题】:Serving static files with mod_wsgi and Django使用 mod_wsgi 和 Django 提供静态文件
【发布时间】:2010-10-18 10:42:57
【问题描述】:

我有一个使用 mod_python 的 django 应用程序,这是相当典型的配置,除了媒体文件由文档根目录中的(我知道,不推荐)“媒体”目录提供服务。我想测试并可能使用 mod_wsgi 进行部署,但我不知道如何创建简单的东西来提供静态文件。 mod_python 允许使用 Apache 指令,例如:

<Location '/'>
    SetHandler MyApplication.xyz.....
</Location>

<Location '/media'>
    SetHandler None
</Location>

django 文档似乎指向上面的第二个块作为对 mod_wsgi 进行类似异常的正确方法,但在我的测试中,根目录下的所有内容仍被发送到 wsgi 应用程序。有没有一种使用 mod_wsgi 设置静态媒体目录的好方法,或者由于令人信服的技术原因,我试图做的事情是故意不受支持的?欢迎提供指向完全不同方法的答案。

【问题讨论】:

    标签: python django mod-wsgi mod-python


    【解决方案1】:

    我在同一台服务器上运行了十几个 Django 站点,这是我配置媒体 URL 的方式。

    每个 VirtualHost 都有以下配置:

    Alias /media /path/to/media/
    <Directory /path/to/media>
        Include /etc/apache2/vhosts.d/media.include
    </Directory>
    

    这样我可以在一个文件中对媒体处理进行任何更改。

    然后,我的 media.include 文件如下所示:

    Order allow,deny
    Allow from all
    SetHandler None
    FileETag none
    Options FollowSymLinks
    
    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresByType image/gif "access plus 30 days"
        ExpiresByType image/jpg "access plus 30 days"
        ExpiresByType image/png "access plus 30 days"
        ExpiresByType image/jpeg "access plus 30 days"
        ExpiresByType text/css "access plus 30 days"
        ExpiresByType application/x-javascript "modification plus 2 years"
    </IfModule>
    
    <IfModule mod_headers.c>
        Header append Vary Accept-Encoding
    </IfModule>
    
    AddOutputFilterByType DEFLATE text/html text/css text/plain
    

    这对我来说效果很好,并且从YSlow 获得了 A 成绩(另请参阅Jeff Atwood on YSlow)。

    另外请注意,对于根目录,我使用以下配置:

    WSGIScriptAlias / /path/to/app.wsgi
    <Directory /path/to>
        Options +ExecCGI
        Allow from all
    </Directory>
    

    ...应该在配置文件中的别名/media 之后(因为 Apache 按顺序查看别名)

    【讨论】:

    • 对于您的根目录:这是超级安全带和大括号,但从安全 POV 来看,我会在您的 中放置一个 部分并移动您的“Allow from all " 进去。
    【解决方案2】:

    mod_wsgi 文档解释了如何设置静态文件,这些静态文件出现在挂载 WSGI 应用程序的 URL 下方。见:

    http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files

    请注意,当使用 WSGIScriptAlias 指令挂载 WSGI 应用程序时,不需要“Options +ExecCGI”。 'ExecCGI' 选项仅在使用 AddHandler 将应用程序挂载为资源时才需要。

    【讨论】:

    • 格雷厄姆·邓普顿!感谢 mod_wsgi!其实我认为最初是命令的问题,我没有使用 cgi 指令。你的模块让我做了很多事情,自从问了这个问题后,我真的养成了 mod_wsgi 的习惯。
    • 再次感谢您提供的文档。很长一段时间以来我见过的最好的文档。希望更多的人会阅读它们!!!!