我们正在运行一个Rails 5.1站点,该站点利用Asset Pipeline在部署时生成散列(指纹)资产。为了优化性能,我们的资产是从服务器生成的,然后在首次请求时缓存到AWS Cloudfront。
部署时,我们会进行滚动部署。我们使用新代码启动新服务器,并使用旧代码终止服务器,因为新代码已联机。在部署期间的任何给定时间,如果请求进入资产,则任何服务器(新旧服务器)都可以回答该请求,因为它们都在同一AWS Application Load Balancer上。
例如,我们有两个资产文件:
如果admin-aac83de85860.js的请求进入,并且旧服务器接收请求,则它将找不到资产,返回400然后该响应缓存。这意味着即使新服务器拥有该文件,所有将来对admin-aac83de85860.js的请求都将返回400。
我们如何在AWS Cloudfront中缓存两组资产,或者只将新资产的直接流量添加到添加到池中的新服务器?
答案 0 :(得分:0)
我能够通过将资产部署到S3来解决此问题。运行rails assets:precompile
之后,将public/assets
和public/packs
复制到S3中。然后,您可以将您的cloudfront源设置为放置资产的s3存储桶。
进行滚动部署时,admin-2d1d6c00a49c.js
和admin-aac83de85860.js
都可以在CDN上访问。