我的前端运行在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.似乎
云CDN还有一个叫做“负缓存”的东西,however that seems to be for deciding how long a 404 is cached.
--〉在Google Cloud上临时提供旧文件的最佳方式是什么?可以使用Cloud CDN吗?
(理想情况下,不需要一些需要部署旧文件的古怪构建过程)
4条答案
按热度按时间vyswwuz21#
我有这个问题以及,如果你找到一种方法来设置它在谷歌CDN请让我知道。
以下是我的解决方法:
1.选择
Use origin settings based on Cache-Control headers
1.由于大多数浏览器缓存静态JS资产,我将
.html
的Cache-Control
头文件减少到合理的低水平或正常水平,比如5-60分钟,而javascript文件的缓存时间要长得多,比如一周。一些背景:部署后,如果谷歌从CDN缓存中提供旧的index.html,用户的浏览器将请求旧的JS文件。如果是时候重新验证这些JS文件,谷歌将看到它们现在是404,并发送404响应而不是JS文件。上述解决方案确保JS文件很可能该高速缓存中可用。而index.html被更频繁地更新。
**更新:**这是可行的......但似乎有一个警告,如果该页面不是一个频繁访问的页面,谷歌最终将返回一个404的javascript文件在指定的时间之前,即使谷歌文档声明它不会得到重新验证30天,这似乎是错误的。
更新2:谷歌回应:
过期文档说“云CDN会重新验证超过30天的缓存对象。”这并不是说谷歌不会在30天前重新验证。缓存中的内容会很快消失,最大年龄只是一个上限。
wqnecbli2#
你可以设置
Cache-Control: max-stale=<seconds>
作为你的应用程序中的响应头。这将允许陈旧的内容持续一定的秒数。如果在新的部署之后发生这种情况,这是很方便的。但是仍然设置你的html
文件要么不缓存,要么像Kevin说的那样设置一个短的TTL。来源
e5njpo683#
不清楚最初的问题是否可以解决,但考虑到这是一个流行的问题,我想我应该分享一下我对 * 静态 * 资产(JS、CSS、图像等,没有任何特殊权限)的解决方案:
我让我的CI/CD使用一个桶(或“空间”在数字海洋),并上传所有的JS/CSS/等文件:
然后我有一个脚本来删除超过30天的文件:
最后,您需要设置
cdn.your-site.com
以指向bucket/CDN,并更新构建流程,以便使用cdn.your-site.com
访问资产(在Vite中,我使用了一个自定义的renderBuiltUrl
,它检查NODE_ENV === 'production'
和type === 'asset'
)。这整个过程意味着旧资产将保留30天,允许旧会话访问它们。桶定价极低,CDN成本相同。
cyej8jka4#
serveWhileStale设置结合了重新验证时失效和出错时失效的HTTP缓存功能。
默认值、最小值和最大值如下所示:
过期内容将在超过缓存条目过期时间(由max-age、s-max-age或Expires标头定义)的指定限制内提供。
更多信息请访问:https://cloud.google.com/cdn/docs/serving-stale-content