DNS解析CNAME和A记录混用会不会导致CDN回源路径绕弯
DNS解析里CNAME和A记录混用,会不会让CDN回源路径绕弯
这个问题实际排查中经常遇到,尤其是站点接了CDN以后,DNS控制台里还能看到一堆A记录、CNAME记录、备用线路记录,访问慢了就开始怀疑:是不是DNS解析写乱了,导致CDN回源跑远了。
先把结论放在前面:普通访问链路里,用户侧DNS解析主要决定“用户访问哪个CDN节点”,不直接决定“CDN节点怎么回源”。CDN回源路径通常由CDN平台里的源站配置决定,比如源站IP、源站域名、回源Host、回源协议、回源端口、回源区域策略。
但这不代表DNS混用完全没影响。混用如果发生在同一个主机名上,或者源站域名又指回了CDN域名,就会出现绕路、回环、部分用户绕过CDN、缓存命中异常这些问题。实际故障里,最麻烦的不是“CNAME和A记录同时存在”这句话本身,而是它们出现在了不该出现的位置。
先分清两段路径:用户到CDN,CDN到源站
访问一个接入CDN的站点,链路可以拆成两段:
用户浏览器 → DNS解析 → CDN边缘节点 → CDN回源 → 源站服务器
用户访问www.example.com,如果DNS里配置的是CNAME到CDN厂商分配的域名,比如www.example.com CNAME www.example.com.cdnprovider.net,那么递归DNS最终拿到的是CDN边缘节点IP。这个阶段影响的是用户会不会被调度到北京、上海、广州、香港、洛杉矶这些边缘节点,跟CDN从哪里回源不是同一个动作。
CDN边缘节点拿到用户请求以后,如果缓存命中,就直接返回;如果未命中,才会按CDN控制台里配置的源站去拉资源。这个源站可以是A记录指向的IP,也可以是一个源站域名。
所以,单纯在业务域名上使用CNAME接入CDN,不会让CDN回源路径绕弯。真正要看的是CDN控制台里的“源站地址”写了什么。
同一个主机名下,CNAME和A记录本来就不应该共存
按DNS规范,同一个Name如果存在CNAME记录,就不应该再同时存在A、AAAA、MX等其他记录。比如下面这种写法是不规范的:
www.example.com CNAME xxx.cdnprovider.net
www.example.com A 1.2.3.4
有些DNS服务商控制台会直接禁止;有些会允许保存但解析行为不稳定;还有些是线路解析里看起来“混用”,比如电信返回CNAME,海外返回A。实际使用中发现,这类配置最容易造成“部分用户走CDN,部分用户直连源站”。
这不叫CDN回源绕弯,而是用户请求根本没有全部进入CDN。表现通常是:
同一个URL,有的地区Response Header里有CDN标识,有的地区没有。
源站日志里突然出现大量真实用户IP,而不是CDN回源IP段。
DDoS或CC攻击时,源站带宽和连接数被直接打满,CDN侧流量却不高。
HTTPS证书在某些地区报错,因为直接命中了源站IP或旧证书。
排查时可以直接用dig指定不同递归DNS看结果:
dig www.example.com @114.114.114.114
dig www.example.com @223.5.5.5
dig www.example.com @8.8.8.8
dig www.example.com @1.1.1.1
如果有的返回CNAME链,有的直接返回源站A记录,就说明解析层已经分流了。
CNAME链变长,会影响回源吗
CNAME链变长影响的是DNS解析耗时,不是CDN回源链路本身。
比如:
www.example.com CNAME a.example.cdn.net
a.example.cdn.net CNAME b.dispatch.cdn.net
b.dispatch.cdn.net A 203.0.113.10
用户侧递归DNS要多追几次CNAME,理论上会多一点解析时间。实际在缓存生效后,这个影响通常很小,可能是几毫秒到十几毫秒级别。除非CNAME链跨了多个权威DNS、TTL很短、权威DNS本身不稳定,否则不会变成明显的访问慢。
但要注意,CNAME链最终解析出来的是CDN节点IP,用户请求还是到CDN边缘。CDN边缘怎么回源,仍然看CDN后台源站配置。
这里补充一点:有些CDN厂商内部会用多级CNAME做调度,比如按运营商、地区、IPv4/IPv6、业务类型分发。看到两三层CNAME不一定是异常,反而可能是正常调度逻辑。
真正容易让回源绕弯的,是源站域名配置错了
CDN后台配置源站时,常见有两种写法:
源站IP:直接填1.2.3.4。
源站域名:填origin.example.com。
如果填源站IP,DNS混用对回源路径影响很小,因为CDN直接连这个IP。
如果填源站域名,就要看origin.example.com解析到哪里。这里出问题的概率比较高。
源站域名又CNAME回CDN
例如:
用户访问:www.example.com → CNAME到CDN
CDN源站:origin.example.com
DNS里:origin.example.com CNAME www.example.com
这种配置很危险。CDN回源时解析origin.example.com,结果又解析到了CDN节点。轻则回源失败,重则出现CDN节点之间互相请求,形成类似回环的链路。有些CDN会检测到Host或源站指向自身后直接报错,有些会表现为502、504、回源超时。
实际使用中发现,这类问题经常出现在迁移CDN、切换DNS服务商、把旧域名当源站域名复用的时候。看控制台配置时觉得“域名都能访问”,但从链路上看已经把源站域名写成了加速域名。
源站域名解析到了海外或异地IP
还有一种不是回环,但确实会绕路。
比如业务主访问在国内,CDN边缘节点在华东,源站域名origin.example.com因为GeoDNS配置,给海外递归DNS返回了美国IP。某些CDN回源节点使用的递归DNS或出口位置被识别成海外,结果华东CDN节点回源跑到美国,再从美国拉数据回来。
这种场景下,用户到CDN很快,CDN到源站很慢。表现是:
静态资源命中缓存时很快,刷新缓存后首包时间明显变长。
CDN日志里回源耗时从几十毫秒变成几百毫秒,甚至1秒以上。
源站访问日志里看到的回源IP来自非预期区域。
举个实际排查里常见的数据:
华东CDN节点回源宁波源站,TCP建连一般10ms到30ms比较常见;如果被解析到美国洛杉矶源站,单程RTT可能150ms到220ms,TLS握手、回源请求、首包等待叠加后,用户看到的TTFB很容易上到500ms以上。
源站域名走了智能解析,但CDN回源不按用户地区来
很多人会把“智能DNS”理解成万能调度:用户在广东就返回广东IP,用户在北京就返回北京IP。问题是,CDN回源时发起DNS查询的不是终端用户,而是CDN节点或CDN内部递归DNS。
所以源站域名做智能解析时,判断对象变成了CDN的回源网络,不是用户网络。这个差异会导致源站选择不符合预期。
比如源站域名配置:
电信 → 宁波源站
联通 → 北京源站
移动 → 广州源站
海外 → 美国源站
如果CDN回源递归DNS出口被识别成海外,哪怕用户在上海,也可能回到美国源站。这个问题表面看像CDN调度差,实际是源站域名解析策略没按CDN回源模型设计。
根域名接CDN时,A记录和CNAME看起来混用是另一回事
根域名example.com不能按标准DNS直接配置CNAME,因为根域名通常还要挂NS、SOA、MX等记录。很多DNS服务商会提供ALIAS、ANAME、CNAME Flattening这类能力。
控制台里看起来像把根域名指向了CDN CNAME,实际权威DNS对外返回的是合成后的A记录。用户dig example.com时看到一组A记录,这不一定代表绕过CDN,可能只是DNS服务商把CDN目标域名解析结果摊平后返回。
这种情况下要判断是不是走CDN,不能只看“返回的是A还是CNAME”,要看A记录是不是CDN节点IP、HTTP响应头有没有CDN标识、CDN日志里有没有请求。
多说一句,根域名接CDN时最怕的是一半用Flattening到CDN,一半线路直接A到源站。比如国内线路走CDN,海外线路直连源站。短期看像是“海外访问更直”,长期看缓存、防护、证书、访问日志都会变乱。
排查时按链路看,不要只盯DNS控制台截图
实际处理这类问题,直接看DNS控制台很容易误判。控制台里写了CNAME,不代表用户一定拿到CNAME;控制台里看到A,也不代表一定绕过CDN。要从解析结果、CDN日志、源站日志三处对。
看用户侧解析结果
从不同网络查业务域名:
国内电信、联通、移动各查一次。
海外递归DNS查一次。
如果有IPv6,还要查AAAA记录。
重点看最终IP属于CDN还是源站。IP归属可以用whois、CDN厂商IP段文档、或者直接看HTTP响应头。
看CDN是否收到请求
如果用户说访问慢,但CDN访问日志没有对应请求,说明请求可能没进CDN。这个时候别急着调缓存规则,先查DNS分流、Local DNS缓存、hosts污染、HTTPDNS、客户端内置IP。
如果CDN日志有请求,但回源耗时高,就继续看源站配置、回源协议、源站解析、源站网络。
看源站日志里的来源IP
源站日志如果大量出现真实用户IP,通常说明部分流量绕过CDN。
源站日志如果只看到CDN回源IP,但回源IP来自非预期区域,就要查CDN回源节点和源站域名解析结果。
有些业务会在源站Nginx里只允许CDN IP段访问,这个做法能快速暴露绕过CDN的问题。比如某地区用户突然403,说明那个地区可能被解析到了源站A记录,但源站拒绝了非CDN来源。
常见配置放在一起看会更清楚
业务域名www.example.com CNAME到CDN,源站origin.example.com A到真实源站IP:这是常见且清晰的配置。
业务域名www.example.com 同时存在CNAME和A:不推荐,容易造成部分流量走CDN、部分流量直连。
源站origin.example.com CNAME到www.example.com:高风险,可能回环。
源站origin.example.com 使用GeoDNS返回不同区域源站:可以用,但要确认CDN回源解析视角,不要按终端用户视角设计。
根域名example.com 使用CNAME Flattening到CDN:可以,关键看最终A是否为CDN节点,不要和源站A混在线路解析里。
CDN回源慢,更多时候是源站网络和防护策略问题
DNS配置没错,但回源还是慢,这种也不少。CDN边缘节点到源站之间走的是公网链路,源站线路质量会直接影响回源。
比如源站是普通海外VPS,国内CDN节点回源美国,线路如果走普通国际出口,晚高峰丢包和抖动很明显。换成CN2、GIA、精品网线路,回源稳定性会好很多。对游戏更新包、图片站、下载站来说,首包和大文件回源差别很明显。
如果你也在找这种能做源站、回源链路相对稳的云服务器,可以看看129云。比如美国精品网-E型是16C、16G DDR4 ECC、200G SSD、175Mbps峰值带宽,三网精品线路,适合海外源站、跨境业务、CDN回源节点在国内但源站放美国的场景。小型站点或测试环境可以看美国精品网-A型,2C、2G、60G SSD、25Mbps峰值带宽,成本压力低一些。
如果业务更怕攻击,比如游戏接口、活动页、下载分发入口,源站不建议裸奔。宁波高防-特惠这种8C、16G、100G U.2、30Mbps上行、100Gbps防御的机器,更适合放在国内做高防源站或防护入口。需要确认线路、带宽和防护策略时,可以直接联系129云客服,热线400-9177118。
源站域名应该怎么写才不容易出问题
业务域名和源站域名分开
业务域名用于用户访问,比如www.example.com,只负责接CDN。
源站域名用于CDN回源,比如origin.example.com,只解析到真实源站,不对外宣传,不再接同一个CDN加速域名。
这两个域名不要互相CNAME。尤其不要把origin指向www。
源站域名尽量用稳定A记录
源站数量少时,origin.example.com直接A到源站IP最清楚。多源站场景可以配置多个A,或者在CDN平台里配置主备源、权重源,而不是把复杂调度都塞到DNS里。
如果一定要用源站域名做智能解析,要让CDN厂商确认回源DNS的解析视角。部分CDN支持按区域回源、分省回源、主备回源,比自己在DNS里猜CDN出口更可靠。
不要让源站暴露在业务解析里
很多站点接CDN后还保留旧A记录,理由是“万一CDN挂了可以切回去”。这个想法能理解,但不建议把备用A记录和CNAME混在同一个业务域名下。
更稳的做法是保留独立备用域名,或者在DNS服务商里准备好切换方案,但平时不要对外返回源站IP。源站IP一旦被扫到,DDoS、CC、撞库请求都有可能绕过CDN防护。
TTL和缓存也会让排查变得像“绕弯”
DNS改完以后,不同递归DNS的缓存释放时间不一样。你把A删了改成CNAME,不代表所有用户立刻生效。TTL设置为600秒,也不代表一定10分钟全球清干净,有些Local DNS会强行缓存更久。
实际切换CDN前,通常会先把TTL降到300秒或600秒,等一段时间后再切CNAME。切完以后用多地探测确认解析结果,再观察CDN日志和源站日志。
如果迁移当天发现有少量请求还在打源站,不一定是配置仍然错,可能是递归DNS缓存、客户端DNS缓存、App内置HTTPDNS、运营商Local DNS老缓存。这个时候要看比例和持续时间,如果几个小时后仍然大量存在,就需要继续查线路解析。
判断“绕弯”时看这几个指标最直接
CDN日志里的回源IP、回源状态码、回源耗时,比猜DNS更有效。
源站服务器上可以抓包看CDN回源IP来自哪里:
tcpdump -nn host CDN回源IP and port 80
也可以在Nginx日志里增加$request_time、$upstream_response_time、$http_x_forwarded_for、$remote_addr这些字段。看一段时间后,能很快分清是用户到CDN慢,还是CDN回源慢。
如果CDN回源耗时稳定在20ms到50ms,用户访问却慢,问题多半在用户到CDN调度、客户端网络、HTTPS握手、资源加载瀑布图。
如果CDN回源耗时经常300ms、800ms甚至超时,缓存未命中时慢,问题就集中在源站网络、源站性能、源站DNS解析、跨境链路、源站限速、防火墙策略。
一个容易忽略的坑:回源Host和源站解析不是一回事
CDN里通常有“源站地址”和“回源Host”两个配置。
源站地址决定CDN连哪里,比如1.2.3.4或origin.example.com。
回源Host决定HTTP请求头里的Host是什么,比如www.example.com。
有些人看到回源Host写www.example.com,就以为CDN会解析www.example.com回源。多数情况下不是这样。CDN会连接源站地址,但HTTP Host带www.example.com,方便源站Nginx匹配虚拟主机。
正确示例:
源站地址:origin.example.com,解析到真实源站IP。
回源Host:www.example.com,用于源站站点配置。
错误示例:
源站地址:www.example.com,而www.example.com本身CNAME到CDN。
后一种就容易把CDN回源引回CDN自己。
实际配置里比较稳的写法
www.example.com:CNAME到CDN提供的加速域名。
origin.example.com:A记录到源站公网IP,只给CDN回源使用。
源站防火墙:只放行CDN回源IP段和运维IP。
CDN源站地址:origin.example.com或源站IP。
CDN回源Host:www.example.com。
DNS线路解析:不要让www在某些线路返回源站A,除非明确就是要绕过CDN。
证书:CDN侧部署用户访问证书,源站侧按回源协议部署对应证书。如果CDN到源站走HTTPS,源站证书要能匹配回源Host。
这样配置后,CNAME负责用户接入CDN,A记录负责CDN找到源站,两者职责分开,不会因为“看起来混用了CNAME和A”就导致回源路径乱跑。