我正在创建一个基于 Pyramid 框架的移动服务。因为它是移动的,所以减少带宽使用的一切都是加分项。我正在考虑压缩所有流量,甚至是动态 HTML 页面。
Pyramid 框架为此提供了什么样的钩子?或者是否有用于该任务的 WSGI 中间件?我想仍然在 Python 级别上做这件事,而不是 Nginx/Apache,所以我可以更好地统计 gzip 带来了多少好处。
首先,我应该强调您应该在 Web 服务器级别(nginx 或 apache)上执行此操作。有几个原因:
性能 - 如果您在 Python 中执行此操作,则您使用的线程之一可能正在处理请求以执行 cpu 密集型压缩。这比允许优化的 Web 服务器处理它的效率要低得多。
阻塞 - 大多数 GZip 中间件会阻塞您的响应,缓冲正文,以便它可以压缩整个响应。如果您尝试将任何响应流式传输回客户端,这是一个大问题,因为它会被中间件捕获。这实际上违反了 WSGI 规范 PEP333。
考虑到所有这些,至少在开发期间出于调试目的在 Python 中执行此操作可能是有意义的。
由于您已经在使用 Pyramid,因此您已经安装了 Paste。因此,您可以paste.gzipper.GzipMiddleware
像这样简单地将其添加到应用程序的管道中:
[filter:gzip]
use = egg:Paste#gzip
compress_level = 6
[pipeline:main]
pipeline =
gzip
app
显然,如果您不想从默认的 6 更改压缩级别,您可以简单地将 添加egg:Paste#gzip
到管道中,而不是配置过滤器并给它一个自定义名称 ( gzip
)。
您仍然可以使用 Apache 获取每个请求的压缩统计信息。我像这样创建了一个 deflate.log:
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '%a %v %{outstream}n/%{instream}n (%{ratio}n%%) "%r"' deflate
CustomLog /var/log/httpd/deflate.log deflate
现在我得到如下日志条目:
ip domain -/- (-%) "GET /wp-content/uploads/2010/03/favicon.ico HTTP/1.1"
ip domain 10995/52406 (20%) "GET /2006/07/19/ HTTP/1.0"
ip domain 1873/7891 (23%) "POST /registration/regForm HTTP/1.1"
我可以尽情分析。
以下是 WSGI 级别的几个选项: