网站海外访问速度慢怎么办?DNS解析、CDN与服务器线路优化

服务器明明跑在带宽充足、配置不差的机器上,国内用户打开页面却要好几秒;换成海外同事访问,速度又快得飞起。这种"只有国内慢"的现象,几乎都出在跨境链路上:DNS 解析要绕到境外、TCP 握手要跨洋往返好几次、每个静态资源都要跨洋拉取一遍。更麻烦的是,这类问题往往不是单一原因,DNS、TCP、TLS、静态资源、源站线路五个环节各自贡献一部分耗时。本文按"用户敲下回车到页面渲染完成"的时间顺序,逐段拆解耗时来源,给出对应的检测方法与优化手段。

一、先测量:把耗时拆成五段

优化的前提是知道时间花在哪。最实用的工具是 curl 的分段计时,它能把一次 HTTPS 请求拆成若干个可归因的阶段。

1.1 curl 分段计时

curl -o /dev/null -s -w 'DNS:%{time_namelookup} TCP:%{time_connect} TLS:%{time_appconnect} TTFB:%{time_starttransfer} TOTAL:%{time_total}\n' https://example.com/

各字段含义与责任归属:

字段含义耗时大时的责任环节
time_namelookupDNS 解析完成时间DNS 服务商、解析线路、TTL 设置
time_connectTCP 三次握手完成时间跨境链路质量、防火墙、距离
time_appconnectTLS 握手完成时间加密套件、证书链、RTT 放大效应
time_starttransfer收到第一个字节(TTFB)服务器处理、数据库、应用逻辑
time_total全部传输完成内容体积、带宽、传输效率

用减法得到各段净耗时:TLS - time_connect 是 TLS 握手耗时;time_starttransfer - time_appconnect 是服务器处理耗时;time_total - time_starttransfer 是内容传输耗时。先算出哪一段最大,再针对性优化,不要一上来就换机房。

1.2 网络层基线

# 延迟与抖动基线,100 个包
ping -c 100 -i 0.2 203.0.113.10

# 逐跳定位延迟与丢包
mtr --report --report-cycles 100 203.0.113.10

# 机房对 ICMP 限速时用 TCP 模式
mtr -T -P 443 --report --report-cycles 100 203.0.113.10

关注 mdev(抖动)与丢包率。mdev 超过 avg 的 15% 说明链路不稳,丢包超过 1% 就该重视。

二、第一段优化:DNS 解析

DNS 是很多海外站点被忽略的耗时大户。如果权威 DNS 在境外,国内用户每次解析都要跨洋查询,首次访问可能要多花几百毫秒,且 TTL 过期后重复发生。

2.1 检测 DNS 解析耗时与结果

# 查看解析结果
dig +short example.com

# 指定公共 DNS 查询,对比不同 DNS 的响应
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com

# 查看完整解析过程与耗时
dig example.com

# 查询指定记录类型
nslookup -type=AAAA example.com
nslookup -type=MX example.com

# 追踪完整解析链路
dig +trace example.com

用 dig 输出中的 Query time 可以横向对比不同 DNS 服务的响应速度。dig +trace 则能看到从根服务器到权威服务器的完整查询链条,用于排查某个层级的响应缓慢。

2.2 DNS 优化手段

  • 使用支持分区域解析的 DNS 服务:让国内用户解析到离他们更近的节点或优化线路入口,海外用户解析到源站或就近节点
  • 合理设置 TTL:TTL 太短会增加解析频率,太长则变更生效慢。稳定业务可设 300-3600 秒,变更前再临时调低
  • 减少解析依赖:页面引用的第三方域名越多,DNS 查询次数越多。合并域名、减少外链能有效降低首屏时间
  • 考虑 HTTPDNS 或 DoH:移动端 App 场景下可绕过运营商 Local DNS 的污染与劫持问题
  • 启用 CAA 与 DNSSEC 时评估开销:安全性提升的同时会增加查询与验证成本

三、第二段优化:CDN 分发

对海外站点而言,CDN 通常是投入产出比最高的一项优化。它的核心价值是把静态资源(图片、CSS、JS、字体、视频切片)缓存到离用户更近的节点,让绝大多数请求不必跨洋。

3.1 为什么 CDN 对跨境场景特别有效

跨境访问慢的本质是"每个请求都要跨洋往返"。一个典型网页有几十个资源请求,如果都要到源站取,光是 TCP + TLS 握手的往返就要叠加几十次 RTT。CDN 之后:

  • 静态资源在边缘节点命中,用户与节点之间只有几十毫秒
  • 连接复用(HTTP/2 多路复用)进一步减少握手次数
  • 源站只需处理动态请求与回源,带宽与连接压力大幅下降

3.2 静态资源优化要点

  1. 拆分动静:静态资源走独立域名并接入 CDN,动态接口保持回源
  2. 设置合理缓存头:带版本号的静态资源用长 Cache-Control(如 max-age=31536000),HTML 页面用短缓存或 no-cache
  3. 启用压缩:Brotli 或 Gzip 压缩文本类资源,体积通常可下降 60%-80%
  4. 图片格式升级:WebP / AVIF 相比 JPEG/PNG 有显著体积优势,配合响应式尺寸
  5. 开启 HTTP/2 或 HTTP/3:多路复用减少连接数;HTTP/3 基于 QUIC,在高丢包跨洋链路上表现更好
  6. 资源合并与懒加载:减少首屏请求数,非关键资源延后加载
  7. 预热与刷新策略:大促前预热热点资源,发布后及时刷新变更内容

3.3 验证 CDN 是否命中

# 查看响应头中的缓存状态
curl -I https://cdn.example.com/app.js

# 关注这些头
# cache-control: max-age=31536000
# x-cache: HIT / MISS
# age: 表示该资源在节点上已缓存的秒数
# via / server / cf-ray 等字段可判断经由的 CDN 节点

首次访问通常是 MISS(需要回源),第二次应为 HIT。若持续 MISS,检查缓存规则、是否带了 Set-Cookie、URL 是否带有随机参数(如时间戳)导致无法命中。

四、第三段优化:服务器线路

CDN 解决静态资源,动态请求和回源流量仍要走源站线路。这一段的质量由机房位置、线路类型、运营商接入共同决定。

4.1 机房位置决定延迟量级

以下为常见机房到中国大陆的 RTT 经验区间,仅为参考值,实际随线路类型、运营商、时段大幅波动,请以自身实测为准:

机房地区RTT 参考区间适用业务
香港30-60ms国内用户为主的动态业务
新加坡40-80ms东南亚 + 国内兼顾
日本60-100ms国内东部用户、对稳定性要求高的业务
美国西海岸150-200ms欧美用户为主、国内访问为辅
欧洲200-300ms欧洲业务、后台服务

需要强调:物理距离带来的延迟无法通过任何软件手段消除。光在光纤中每毫秒约传播 200 公里,跨洋往返的物理下限决定了美西到国内不可能低于 100ms 量级。所以对国内用户为主的业务,选香港/新加坡/日本才是根本解法。

4.2 线路类型决定稳定性

同样的机房,走不同线路体验差异巨大。跨境链路中常见的影响因素:

  • 是否绕路:本可直达却绕道第三地,延迟凭空翻倍
  • 走哪张骨干网:国内访问境外常见经由 163 骨干网(其节点 IP 常以 202.97. 开头)或 CN2 网络(节点 IP 常以 59.43. 开头)。后者在晚高峰的拥塞程度通常更轻,但具体产品形态(如 CN2 GT 与 CN2 GIA)在覆盖方向和路径完整性上有差异,GT 通常只在部分路径或单向走优化网络,GIA 则双向全程走优化网络
  • 国际出口拥塞:国内时间 20:00-23:00 是跨境访问高峰,出口排队会导致延迟与丢包同步上升
  • 是否 BGP 多线:机房若同时接入多家运营商,不同运营商用户可各走本网,避免跨网互联点拥塞

4.3 路由检测方法

# 看路径是否绕路
traceroute -n -T -p 443 203.0.113.10

# 逐跳延迟与丢包
mtr -T -P 443 --report --report-cycles 100 203.0.113.10

# 回程测试:登录服务器反向追踪到国内
mtr -n --report --report-cycles 100 1.2.4.8

去程和回程都要测。很多线路去程很快但回程走普通骨干,晚高峰照样卡。判断绕路时逐跳核对 IP 归属地,出现地理上不合理的中转节点即为绕路。

五、第四段优化:协议与应用层

即使线路不变,通过减少往返次数也能显著改善体感。

5.1 减少 RTT 次数

  • 启用 HTTP/2 / HTTP/3:多路复用,一个连接并发多个请求,避免队头阻塞
  • 开启 Keep-Alive:复用 TCP 连接,省去重复握手
  • TLS 会话复用:开启 session ticket / session cache,减少完整握手次数
  • OCSP Stapling:避免客户端额外发起证书状态查询
  • 启用 0-RTT(HTTP/3):在安全评估允许的前提下减少握手往返

5.2 传输效率优化

# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

# 查看可用算法
sysctl net.ipv4.tcp_available_congestion_control

# 查看 TCP 缓冲区设置
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem

对跨洋高延迟链路,BBR 通常比默认 CUBIC 有更好的吞吐表现,尤其在存在轻微丢包时。但要明确:BBR 优化的是吞吐,不会降低延迟和抖动。同时应适当调大 TCP 缓冲区,避免长肥管道下窗口受限。

5.3 服务器自身排查

# 网卡协商状态
ethtool eth0

# 网卡错包与丢帧
cat /proc/net/dev

# 连接的 RTT 与重传
ss -i

# 实时流量,确认是否跑满
sar -n DEV 1

若 ss -i 中 retrans 持续增长且 rtt 偏高,说明存在真实丢包;若 ethtool 显示速率或双工协商异常,先解决链路层问题。

六、优化实施清单

  1. 测量基线:用 curl -w 记录五个阶段的耗时,用 ping -c 100 -i 0.2 记录延迟与抖动
  2. 排查 DNS:dig +short、dig @8.8.8.8 对比响应速度,检查 TTL 与解析结果是否合理
  3. 接入 CDN:静态资源独立域名并全量接入,配置长缓存与压缩
  4. 验证命中:curl -I 确认 x-cache 为 HIT,age 正常增长
  5. 升级协议:开启 HTTP/2 或 HTTP/3、Keep-Alive、TLS 会话复用、OCSP Stapling
  6. 压缩与瘦身:Brotli/Gzip、WebP/AVIF、代码合并与懒加载
  7. 检查线路:traceroute -n -T -p 443 看是否绕路,mtr -T -P 443 双向测试
  8. 晚高峰复测:在 21 点前后重测全部指标,与白天对比
  9. 服务端调优:评估 BBR、调整 TCP 缓冲区、检查网卡与连接状态
  10. 评估机房位置:若用户以国内为主且延迟不可接受,考虑迁移到香港/新加坡/日本
  11. 建立长期监控:把分段耗时纳入定时采样,形成时间序列
  12. 验证闭环:每次优化后重测,确认目标段落耗时确实下降

七、常见误区

7.1 只优化一个环节

页面加载是串行叠加的,如果 DNS 300ms、TCP 200ms、TLS 400ms、内容传输 2s,只优化 TLS 省下 200ms 感知有限。先找出最大的那一段,往往收益最明显;而对跨境场景,CDN 通常是一次性削减最多环节的手段。

7.2 以为换了机房就万事大吉

机房位置决定延迟量级,但如果 DNS 仍解析到境外、静态资源没有 CDN,换机房的收益会被这些环节吃掉。先做 CDN 和 DNS 优化,再决定是否迁移,很多时候迁移就不必要了。

7.3 忽略动态内容的回源

CDN 对静态资源有效,但个性化页面、API、数据库查询仍要回源。对这类内容应考虑接口合并、缓存片段(ESI / 边缘计算)、数据库读写分离等手段,而不是指望 CDN。

7.4 只看单次测试结果

跨境链路质量随时段波动很大。只在白天测一次就判断"已经优化好了",晚高峰可能依然糟糕。必须在晚高峰(20:00-23:00)复测,并做多网络交叉验证。

小结

网站海外访问慢是多个环节叠加的结果,解决思路是"先测量、再分段、按收益排序"。用 curl -w 把一次请求拆成 DNS、TCP 建连、TLS 握手、服务器处理、内容传输五段,找出最大耗时段;用 dig 系列命令排查解析环节并改用分区域解析;用 CDN 承接静态资源,这是跨境场景投入产出比最高的一步;用 traceroute -T -p 443 与 mtr -T -P 443 双向检查线路是否绕路、晚高峰是否拥塞;用 HTTP/2、Keep-Alive、BBR、压缩等手段减少往返次数与传输体积。避坑要点:不要只优化单一环节,先找最大耗时段;不要忽略 DNS,它常常贡献几百毫秒;不要以为 CDN 万能,动态请求仍需回源优化;不要只在白天测试,晚高峰数据才是真实水平;不要指望 BBR 降低延迟,它只改善吞吐。最后要清醒认识到,机房位置决定的物理延迟下限无法突破,当用户以国内为主且延迟要求苛刻时,把源站放到香港、新加坡或日本,才是最彻底的解法。


本文延迟数值均为经验参考区间,实际表现随线路类型、运营商、时段与网络状况波动;不涉及任何具体厂商报价。