1

在页面上:http ://code.google.com/p/modwsgi/wiki/FileWrapperExtension,Graham Dumpleton 推荐以下内容:

“但是请注意,为了获得最佳性能,静态文件应始终由 Web 服务器提供。在 mod_wsgi 的情况下,这意味着 Apache 本身而不是 mod_wsgi 或 WSGI 应用程序。”

我想预先构建大量的静态页面,然后有一个 python 程序(在 apache/mod_wsgi 3.3/python3.1 下运行,守护进程模式,不涉及 django)决定为每个用户提供哪些服务。例如,我希望 python 程序决定这个人需要“12345.html”并让它告诉 Apache,“请向这个人提供静态文件 '12345.html'”,而不是必须使用 python打开文件,读取内容,将其转换为 python 字符串,并将其作为“[输出]”返回给 mod_wsgi。

这可能吗?如果是这样,怎么做?

如果没有,最好的方法是什么?

4

1 回答 1

2

有很多方法可以做到这一点。

  1. 由 mod_xsendfile 和 Apache 实现的 X-Sendfile。
  2. 使用 mod_wsgi 守护程序模式的 Location/mod_rewrite 技巧。
  3. X-Accel-Redirect 如果也使用 nginx 作为 Apache 的前端。

阅读 (1) 和 (3) 作为更广泛使用的选项。


更新 (2) 的说明。

让 WSGI 应用程序返回带有空正文的 200 响应和带有指向同一 Apache 服务器上托管的本地资源的 URL 路径的“Location”响应标头,并且当使用守护程序模式时 mod_wsgi 将触发到该 URL 的内部重定向。

因此,如果您的 Apache 有:

Alias /generated-files/ /some/path/
<Directory /some/path>
Order allow, deny
Allow from all
</Directory>

然后在文件系统中将您的文件生成为/some/path/foo.txt,然后让“Location”响应标头的值为“/generated-files/foo.txt”,它将被提供。

请注意,“/generated-files”下的任何内容都可以公开访问。如果您不希望它是私有的,因此只能通过生成“Location”响应标头的特定请求返回,则需要添加 mod_rewrite 魔法来阻止对该 URL 的访问,但内部生成的子请求除外。从记忆中需要是这样的:

RewriteCond %{IS_SUBREQ} false
RewriteRule ^/generated-files/ - [F]
于 2012-05-27T23:56:54.827 回答