为什么我的 Web 内容的流量被路由到错误的 CloudFront 边缘站点?

上次更新时间:2019 年 10 月 29 日

我正在使用 Amazon CloudFront 来分发我的 Web 内容。但是,我的网站的流量被路由到错误的边缘站点。如何解决此问题? 

简短描述

CloudFront 根据发行版的价格类别、关联的地理定位数据库和 EDNS0-Client-Subnet 支持路由流量。由于这些因素的综合影响,您的网站查看器可能会路由到非预期的边缘站点。这可能会增加从 CloudFront 边缘站点检索对象的整体延迟。

要排查路由到非预期的边缘站点的问题,请检查以下各项:

  • 价格类别支持您预期的边缘站点。
  • DNS 解析程序支持任播路由。
  • DNS 解析程序支持 EDNS0-Client-Subnet。

解决方法

价格类别支持您预期的边缘站点

检查您的 CloudFront 发行版的价格类别中包含的边缘站点。如果要包括其他边缘站点,您可以更新发行版的价格类别

DNS 解析程序支持任播路由

如果 DNS 解析程序支持任播路由,则 DNS 解析程序使用多个边缘站点。这意味着请求者的边缘站点基于最佳延迟,这可能会导致解析程序的 IP 地址为非预期站点。

要检查 DNS 解析程序是否支持任播,请多次运行以下命令之一:

注意:在这些示例命令中,请确保使用您正在使用的 DNS 解析程序域名替换 example.com

在 Linux 或 macOS 上,请运行类似以下内容的 dig 命令:

dig +nocl TXT o-o.myaddr.l.example.com 

在 Windows 上,请运行类似以下内容的 nslookup 命令:

nslookup -type=txt o-o.myaddr.l.example.com 

如果每次运行命令时输出都包含相同的 IP 地址,则 DNS 解析程序不支持任播。如果每次运行命令时输出包含不同的 IP 地址,则 DNS 解析程序支持任播,这可解释非预期的边缘站点问题。

DNS 解析程序支持 EDNS0-Client-Subnet

要确定如何避免不正确的路由,请先通过运行以下命令之一检查 DNS 解析程序是否支持 EDNS0-Client-Subnet:

注意:在这些示例命令中,请确保使用您正在使用的 DNS 解析程序域名替换 example.com

在 Linux 或 macOS 上,请运行类似以下内容的 dig 命令:

dig +nocl TXT o-o.myaddr.l.example.com

在 Windows 上,请运行类似以下内容的 nslookup 命令:

nslookup -type=txt o-o.myaddr.l.example.com 

注意:检查 TTL 值,并确保在 TTL 到期时运行命令。否则,您可能会从递归解析程序获得缓存的响应。

如果 DNS 解析程序不支持 EDNS0-Client-Subnet,则输出类似于以下内容:

$ dig +nocl TXT o-o.myaddr.l.example.com  +short
"192.0.2.1"

在以上示例中,192.0.2.1 是使用任播的最近的 DNS 服务器 IP 地址。此 DNS 解析程序不支持 EDNS0-Client-Subnet。为避免不正确的路由,您可以执行下列操作之一:

  • 将 DNS 解析程序更改为其地理位置更靠近您网站客户端的递归 DNS 解析程序。
  • 更改为支持 EDNS0-Client-Subnet 的 DNS 解析程序。

如果 DNS 解析程序支持 EDNS0-Client-Subnet,则输出包含到 CloudFront 权威名称服务器的截断客户端子网(/24/32),与以下内容类似:

$ dig +nocl TXT o-o.myaddr.l.example.com @8.8.8.8 +short
"192.0.2.1"
"edns0-client-subnet 198.51.100.0/24"

在以上示例中,192.0.2.1 是距离最近的 DNS 解析程序的 IP 地址。此外,客户端子网范围是 198.51.100.0/24,用于响应 DNS 查询。为避免当 DNS 解析程序支持 EDNS0-Client-Subnet 时路由不正确,请确认公共地理定位数据库与向 DNS 解析程序发送查询的客户端子网范围相关联。如果 DNS 解析程序将截断版本的客户端 IP 地址发送到 CloudFront 名称服务器,则 CloudFront 将检查基于多个公共地理定位数据库的数据库。必须在地理定位数据库中正确映射 IP 地址,以便正确路由请求。

如果 DNS 解析程序支持 EDNS0-Client-Subnet,您可以先通过运行 DNS 查找命令(如 dig)来解析您的 CloudFront 别名记录,以验证流量路由到的边缘站点: 

$ dig dftex7example.cloudfront.net. +short
13.224.77.109
13.224.77.62
13.224.77.65
13.224.77.75

然后,对上一个命令返回的 IP 地址运行反向 DNS 查找:

$ dig -x 13.224.77.62 +short
server-13-224-77-62.man50.r.cloudfront.net.

在以上示例中,流量将被路由到 Manchester 边缘站点。

提示:对于其他测试,您可以使用支持 EDNS0-Client-Subnet 的公共 DNS 解析程序,例如 8.8.8.8 或 8.8.4.4。将使用边缘站点 IP 地址的查询发送到公共 DNS 解析程序。然后,检查 DNS 查询的结果,以查看 CloudFront 是否具有关于 EDNS0-Client-Subnet 的正确信息。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?