【问题标题】:GAE: Enabling Edge Cache with webapp2 (Python)GAE:使用 webapp2 (Python) 启用边缘缓存
【发布时间】:2013-02-09 06:46:28
【问题描述】:

youtube 上有一段新视频展示了 EdgeCaching 在 GAE 架构中的优势,在视频的这个特定点上,他们展示了利用它是多么容易: http://www.youtube.com/watch?v=QJp6hmASstQ#t=11m12

不幸的是,这并不容易......

我希望使用 Google 提供的 webapp2 框架启用边缘缓存。

我在打电话:

self.response.pragma = 'Public'
self.response.cache_expires(300)

但它似乎被其他东西覆盖了。

我得到的标题是:

HTTP/1.1 200 OK
Pragma: Public
Cache-Control: max-age=300, no-cache
Expires: Sat, 23 Feb 2013 19:15:11 GMT
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
X-AppEngine-Estimated-CPM-US-Dollars: $0.000085
X-AppEngine-Resource-Usage: ms=39 cpu_ms=64
Date: Sat, 23 Feb 2013 19:10:11 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, must-revalidate
Vary: Accept-Encoding
Server: Google Frontend
Content-Length: 600

我正在使用 ndb 顶级:

app = ndb.toplevel(webapp2.WSGIApplication(...

我尝试了这里解释的技术,但它们似乎不适用于 webapp2: http://code.google.com/p/googleappengine/issues/detail?id=2258#c14

我也看过这篇文章: https://groups.google.com/d/topic/webapp2/NmHXoZZSVvo/discussion

我尝试手动设置所有内容,但没有成功。某些东西正在覆盖我的缓存设置。

有没有办法让它与 webapp2 一起工作?欢迎任何其他选择。

编辑:我正在使用带有版本前缀的网址:http://version.appname.appspot.com,这可能是我的问题的原因。

【问题讨论】:

  • "边缘缓存仅适用于 Google Apps 域,对 appspot.com 没有影响"See this post

标签: google-app-engine webapp2


【解决方案1】:

这应该就是你所需要的:

self.response.cache_control = 'public'
self.response.cache_control.max_age = 300

【讨论】:

  • 它在 dev_appserver 上工作,但在 appengine 上,它仍然没有缓存。这是标题:Cache-Control →max-age=300, public, no-cache, must-revalidate Content-Encoding →gzip Content-Length →600 Content-Type →application/json; charset=utf-8 Date →Mon, 25 Feb 2013 19:12:44 GMT Expires →Fri, 01 Jan 1990 00:00:00 GMT Pragma →no-cache Server →Google Frontend Vary →Accept-Encoding X-AppEngine-Estimated-CPM-US-Dollars →$0.000079 X-AppEngine-Resource-Usage →ms=215 cpu_ms=64
  • 我使用的是版本前缀:version.appname.appspot.com,这似乎是它没有启动的原因。
  • 您是否尝试注销您的管理员帐户进行测试?
【解决方案2】:

查看Caching Details 了解更多信息,可能是您违反了一些规则。接下来是最好的部分:

只有满足以下所有条件时,才能将响应存储在 Cloud CDN 缓存中:

  • 它由启用缓存的后端服务提供。
  • 这是对 GET 请求的响应。
  • 状态码为 200、203、300、301、302、307 或 410。
  • 它有一个 Cache-Control: public 指令。
  • 它有一个 Cache-Control: s-maxage、Cache-Control: max-age 或 Expires 标题。
  • 它有一个 Content-Length 标头或一个 Transfer-Encoding 标头。

此外,还有一些检查会阻止响应缓存。如果满足以下任一条件,则不会缓存响应:

  • 它有一个 Set-Cookie 标头。
  • 其主体超过 4 MB。
  • 它有一个 Vary 标头,其值不是 Accept、Accept-Encoding 或 - Origin。
  • 它有一个 Cache-Control:no-store、no-cache 或 private 指令。
  • 相应的请求有一个 Cache-Control: no-store 指令。

【讨论】:

    【解决方案3】:

    我猜你是在混淆两个相关但截然不同的想法。

    您链接到的视频所谈到的第一个想法是安排在您的应用中使用专门提供静态内容的 App Engine 服务器池来提供某些文件。这比让您的应用提供这些文件要快,因为启动应用的新实例以提供静态文件不会有延迟。 (强烈考虑以这种方式提供您的 .js 和 .css。)此静态服务工具完全在应用更新(上传)时通过您在 app.yaml(或 Java 应用的 appengine-web.xml)中所做的声明进行控制。

    第二个想法是通过 HTTP 响应标头安排您的应用发出的页面可被应用引擎外部的缓存缓存。

    如果您将文件声明为静态文件,您可以对随文件一起提供的附加 HTTP 响应标头进行一些控制。请参阅documentation on configuring static files

    【讨论】:

    • 链接未指向视频中的正确时间,我已对其进行了编辑。感谢您指出。 video我在看第二个想法,使用http响应头。
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多