AWS CloudFront 加速&聚合多个源站的最佳实践

本文结合自己工作的一个场景来简单的介绍下怎么使用AWS CloudFront 加速&聚合多个源站。

具体的场景如下,客户原先有多个网站站但是他们的域名不统一,而且这些网站CDN的加速现状也不一致(有的加了CDN有的没有加CDN或者使用了多家CDN厂商的产品)。客户希望有一种CDN解决方案做到如下的2个场景:

  1. SEO场景,通过一个统一的域名集中暴露出前面的多个不同域名的内容
  2. CDN统一管理,由多个CDN供应商迁移到一家CDN供应商来方便统一管理并且为不同的源设置不同的缓存策略。

我们假设客户先有如下的多个源站

源站名称 域名 缓存策略
自建Blog站,使用wordpress系统自建在Linux上 blog-a-company.com 缓存任意请求,其中post请求不缓存
自建官网| a-company.com 缓存静态资源(js/css/image)不缓存动态HTTP RESTFul API
电商网站(shopify托管) a-company.myshopify.com 不缓存

现在需要方便SEO,只让用户能通过a-company.com来集中访问

这个需求的实现有如下的技术前提:

  1. 首先AWS CloudFront看到的全部的来访域名都统一是a-company.com
  2. AWS CloudFront只能通过path来决定回源到具体的那个源,目前不支持按照其他的参数进行回源目标的判断。

方案实现

有2种方案来实现

方案一:按照路径进行回源

首先是讲上述的3个站添加为源站,然后按照路径来进行回源。比如当用户访问a-company.com时先看访问的URL path,如果是/office-wesite那么回源到自建的官网a-company.com,如果是/blog那么回源到自建的blog系统blog-a-company.com ,最后默认回源到a-company.myshopify.com

在具体的实现上我们可以这样设置CloudFront,首先时设置好如上3个源站 然后是为不同的源站按照path匹配不同的回源规则,这里我们除了可以设置基本的按照path规则回到具体的源外,还可以对某个回源的具体动作做精细的差异化管理。比如缓存策略、回源的HTTP/HTTPS协议策略、回源时的源请求策略等。这样可以满足我们的不同源内容的缓存需求。

这个方案也有一定的固有的局限性,具体在:

  1. 由于AWS CloudFront只能通过path来决定回源到具体的那个源,那么我们只能按照path来决定回到哪个源,不能按照请求参数,header,body等其他请求变量来进行动态回源。
  2. 各个源站必须互相协调好路径,它们的可访问path不能冲突或者重合,一般这个需要自建的源站在路径设计上做好适配,否则会有混乱。

关于AWS Cloudfornt源站设置和回源设置请看

方案二:使用lambda@edge动态动态回源

使用Cloudfront自带的边缘计算功能,当有回源请求时,我们通过在Cloudfront的边缘节点运行Nodejs/Python3脚本来实现具体的回源逻辑动态化。这是我们可以实现方案一无法实现的按照请求参数,header,body等其他请求变量来进行动态回源的功能。

关于cloudfront的边缘计算详情请看Customizing at the edge with functions

具体的架构如下: 当cloudfront需要回源的时候,我们通过处理couldfront的Origin request事件带过来的详细的请求参数来完成动态回源。

这个方案相比方案一有明显的灵活性优势。由于Cloudfront有双级缓存(),回源的次数远少于实际的用户访问次数,额外引入的边缘计算成本很低。

关于Shopify做源站的思考

Shopify其实本身有自己的CDN服务,其全部的资源都经过了Cloudflare的CDN加速而且不能自己调整,其实额外再加一层缓存的意义不是很大,除了有少量的地区覆盖更好的扩展外。但是结合SEO和品牌资源的集中管理角度,用额外的CDN也有现实意义。

加速Shopify遇到的问题

指向Shopify的域名有3种域名类型,分别为primary,alias,redirect。不同的类型的作用不一样,详情请看Changing the domain type and target

如果我们不结合primary,alias这2种域名类型的话,为shopify添加额外的CDN会产生问题。比如我有一个primary shopify站(a-company.myshopify.com),我想换用全新的品牌站(a-company.com)包装primary shopify站(a-company.myshopify.com)。那么当你访问额外的CDN加速后的a-company.com时进行某些操作(比如登陆或者访问商品)依然会跳转为a-company.myshopify.com。这样会让用户产生迷惑和安全担忧,因为浏览器地址栏发生了域名级别的变化。

一般的解决方式是:

  1. 新建一个二级域名shop.a-company.com绑定(以CNAME的方式)在shopify上
  2. a-company.com绑定(以CNAME的方式)在shopify上
  3. 设置a-company.com为alias,将shop.a-company.com设置为primary。alias指向primary
  4. 设置Cloudfront,将priamry添加为源站(shop.a-company.com),以后回源就用primary站
  5. 修改alias的CNAME指向Couldfront的Distribution domain name域名
    1. 修改alias的CNAME后,shopify会告警但是完全没有影响
    2. 继续按照Cloudfront的标准回源规则进行设置和验证即可

最后的整体实现如下:

相关推荐
假装我不帅1 小时前
asp.net framework从webform开始创建mvc项目
后端·asp.net·mvc
神仙别闹1 小时前
基于ASP.NET+SQL Server实现简单小说网站(包括PC版本和移动版本)
后端·asp.net
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
货拉拉技术2 小时前
货拉拉-实时对账系统(算盘平台)
后端
掘金酱3 小时前
✍【瓜分额外奖金】11月金石计划附加挑战赛-活动命题发布
人工智能·后端
代码之光_19803 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi3 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
颜淡慕潇4 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
尘浮生5 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea