如何在Heroku Cedar上启用gzip压缩(Python/Flask/Gunicorn)
我该如何在新的 Heroku Cedar 堆栈上启用 GZIP 压缩呢?这段话直接来自他们的网站:
因为对 Cedar 应用的请求是直接发送到应用服务器的,而不是通过像 nginx 这样的 HTTP 服务器进行代理,所以任何响应的压缩都必须在你的应用内部完成。对于 Rack 应用,可以使用 Rack::Deflater 中间件来实现。如果你有 gzipped 的静态资源,确保在你的中间件堆栈中,Rack::Deflater 在 ActionDispatch::Static 之前加载。
如果我理解得没错,我的 Python 应用代码现在需要负责对响应进行 GZIP 压缩吗?我该如何压缩我的静态资源(比如 css/js)呢?我正在使用 Flask 和 GUnicorn。
2 个回答
根据2003年发布的WSGI规范,应用程序不应该对响应进行gzip压缩,而是应该把这个工作留给服务器(通常是Apache,像CGI那样运行应用程序)。
应用程序和中间件不能对它们的输出进行任何形式的传输编码,比如分块传输或gzip压缩;因为这些编码属于实际的网络服务器或网关的工作。
但是到了2013年,很多时候应用程序就是服务器。WSGI没有预见到这一点。这就成了一个问题,正如http://www.b-list.org/weblog/2009/aug/10/wsgi/所提到的。
WSGI对与CGI兼容性的坚持也意味着,到了2009年,Python的网络开发领域仍然没有在1997年的应用程序编程模型上取得显著的进展。
你只需要一个可以对响应进行gzip压缩的wsgi中间件。可以参考一下这个链接:使用Pyramid对所有HTTP流量进行gzip压缩,或者这个链接:http://librelist.com/browser//flask/2010/6/14/gzip-compression/