我使用 Amazon CloudFront 来分配我的网页内容。但是,我的网站的流量被路由到错误的边缘站点。
简短描述
CloudFront 根据分配的价格等级、相关的地理位置数据库和 EDNS0-Client-Subnet 来路由流量。根据这些因素的组合,您网站的浏览者可能会被引导到意想不到的边缘站点。这可能会增加从 CloudFront 边缘站点检索对象的总体延迟。
要对路由到意外边缘站点的流量进行故障排除,请确认以下几点:
- 价格等级支持您预期的边缘站点。
- DNS 解析器支持 Anycast 路由。
- DNS 解析器支持 EDNS0-Client-Subnet。
解决方法
价格等级支持预期的边缘站点
查看 CloudFront 分配的价格等级中包含的边缘站点。要包括其他边缘站点,请更改您的价格等级。
DNS 解析器支持 Anycast 路由
如果 DNS 解析器支持 Anycast 路由,则 DNS 解析器会使用多个边缘站点。由于请求者的边缘站点基于最佳延迟,因此解析器的 IP 地址可能会出现在意想不到的站点。
要检查 DNS 解析器是否支持 Anycast,请多次运行以下命令之一。
除 Windows 之外的操作系统 (OS):
dig +nocl TXT o-o.myaddr.l.google.com
Windows:
nslookup -type=txt o-o.myaddr.l.google.com
如果每次运行命令时输出都包含相同的 IP 地址,则 DNS 解析器不支持 Anycast。如果每次运行命令时输出都包含不同的 IP 地址,则 DNS 解析器支持 Anycast。
DNS 解析器支持 EDNS0-Client-Subnet
运行以下命令之一来检查 DNS 解析器是否支持 EDNS0-Client-Subnet。
除 Windows 之外的操作系统:
dig +nocl TXT o-o.myaddr.l.google.com
Windows:
nslookup -type=txt o-o.myaddr.l.google.com
**注意:**检查 TTL 值,并确保在 TTL 到期时运行该命令。否则,可能会从递归解析器获得缓存的响应。
如果 DNS 解析器不支持 EDNS0-Client-Subnet,则输出类似于以下内容:
$ dig +nocl TXT o-o.myaddr.l.google.com +short
"192.0.2.1"
在前面的示例中,192.0.2.1 是最近使用 Anycast 的 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.google.com @8.8.8.8 +short
"192.0.2.1"
"edns0-client-subnet 198.51.100.0/24"
在前面的示例中,192.0.2.1 是距离最近的 DNS 解析器 IP 地址。用于响应 DNS 查询的客户端子网范围为 198.51.100.0/24。
即使您的 DNS 解析器支持 EDNS0-Client-Subnet,您的网站流量仍可能被错误路由。要解决此问题,请将公共地理位置数据库与向 DNS 解析器发送查询的客户端子网范围相关联。如果 DNS 解析器将客户端 IP 地址的截断版本转发到 CloudFront 域名服务器,则 CloudFront 会根据多个公共地理位置数据库检查数据库。
必须正确映射地理位置数据库中的 IP 地址,以便正确路由请求。
如果 DNS 解析器支持 eDNS0-Client-Subnet,则运行以下 DNS 查询命令以确定流量路由到的边缘站点:
$ 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 或 1.1.1.1。将带有边缘站点 IP 地址的查询发送到公有 DNS 解析器。然后,检查 DNS 查询的结果,看看 CloudFront 是否有关于您的 EDNS0-Client-Subnet 的正确信息。