GAE上的缓存和GZip(社区Wiki)

Ala*_* H. 15 google-app-engine caching gzip

为什么Google App Engine似乎没有在我的CSS样式表和JavaScript文件中设置适当的缓存友好标题(如远期到期日期)?GAE何时gzip这些文件?我app.yaml将各自的目录标记为static_dirs,因此缺乏远期到期日期对我来说有点令人惊讶.

这是一个社区维基,用于展示有关GAE上静态文件缓存和gzipping的最佳实践!

Ala*_* H. 15

GAE如何处理缓存?

似乎GAE设置了近期缓存到期时间,但确实使用了etag标头.这是用来使浏览器可以问,"有这个文件,因为当它有一个改变etagX68f0o?",听到"不-  304 Not Modified"回响应.

与远期到期日相反,这有以下权衡:

  • 您的最终用户将获得您资源的最新副本,即使它们具有相同的名称(与远期到期不同).这很好.
  • 但是,您的最终用户仍然需要请求检查该文件的状态.这确实会降低您的网站速度,并且在内容未更改时"纯粹开销".这不太理想.

选择远期缓存过期而不是(仅) etag

要使用远期的到期日期,需要两个步骤并进行一些理解.

  1. 您必须手动更新您的应用程序以请求新版本的资源,例如命名文件mysitesstyles.2011-02-11T0411.css而不是mysitestyles.css.有一些工具可以帮助自动化,但我不知道任何与GAE直接相关的工具.

  2. 配置GAE以使用default_expiration和/或expirationin 设置所需的到期时间app.yaml.关于静态文件的GAE文档

第三种选择:申请清单

缓存清单是HTML5功能,可覆盖缓存标头.MDN文章,DiveIntoHTML5,W3C.但是,这不仅影响脚本和样式文件的缓存.小心使用!

GAE gzip什么时候开?

根据Google的常见问题解答,

Google App Engine会尽力为支持它的浏览器提供gzip压缩内容.利用这种方案是自动的,不需要修改应用程序.

我们使用请求标头(Accept-Encoding,User-Agent)和响应标头(Content-Type)的组合来确定最终用户是否可以利用gzip压缩内容.这种方法避免了流行浏览器中带有gzip压缩内容的一些众所周知的错误.要强制提供gzip压缩内容,客户端可以提供"gzip"作为Accept-Encoding和User-Agent请求标头的值.如果不存在Accept-Encoding标头,则永远不会对内容进行gzip压缩.

这将在运行时环境文档(Java | Python)中进一步介绍.

一些现实世界的观察确实证明了这一点通常是正确的.假设一个支持gzip的浏览器:

  • GAE gzips实际页面(如果他们有合适的content-type标题text/html; charset=utf-8)
  • GAE在static_dirs(定义app.yaml)中gzips脚本和样式.
  • 请注意,您不应期望GAE gzip图像像GIF或JPEG,因为它们已经被压缩.

  • 您可以在app.yaml中设置静态处理程序的到期日期,请参阅http://code.google.com/appengine/docs/python/config/appconfig.html#Static_File_Handlers (4认同)