使用Pyramid Gzipping所有HTTP流量

Mik*_*maa 12 python gzip http pyramid

我正在创建一个基于Pyramid框架的移动服务.因为它是移动的,所以减少带宽使用的一切都是加分.我正在考虑gzipping所有流量,甚至动态HTML页面.

Pyramid框架为此提供了什么样的钩子?或者是否有WSGI中间件用于任务?我想在Python级别上做这个,而不是Nginx/Apache,所以我可以更好地统计gzip带来多少好处.

Mic*_*kel 24

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

  1. 性能 - 如果你在Python中执行此操作,那么您正在使用一个可以处理请求进行cpu密集压缩的线程.这比允许优化的Web服务器处理它的效率低.

  2. 阻止 - 大多数GZip中间件会阻止你的响应,缓冲身体,以便它可以压缩整个响应.如果您尝试将任何响应流回客户端,这是一个很大的问题,因为它会被中间件捕获.这实际上违反了WSGI规范PEP333.

考虑到所有这些因素,在Python中进行此操作至少在开发期间进行调试可能是有意义的.

由于您已经在使用金字塔,因此您已安装了粘贴.因此,您可以简单地将其添加paste.gzipper.GzipMiddleware到应用程序的管道中,如下所示:

[filter:gzip]
use = egg:Paste#gzip
compress_level = 6

[pipeline:main]
pipeline =
    gzip
    app
Run Code Online (Sandbox Code Playgroud)

显然,如果您不想将压缩级别从默认值6更改,您只需将egg:Paste#gzip管道添加到管道中,而不是配置过滤器并为其提供自定义名称(gzip).

  • 如果可能,ps使用RAW DEFLATE(apache的mod_deflate仅发送GZIP和GZIP).GZIP是RAW DEFLATE的不必要的包装器.它总是更大,需要额外的校验和计算. (2认同)

Kir*_*ser 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
Run Code Online (Sandbox Code Playgroud)

现在我得到如下日志条目:

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"
Run Code Online (Sandbox Code Playgroud)

我可以分析我心中的内容.