获取 Google Cloud CDN 以在 404 上提供陈旧文件

Getting Google Cloud CDN to serve stale file on 404

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

每次更新前端时,我都会重建 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 CDN 来完成吗?

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

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 或过期 headers 定义。

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

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

这是我的解决方法:

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

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

一些上下文:部署后,如果 google 从其 CDN 缓存中提供旧的 index.html,用户的浏览器将请求旧的 JS 文件。如果这些 JS 文件是 re-validated 的时候,google 将看到它们现在是 404,并发送 404 响应而不是 JS 文件。上面的解决方法确保 JS 文件很可能在缓存中可用,而 index.html 更新更频繁。

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

更新 2:Google 的回应:

The expiration doc says "Cloud CDN revalidates cached objects that are older than 30 days." It doesn't say that Google won't revalidate prior to 30 days. Things fall out of cache arbitrarily quickly and max-age is just an upper bound.