【问题标题】:Synchronizing changes after deploying to S3 using cloudfront使用 cloudfront 部署到 S3 后同步更改
【发布时间】:2015-04-03 02:41:34
【问题描述】:

如果我使用具有 S3 源的 cloudfront 来服务具有两个文件的网站。让我们说 index.html 和 app.js。现在,如果我对 html 文件和 app.js 进行更改,例如删除一些函数并添加一些新函数。现在 cloudfront 的工作方式是文件有一个我认为是 24 小时的到期日期。因此,一旦 24 小时结束,那么对 cloudfront 的请求将检查 s3 存储桶以查看文件是否已更改。如果两个文件同时过期,这很好,但如果 html 文件在 javascript 文件后 4 小时过期怎么办?

这意味着旧的 HTML 文件可能正在调用旧 javascript 文件中存在的函数。然而,新的 Javascript 文件正在被提供,它不再具有此功能。这将导致错误。

为了解决这个问题,您可以为这两个文件发送一个失效请求,当这完成时,新的内容将被提供。无效请求可能需要一些时间,我个人认为完成请求需要 10-15 分钟。因此,如果我将编辑后的文件(html、js)推送到我的 S3 源并发送无效请求,则需要 15 分钟才能完成。然后就在我发送无效请求之后,js 文件过期并且新的 JS 文件与旧的 HTML 文件一起被拉出......我的网站可能会在大约 15 分钟内抛出错误?

如果我从我的服务器提供我的 html 并且只是从 cloudfront/S3 中提取 js 会怎样?我是否必须将本地服务器上的 html 更改与云端成功的失效请求完全同步?

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-cloudfront


    【解决方案1】:

    失效需要时间并且不是原子的。纽约的某个人可能会看到新文件,而悉尼的某个人正在使用旧/缓存的文件。

    有几个选项:

    缓存时间短

    将每个对象的缓存时间设置为相当短的时间,例如 10 秒。在许多方面,这消除了缓存的优势。

    使用 Cache-Control 标头对您有利。

    Here's the spec 和 here's a good walkthrough。您可以利用几件事。以下是一些示例:

    cache-control: no-cache
    cache-control: must-revalidate, s-maxage=10, max-age=600
    

    重新设计管道

    最终,当版本很重要时,最好的方法是使用唯一的文件名。例如,您可能会加载styles-1.css,然后下一个版本的 html(或代码生成 html)将请求 styles-2.css。这就是Rails Asset Pipeline 对config.assets.digest 所做的事情。许多其他框架也有同样的东西——Grails 有资产管道。 Django 有 Django Compressor 或 Django Pipeline。节点可以做到这一点via Grunt(可能有另一种方式)。 ASP/.NET 有Cassette 或Combres(都称之为“版本控制”)。

    最后一个选项是最好的。这意味着您的缓存文件可以有很长的生命周期。我的一个项目默认缓存时间为一年。

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2017-07-30
      • 1970-01-01
      • 2017-04-19
      • 2011-10-05
      • 1970-01-01
      • 2014-06-10
      • 2017-06-24
      • 1970-01-01
      相关资源
      最近更新 更多