kubernetes 获取谷歌云CDN服务404上的陈旧文件

2skhul33  于 2023-02-21  发布在  Kubernetes
关注(0)|答案(4)|浏览(221)

我的前端运行在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吗?

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

vyswwuz2

vyswwuz21#

我有这个问题以及,如果你找到一种方法来设置它在谷歌CDN请让我知道。
以下是我的解决方法:
1.选择Use origin settings based on Cache-Control headers
1.由于大多数浏览器缓存静态JS资产,我将.htmlCache-Control头文件减少到合理的低水平或正常水平,比如5-60分钟,而javascript文件的缓存时间要长得多,比如一周。
一些背景:部署后,如果谷歌从CDN缓存中提供旧的index.html,用户的浏览器将请求旧的JS文件。如果是时候重新验证这些JS文件,谷歌将看到它们现在是404,并发送404响应而不是JS文件。上述解决方案确保JS文件很可能该高速缓存中可用。而index.html被更频繁地更新。

**更新:**这是可行的......但似乎有一个警告,如果该页面不是一个频繁访问的页面,谷歌最终将返回一个404的javascript文件在指定的时间之前,即使谷歌文档声明它不会得到重新验证30天,这似乎是错误的。
更新2:谷歌回应:

过期文档说“云CDN会重新验证超过30天的缓存对象。”这并不是说谷歌不会在30天前重新验证。缓存中的内容会很快消失,最大年龄只是一个上限。

wqnecbli

wqnecbli2#

你可以设置Cache-Control: max-stale=<seconds>作为你的应用程序中的响应头。这将允许陈旧的内容持续一定的秒数。如果在新的部署之后发生这种情况,这是很方便的。但是仍然设置你的html文件要么不缓存,要么像Kevin说的那样设置一个短的TTL。
来源

e5njpo68

e5njpo683#

不清楚最初的问题是否可以解决,但考虑到这是一个流行的问题,我想我应该分享一下我对 * 静态 * 资产(JS、CSS、图像等,没有任何特殊权限)的解决方案:
我让我的CI/CD使用一个桶(或“空间”在数字海洋),并上传所有的JS/CSS/等文件:

s3cmd sync -P --no-mime-magic --guess-mime-type ./build/assets/ s3://my-bucket-name/frontend/assets/

然后我有一个脚本来删除超过30天的文件:

s3cmd ls s3://my-bucket-name/frontend/assets | while read -r line;
  do
    createDate=`echo $line|awk {'print $1" "$2'}`
    createDate=`date -d"$createDate" +%s`
    olderThan=`date -d"-30d" +%s`
    if [[ $createDate -lt $olderThan ]]
      then 
        fileName=`echo $line|awk {'print $4'}`
        echo "Deleting stale $fileName"
        if [[ $fileName != "" ]]
          then
            s3cmd del "$fileName"
        fi
    fi
  done;

最后,您需要设置cdn.your-site.com以指向bucket/CDN,并更新构建流程,以便使用cdn.your-site.com访问资产(在Vite中,我使用了一个自定义的renderBuiltUrl,它检查NODE_ENV === 'production'type === 'asset')。
这整个过程意味着旧资产将保留30天,允许旧会话访问它们。桶定价极低,CDN成本相同。

cyej8jka

cyej8jka4#

serveWhileStale设置结合了重新验证时失效和出错时失效的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

相关问题