使用 Pyramid 压缩所有 HTTP 流量

Posted

技术标签:

【中文标题】使用 Pyramid 压缩所有 HTTP 流量【英文标题】:Gzipping all HTTP traffic with Pyramid 【发布时间】:2011-09-30 22:20:31 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

    性能 - 如果您在 Python 中执行此操作,则您使用的线程之一可能正在处理执行 CPU 密集型压缩的请求。这比让您优化的网络服务器处理它的效率要低。

    阻塞 - 大多数 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)。

【讨论】:

附注如果可能,请使用 RAW DEFLATE(apache 的 mod_deflate 仅发送 GZIP 和 GZIP)。 GZIP 是 RAW DEFLATE 的不必要包装。它总是更大,需要额外的校验和计算。 2019 年更新请求:如今,Pyramid 应用程序将安装 paste.deploy,但不会安装 Paste 的所有其余部分。还有其他简单的方法吗?还是应该使用具有 gzip 功能的 WSGI 应用服务器(女服务员没有)? (这适用于您仅部署应用程序代码的上下文,因此不能使用 nginx) 您仍然可以安装pip install paste fwiw。【参考方案2】:

您仍然可以使用 Apache 获取每个请求的压缩统计信息。我像这样创建了一个 deflate.log:

DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '%a %v %outstreamn/%instreamn (%ration%%) "%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"

我可以尽情分析。

【讨论】:

【参考方案3】:

以下是 WSGI 级别的几个选项:

GZip Compression Egress Filter ibkon-wsgi-gzip-middleware

【讨论】:

以上是关于使用 Pyramid 压缩所有 HTTP 流量的主要内容,如果未能解决你的问题,请参考以下文章

在 Elastic Beanstalk 上部署 Pyramid 应用程序

ImportError: cannot import name ‘UnencryptedCookieSessionFactoryConfig‘ from ‘pyramid.session‘

ImportError: cannot import name ‘UnencryptedCookieSessionFactoryConfig‘ from ‘pyramid.session‘

GZIP 压缩与 BREACH/CRIME 攻击有关的 HTTPS 流量安全问题?

近期工作

偶尔禁用 Pyramid 中间件