【问题标题】:Getting Google Cloud CDN to serve stale file on 404让 Google Cloud CDN 在 404 上提供陈旧文件
【发布时间】:2021-07-23 07:11:14
【问题描述】:

我的前端在 nginx 上运行,我正在提供一堆由 react 构建的 .chunk.js 文件。

每次更新前端时,我都会重建 docker 映像并更新 kubernetes 部署。但是,一些用户可能仍在尝试获取旧的 js 文件。

我希望喜欢 Google Cloud CDN 提供旧文件的过时缓存版本,但似乎 it will only serve stale content in the event of errors or the server being unreachable, not a 404.

Cloud CDN 还有一种叫做“负缓存”的东西,however that seems to be for deciding how long a 404 is cached.

--> 在 Google Cloud 上临时提供旧文件的最佳方式是什么?这可以通过 Cloud CDN 完成吗?

(理想情况下,不需要一些需要部署旧文件的时髦构建过程)

【问题讨论】:

  • 为什么要临时提供旧文件?也许重新考虑您的部署?
  • CDN 不会永远缓存对象。从缓存中刷新对象后,您的策略将不起作用...
  • @MartinZeitler 如果用户加载旧的 index.html,它会尝试加载旧的 js 文件(这有点必要,并且创建 react 应用程序故意在名称中包含文件的哈希以防止js文件的混合版本)。尤其是在延迟加载的情况下,用户可能至少有几秒钟甚至几分钟都不会加载脚本。
  • @JohnHanley 我的目标不是永远缓存它们,只是一段合理的时间(谷歌最多可以缓存一周,我认为甚至不需要 1 天)。我可以通过返回 500 而不是 404 来达到相同的效果(Google 会认为存在服务器错误并返回它已缓存长达一周的陈旧文件)但是用 500 替换 404 的状态似乎......非常不好的做法。
  • 嘿@DemiPixel 你找到解决方案了吗?我也有这个问题,新部署导致旧 JS 文件哈希 # 请求的 404 响应,这是部署后约一个小时的问题。

标签: nginx kubernetes google-cloud-platform google-cloud-cdn


【解决方案1】:

我也有这个问题,如果你找到了在 Google CDN 上设置的方法,请告诉我。

这是我的解决方法:

  1. 选择Use origin settings based on Cache-Control headers

  2. 由于大多数浏览器缓存静态 JS 资产,我将 .htmlCache-Control 标头减少到相当低或正常,例如 5-60 分钟,而 javascript 文件的缓存时间更长,例如一周。

一些背景:部署后,如果谷歌从其CDN缓存中提供旧的index.html,用户的浏览器将请求旧的JS文件。如果是时候重新验证这些 JS 文件,谷歌会看到它们现在是 404,并发送 404 响应而不是 JS 文件。上述解决方法确保 JS 文件极有可能在缓存中可用,而 index.html 更新更频繁。

更新:这行得通...但似乎有一个警告,如果该页面不是经常被访问的页面,谷歌最终会在指定时间之前在 javascript 文件上返回 404 .尽管google docs 声明它不会在 30 天内重新验证,但这似乎是错误的。

更新 2:Google 的回应:

过期文档显示“Cloud CDN 会重新验证超过 30 天的缓存对象”。它并不是说 Google 不会在 30 天之前重新验证。事情很快就会从缓存中掉出来,而 max-age 只是一个上限。

【讨论】:

  • 这真的有效吗?我仍然遇到问题——据我了解,Google 实际上偶尔会验证页面没有更改。在获取 JS 文件几次后,它会看到它已更改(变为 404)并更新缓存。
  • @DemiPixel 经过一些测试,我相应地更新了答案。
  • 我暂时将其标记为正确 - 遗憾的是,这并不能解决延迟加载的问题,但 Google 似乎没有内置任何东西来“正确”处理这个问题。似乎您需要创建某种自定义解决方案(例如,以前几个版本的主机文件或类似的东西)。
  • @DemiPixel 我对此也不满意,这对我的高流量页面有帮助,但对其他页面没有帮助。我会在下个月或 2 个月的某个时候询问谷歌支持(我还没有注册他们的支持服务),看看我是否能得到更好的答案。我会回来更新这个
  • 我已经切换到服务 500 而不是 404。似乎它随机给出 500,然后在正确的缓存响应之后给出 200?但是如果我用 curl 打它,它总是返回 500。非常奇怪的行为。
【解决方案2】:

serveWhileStale 设置结合了 stale-while-revalidate 和 stale-if-error HTTP 缓存功能。

默认值、最小值和最大值如下:

Default: 86,400 seconds (one day)
Minimum: 0 seconds (disables the feature)
Maximum: 604,800 seconds (one week)

在缓存条目过期时间之后的指定限制内​​提供陈旧内容,该时间由 max-age、s-max-age 或 Expires 标头定义。

查看更多信息:https://cloud.google.com/cdn/docs/serving-stale-content

【讨论】:

  • 确实,我设置了serveWhileStale: 86400。但是 404 不被视为服务器错误,当它重新验证时,它只会意识到存在 404 并开始为 404 服务!有没有办法将serveWhileStale 用于404s?
  • 您检查过缓存模式:cloud.google.com/cdn/docs/caching#cache-modes 吗?也许 FORCE_CACHE_ALL
  • 我相信我之前使用过该设置 - 主要控制 what 被缓存,但是一旦它因任何原因重新验证,它就会看到它是 404 并且缓存 404。
猜你喜欢
  • 2020-05-05
  • 2020-12-02
  • 2011-03-23
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
相关资源
最近更新 更多