亚马逊AWS官方博客

CloudFront AWS 骨干网就近回源和特殊头处理方案

随着全球网络的不断发展,跨区域流量加速成为了许多企业的需求。然而,由于某些地区无法使用 CloudFront 的源护盾功能,例如中国用户出海用户需要访问位于香港的源站,使用 CloudFront 的源护盾无法实现最佳性能。为了解决这一问题,我们提出了一种基于 AWS 的全球流量加速方案,特殊头处理请参照文章中的第三部分。

1. 方案介绍

1.1 方案背景

本文将介绍一种通过结合使用 AWS CloudFront、Application Load Balancer (ALB)、Auto Scaling 和 Nginx 来实现全球性高性能源站加速的解决方案。

注意:本文只是提供网络方案,关于数据合规问题请参照当地政府或者组织要求。

在用户使用 IDC 作为源站使用 CloudFront 加速的场景下,一般会使用 CloudFront 的源护盾功能就近回源。但是 CloudFront 的源护盾在某些区域是无法部署的,例如中国用户出海用户有一些源站是在香港区域,这时候只能选择新加坡区域的源护盾,新加坡到香港的物理距离要大于香港 AWS Region 到香港用户 IDC 的物理距离,物理距离决定了访问的速率,在源护盾无法覆盖的区域无法达到最佳的性能,目前源护盾支持的区域如下所示:

我们利用 AWS 的骨干网和 ALB,将用户从需要加速的区域的流量经由 CloudFront 接入位于香港的 Nginx 集群,从而将流量就近代理回用户的香港 IDC。通过使用自动扩展组(ASG),我们实现了 Nginx 集群的弹性负载均衡,提高了系统的可用性和性能。

1.2 方案架构

为了解决上述问题,我们将采用以下架构,下图所示:

  • CloudFront 作为全球分布式 CDN,接收全球用户的请求。
  • Application Load Balancer (ALB) 位于香港区域,作为流量入口点。
  • Auto Scaling 自动扩展组管理一组 Nginx 服务器,用于代理源站流量。
  • 源站服务器位于企业的香港 IDC 中。

该架构的工作流程如下:

全球用户的请求首先到达 CloudFront 边缘节点,CloudFront 将请求路由到最近的 AWS 骨干网络入口点,骨干网络将请求转发到位于香港区域的 ALB,ALB 将请求分发到 Auto Scaling 组中的 Nginx 服务器,Nginx 服务器与源站服务器建立连接,代理用户请求和响应,将流量返回源站。

2. 配置步骤

2.1 配置 Nginx 服务器

在香港区域启动一台 EC2,安装 Nginx,准备 Nginx 配置文件,包括代理规则、缓存设置等。

测试 Nginx 代理功能,确保可以正确地回源 IDC。测试完毕后把 Nginx 做成 AMI 镜像,供 ASG 作为启动模板使用。

这里注意勾选无重启,在制作镜像的过程中,不会影响正在运行的 EC2 实例。

2.2 创建 Application Load Balancer (ALB)

进入 EC2 服务,选择”负载均衡器”。

创建新的 ALB,选择”面向互联网”类型,配置 ALB 的安全设置、监听器和可用区域,配置健康检查设置,创建新的目标组,通过下一步创建的 Auto Scaling 组注册机器。

2.3 创建 Auto Scaling 组

进入 EC2 服务,选择”Auto Scaling 组”。

创建新的 Auto Scaling 组,选择启动配置,配置 Nginx 服务器的实例类型,选择之前制作的 Nginx AMI 镜像,如何创建自己的镜像请参考这里。配置扩展策略和健康检查设置,将 Auto Scaling 组与之前创建的目标组相关联。

创建过程中注意选择之前 ALB 对应的目标组。

2.4 创建 CloudFront 分配

登录 AWS 管理控制台,进入 CloudFront 服务,创建新的 CloudFront 分配。

源选择香港区域的 ALB,配置其他选项,如缓存行为、日志记录等,请参考 Cloudfront 配置教程,部署分布,等待状态变为”已部署”。

这里加速方案全部部署完毕。

3. 注意事项

本方案主要作用是帮助客户多使用 AWS 骨干网在源护盾无覆盖的区域做就近回源,增加回源效率和安全性。因为引入了 Nginx 集群,所以还可以做一些特殊的处理,例如修改回源请求的 head 信息、可以增加用户的特殊头用作回源认证,或者去除 CloudFront 增加的特殊请求头等。CloudFront 里会包含一些特殊头,有些是特殊头是无法去除的(即使通过 CloudFront 的 Lambda 函数也无法获取和修改),可以参考这个官方文档的链接。有些客户的加密链接对于头有些特殊要求,不希望经过 CDN 后附加过多信息,所以期望能通过某种方式去除回源头中的一些字段。这是本方案要解决的第二个问题。

这里主要通过回源站点的 Nginx 获取请求头,并修改或者去除 http 请求中的特定头信息。

Nginx 配置文件请参考以下信息:

通过 more_clear_input_headers 删除所需头,这里示例删除的 CloudFront 添加的无法通过 Lambda@Edge 删除的特殊头。

4. 总结

通过结合使用 AWS CloudFront、ALB、Auto Scaling 和 Nginx,我们可以实现全球性高性能的源站加速解决方案。该解决方案利用 CloudFront 的全球分布式 CDN 功能,将用户请求路由到最近的 AWS 骨干网络入口点。然后,通过 ALB 和 Nginx 代理服务器,将请求转发到源站服务器,从而缩短了通过公网的回源距离,提高了访问速度和可靠性。

该解决方案具有以下优势:

  • 全球覆盖:利用 CloudFront 的全球部署,这种方案不仅适用于解决 CloudFront 源护盾无法覆盖的区域性能问题,也可以应用于其他类似的全球流量加速场景,为用户提供更好的访问体验。
  • 高可用性:采用 Auto Scaling 组管理 Nginx 实例,可以根据流量自动扩展,提高可用性和容错能力。
  • 灵活性:该架构可以轻松地集成其他 AWS 服务,如 WAF、Route 53 等,实现更丰富的功能。
  • 成本效益:与在全球部署源站服务器相比,该解决方案可以显著降低基础设施和运营成本。

总之,通过合理利用 AWS 云服务,企业可以构建出高性能、可扩展且经济实惠的全球加速解决方案,为全球用户提供卓越的访问体验。

本篇作者

王文巍

亚马逊云科技资深解决方案架构师,10 多年互联网企业研发、团队管理经验,主要专注于电商、新零售、社交媒体等领域。

杨探

亚马逊云科技解决方案架构师,负责互联网行业云端架构咨询和设计。