谷歌现在由于对移动设备不友好而受到惩罚。因此,为了让事情变得更好,它建议我使用 Gzip 或 Deflate 压缩我的大量 Javascript。我看过一些关于堆栈溢出的旧建议,但没有开箱即用的东西,我尝试搜索附加组件,但到目前为止似乎还没有任何东西可以解决问题。压缩或启用 gzip 最不痛苦且最可靠的是什么?
Google 建议我这样做:
启用压缩 使用 gzip 或 deflate 压缩资源可以减少通过网络发送的字节数。 为以下资源启用压缩以将其传输大小减少 420KiB(减少 74%)。
如果 Django 更容易的话,我正在使用 Django。
最佳答案
底线在前 - 这将取决于您的应用程序的详细信息...Flask? Django ? uWSGI? whitenoise
和 gunicorn
似乎是 Heroku 上的“转到”框架,所以这就是我在下面的示例中使用的框架。它应该转化为其他框架。
说明 - Google 建议的要点是尽量减少从服务器物理传输的字节数。有几种方法可以做到这一点,但在影响最大的方法中,排名不分先后 -
- 精简 JavaScript 和 CSS
- 将这些文件合并在一起
- 操纵缓存行为
- 压缩 HTTP 响应体
引用的建议涉及最后一点,重要的是要理解压缩响应主体是 HTTP 规范中“内容协商”的一部分——浏览器不仅通过 URL 请求特定资源;它还提供有关该资源的首选表示的提示,例如,内容类型、编码方式、是否可以在多个“ block ”中发送等。
因此,理想情况下,处理 HTTP 的应用程序层应该处理此特定任务。在典型的应用程序堆栈中,这意味着像 Apache 或 nginx 这样的网络服务器,其中网络服务器将代理对特定动态路径的请求到您的网络框架,并直接处理“静态”内容。
然而,在 Heroku 中,HTTP 层在平台本身和您的应用程序之间分离 - “路由网格”充当反向代理,处理基本的 HTTP 和 HTTPS 并通过注入(inject)带有代理信息的 header 来增强请求,例如;其他一切都取决于您的应用程序。但是,您的“应用程序”受到相当大的限制,因为您没有自由安装 nginx 等的权利。
大多数 web 框架(Django、Flask、Rails、Play! 等等)都是高度通用的,可以与外部 web 服务器(推荐用于生产)一起工作,也可以独立工作,提供自己的,通常轻量级 Web 服务器(推荐用于开发)。这些框架还与“容器”配对得很好,“容器”既为应用程序提供运行时环境,又为 HTTP 层提供繁重的工作(uWSGI、Gunicorn、Rack 等)
这是 Heroku 的选择。尽管我对 uWSGI 的经验最多,但下面的示例是针对 Flask + Gunicorn + WhiteNoise(在 Python 中为 Heroku 提供静态文件的首选库)。请注意,WhiteNoise 也适用于 Django,因此如果 Django 是您选择的框架,调整它应该是微不足道的。因此,所有这些说明都可以通过两个非常简单的步骤开始:
- 将
whitenoise
添加到您的requirements.txt
- 修改 WSGI 应用程序,让 WhiteNoise“包装”您的应用程序。
例如:
from flask import Flask
from whitenoise import WhiteNoise
flapp = Flask(__name__)
#use a subdirectory for root, otherwise, the actual .py files can be served...
app = WhiteNoise(flap, root='./static/')
#define your routes:
@flapp.route('/')
def home_page():
#etc. etc.
如果客户端发送“Accept-Encoding: gzip” header ,这将为您提供 gzip 压缩的内容。还有很多很多其他的杠杆和旋钮可以拉动和调整,但这是一个起点。最终,您会担心 CPU 开销并希望预压缩文件;或者您可能决定卸载静态文件是可行的方法。
为了验证,使用像 cURL 这样的工具来抓取一个静态文件:
curl -i -H "Accept-Encoding: gzip" http://yourapp.herokuapp.com/path/to/static
-i
标志应该打印出 header ,它将向您显示有关如何处理请求的详细信息。注意`内容编码
HTTP/1.1 200 OK
Connection: keep-alive
Server: gunicorn/19.3.0
Date: Wed, 20 May 2015 15:33:35 GMT
Last-Modified: Wed, 20 May 2015 15:26:06 GMT
Content-Type: text/html; charset="utf-8"
Cache-Control: public, max-age=60
Access-Control-Allow-Origin: *
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 662
Via: 1.1 vegur
希望这有助于...
关于python - 使用 python 在 Heroku 上启用压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30290766/