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

时间:2014-07-26 18:04:59

标签: amazon-web-services amazon-cloudfront

我们在Elastic Load Balancer后面的两台服务器上运行了一个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.

  3. 最佳做法是什么?我们错过了什么吗?我们考虑建立一个nginx代理服务器,以便从S3 for Cloudfront压缩内容。它会是这样的:

    CloudFront - > nginx代理 - > S3

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

2 个答案:

答案 0 :(得分:1)

您可以通过CloudFront提供压缩内容。请参阅以下文档

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html

答案 1 :(得分:1)

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

Elastic Loadbalancer与www.domain.comstatic.domain.com的服务器通信,两者都是由同一组服务器运行的虚拟主机。在开始滚动升级到我们的网站之前,我们的部署脚本会上传要在static.domain.dom下提供的新静态资源。 Web服务器配置为在浏览器支持时返回gzip压缩响应。当所有Web服务器收到新文件后,我们开始滚动升级。

这可以保证在升级过程中任何服务器都可以提供旧的修订文件和新修订的文件。