使用Pyramid对所有HTTP流量进行Gzip压缩

12

我正在使用Pyramid框架创建一个移动服务。由于是移动设备,减少带宽使用量非常重要。我正在考虑压缩所有的流量,甚至是动态HTML页面。

Pyramid框架为此提供了什么样的钩子?或者有没有WSGI中间件可以完成这个任务?我想在Python层面上完成这个任务,而不是使用Nginx / Apache,这样我可以更好地统计gzip带来的收益。

3个回答

24

首先我应该强调,你应该在Web服务器级别(nginx或apache)上执行此操作。原因有以下几点:

  1. 性能 - 如果您在Python中执行此操作,则使用了一个本来可以处理请求的线程来执行CPU密集型压缩操作。这比允许经过优化的Web服务器处理要低效得多。

  2. 阻塞 - 大多数GZip中间件将阻止响应,缓冲正文以便可以压缩整个响应。如果您尝试向客户端流式传输任何响应,那么这是一个巨大的问题,因为它会被中间件卡住。实际上,这违反了PEP333,即WSGI规范。

基于以上所有内容,至少在开发期间进行调试时,在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)。


2
请尽可能使用RAW DEFLATE(apache的mod_deflate发送GZIP并且仅发送GZIP)。 GZIP是RAW DEFLATE的不必要包装器。 它始终较大并需要额外的校验和计算。 - David Murdoch
2019年更新请求:现在,Pyramid应用程序将安装paste.deploy,但不会安装Paste的所有其他部分。是否有另一种简单的方法?或者应该使用具有gzip功能的WSGI应用程序服务器(waitress没有)?(这适用于仅部署应用程序代码的情况,因此无法使用nginx) - merwok
你仍然可以安装 pip install paste,顺便说一下。 - Michael Merickel

5
您仍然可以通过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"

我能够尽情分析的内容。

1

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