使用mod_wsgi和Django提供静态文件服务

10

我有一个使用mod_python的Django应用程序,配置相当典型,但媒体文件是通过文档根目录中的“媒体”目录提供服务的(我知道,不推荐)。我想使用mod_wsgi进行测试和部署,但我无法弄清楚如何创建简单的静态文件服务器。mod_python允许使用Apache指令,例如:

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

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

看起来Django文档指出上面的第二个块是在mod_wsgi中创建相似异常的正确方法,但在我的测试中,根目录下方的所有内容仍然被发送到wsgi应用程序。有没有一种好的方法使用mod_wsgi设置静态媒体目录,或者因为强制技术原因而有意不支持我正在尝试做的事情?欢迎提供指向完全不同方法的答案。

2个回答

18

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

每个虚拟主机都有以下配置:

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关于YSlow的文章)。
另外请注意,对于根目录,我使用以下配置:
WSGIScriptAlias / /path/to/app.wsgi
<Directory /path/to>
    Options +ExecCGI
    Allow from all
</Directory>

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


对于您的根目录:这是非常保险的,但从安全的角度来看,我建议在您的<Directory>中放置一个<Files wsgi.py>部分,并将您的“Allow from all”移动到那里。 - Cheekysoft

13

Graham Dumpleton!感谢您的mod_wsgi!实际上,我认为最初的问题是顺序问题,我没有使用cgi指令。自从提出这个问题以来,您的模块使我能够做很多事情,我真的养成了使用mod_wsgi的习惯。 - unmounted
1
非常感谢提供文档。 这是我长时间以来看到的最好的文档。希望更多的人能够阅读它们!!! - htmldrum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接