通过滚动更新从 CloudFront 提供修订文件

the*_*met 5 amazon-web-services amazon-cloudfront

我们有一个 Web 应用程序在弹性负载均衡器后面的两台服务器上运行。我们每天多次部署它的新版本。每次发布新版本时,我们都会使用不同的 JS 和 CSS 文件名来避免缓存问题。例如,在一个版本中我们有 app-v1.js,而在下一个版本中我们有 app-v2.js。

我们希望使用 CloudFront 以 gzip 格式提供这些资源(前提是浏览器提供了适当的 Accept-Encoding 标头)。

我们探索了两种操作模式:

  1. 具有 S3 起源的 Cloudfront:似乎没有此功能(无论对象是否压缩,都不会提供基于标头的压缩版本)。

  2. 具有自定义源的 Cloudfront:无法应对滚动更新:当我们部署到服务器 A 时,我们的 HTML 中将会引用 app-v2.js。由于它尚未缓存在 CloudFront 中,CloudFront 将从我们的服务器请求它,并且可能会访问尚未收到更新的服务器,从而提供 404。

最好的做法是什么?我们是否遗漏了什么?我们考虑建立一个 nginx 代理服务器,以便它可以为 Cloudfront 压缩来自 S3 的内容。它会是这样的:

CloudFront --> nginx 代理 --> S3

我们可以做到这一点,但希望我们可以避免维护这一部分。有什么建议吗?

the*_*met 2

这是我最终实施的解决方案:

Elastic Loadbalancer 与我们位于www.domain.com和的服务器进行通信static.domain.com,两者都是由同一组服务计算机运行的虚拟主机。在开始滚动升级我们的网站之前,我们的部署脚本会上传要在static.domain.dom. 如果浏览器支持,网络服务器配置为返回 gzip 压缩响应。当所有网络服务器收到新文件后,我们开始滚动升级。

这保证了升级期间任何服务器都可以提供旧修订文件和新修订文件。