静态网站国内访问慢怎么办:先诊断再改善,GitHub Pages、Vercel、Cloudflare Pages 通用

Blog / Performance

静态网站国内访问慢怎么办:先诊断再改善,GitHub Pages、Vercel、Cloudflare Pages 通用

静态网站国内访问慢,很多时候慢的不是托管平台本身,而是页面里引用的外部资源:境外字体、统计脚本、公共 CDN 上的 JS 库。动手改之前,先把一次页面加载拆成 DNS、TLS 握手、首字节、资源下载几段,看清时间花在哪一段,再对症处理。如果确实需要中国大陆境内的节点,就要办 ICP 备案,并且通过持证服务商接入,这一步没有合规的捷径。

下面的步骤对 GitHub Pages、Vercel、Cloudflare Pages 和其他静态托管都适用。本文不讨论“优选 IP”、改 hosts 指向非官方节点这类做法:它们效果不稳定,也可能违反平台条款。

为什么“换个平台”往往解决不了问题?

网上 2020–2024 年的帖子结论经常互相矛盾,一篇说某平台快,另一篇说慢。原因很简单:测试者的运营商、地区、时间段不同,而且大多数人只看了“整页打开用了几秒”,没有分段。

一个典型的博客页面,加载过程大致是:

  1. 解析你的域名(DNS)
  2. 和托管平台的边缘节点建立 TCP 与 TLS 连接
  3. 等服务器返回 HTML 的第一个字节(TTFB)
  4. 下载 HTML,再并发请求 CSS、JS、图片、字体
  5. 加载第三方域名上的资源,每个新域名都要重复第 1、2 步

第 5 步往往最慢。主题模板里自带的字体链接、评论系统、统计代码,各自连一个境外域名,只要其中一个阻塞渲染,页面就会白屏好几秒。这时候换托管平台不会有改善,因为慢的那个请求根本不发往托管平台。

第一步:用浏览器 Network 面板看是哪个请求慢

用国内直连网络(关掉代理和加速工具)打开 Chrome 或 Edge 的开发者工具:

  1. 打开 Network 面板,勾选 Disable cache。
  2. 刷新页面,等加载结束。
  3. 看 Waterfall 列里哪几条横条最长。
  4. 点开最慢的请求,切到 Timing 标签。

Timing 里的字段可以这样判读:

Timing 字段含义这一项长说明什么
Queueing / Stalled浏览器排队等待同域名并发过多,或前面有阻塞资源
DNS Lookup域名解析解析服务器远、解析结果异常,或域名解析本身受干扰
Initial connection / SSLTCP + TLS 握手到边缘节点的网络路径长或丢包
Waiting for server response (TTFB)首字节等待回源慢、边缘缓存未命中,或节点离你远
Content Download内容下载文件太大,或链路带宽受限

有两种情况要特别留意:

  • 请求一直 pending,最后失败或超时:通常是这个域名在你的网络下无法连通。如果它是 <head> 里同步加载的 CSS 或 JS,整页都会被拖住。
  • 主 HTML 很快,但页面迟迟不显示:多半是渲染阻塞资源(字体、外链 CSS、同步脚本)的问题,和托管平台无关。

测之前,最好先确认自己确实是国内直连。如果系统里开着全局代理或分流规则,测到的是代理出口的情况。可以用 /ip 的大陆分流检测看当前属于“国内直连”“大陆分流”还是“全局代理”,原理见国内网站如何看到你的真实 IP.

第二步:用命令行把主站的时间拆开

Network 面板受浏览器缓存、扩展和连接复用影响。对主站域名,可以用 curl 再测一次,排除这些干扰:

curl -o /dev/null -s -w \
'DNS:      %{time_namelookup}s\nConnect:  %{time_connect}s\nTLS:      %{time_appconnect}s\nTTFB:     %{time_starttransfer}s\nTotal:    %{time_total}s\nHTTP:     %{http_code}\nIP:       %{remote_ip}\n' \
https://your-blog.example.com/

这几个值是累计时间,相邻两项相减才是单段耗时:

  • Connect - DNS 约等于一次 TCP 往返
  • TLS - Connect 是 TLS 握手
  • TTFB - TLS 是发出请求到收到第一个字节的时间,包含一次网络往返和服务器(或边缘缓存)的处理时间

建议在不同时段多跑几次(例如上午和晚高峰各测 5 次),只看一次的结果容易被偶然的波动误导。

再看解析结果是否正常:

dig +short your-blog.example.com
dig +short your-blog.example.com @223.5.5.5
dig +short your-blog.example.com @1.1.1.1

如果不同解析服务器给出的地址差别很大,或者返回了明显不属于托管平台的地址,就要先排查解析问题,方法见 DNS 污染和 DNS 劫持有什么区别。如果握手阶段特别慢、偶尔超时,可以用 mtr 看路径上哪一段开始出现丢包,读法见 traceroute 和 mtr 结果怎么看.

第三步:对照第三方资源,看看是不是它们拖慢的

在 Network 面板的表头上右键,勾选 Domain 列,再按这一列排序,就能看到页面引用了哪些外部域名。常见的几类:

  • 网页字体:主题模板默认引用的境外字体服务,在大陆网络下经常加载很慢甚至失败。
  • 公共前端 CDN:jsDelivr、unpkg、cdnjs 这类公共 CDN 上的库文件,在国内的可用性和速度会随时间变化。
  • 统计与广告脚本:境外统计服务的脚本通常不阻塞渲染,但会占连接,也会拖慢 load 事件。
  • 评论系统、嵌入内容:评论框、视频、社交分享按钮,有时会在首屏同步加载。

公共前端 CDN 在你所在网络的表现,可以直接在 cdnping online speed test 里看。它在浏览器里测 9 个公共前端 CDN,给出两个指标:

  • 首次连接:包含 DNS 解析和 TLS 握手,对应用户第一次访问时的体验;
  • 往返:连接复用后 3 次请求的中位数,对应同一页面里后续资源的加载。

首次连接很慢但往返正常,说明问题主要出在解析或握手,资源合并到少数几个域名、减少新连接就能改善;两个指标都慢,说明这条线路本身质量差,应该换源或自托管。更多数据可以看 CDN speed ranking,选型的思路见如何选择适合国内访问的公共 CDN.

诊断结果对照表:慢在哪,就改哪

诊断现象大概率原因优先尝试的做法
某个第三方请求 pending 后失败,页面白屏外部资源在当前网络不可达,且阻塞渲染自托管该资源,或改成异步加载
字体请求很慢,文字迟迟不出现境外字体服务慢字体文件放到自己站点下,加 font-display: swap,按需子集化
公共 CDN 上的 JS 库慢公共 CDN 在当前网络表现差换成测速结果更好的源,或打包进自己的构建产物
主站 DNS 解析慢或结果异常解析链路问题检查 DNS 记录和解析服务商,参考 DNS 排查文章
主站 TLS 握手慢、TTFB 高到托管平台边缘节点的路径长绑定自定义域名、提高缓存命中率;仍不够再考虑境内节点(需备案)
重复访问依然很慢缓存头没配好,每次都重新下载给带哈希的静态文件设长缓存
大图片下载时间长图片体积大压缩、转 WebP/AVIF、按屏幕尺寸输出

不需要备案就能做的改善

这些改动只涉及你自己的代码和配置,在任何托管平台上都能做:

1. 把外部依赖收回到自己的域名下

字体、图标库、JS 库下载到仓库里,跟着站点一起部署。这样页面只需要连一个域名,少了好几次 DNS 和 TLS 握手,也不会被某个第三方拖住。注意遵守字体和库的许可证。

2. 让渲染不再被阻塞

非关键脚本加 defer 或 async;统计、评论这类组件放在首屏渲染之后再加载;首屏用到的关键 CSS 可以内联到 HTML 里。

3. 配好缓存头

构建工具生成的带内容哈希的文件(如 app.3f9a1c.js)可以设 Cache-Control: public, max-age=31536000, immutable;HTML 本身设短缓存或 no-cache,保证更新能及时生效。各个指令的区别见 Cache-Control 缓存头怎么配。大多数静态托管平台都支持在配置文件里写响应头,具体写法以平台官方文档为准。

4. 绑定自定义域名

用自己的域名,以后想换托管平台或接入 CDN 时,只要改 DNS 记录,不用改站内链接和外部引用。如果在托管平台前面再套一层 CDN,要注意 SSL 模式配置,否则容易出现重定向循环,参考 Cloudflare 重定向次数过多怎么解决.

5. 减小资源体积

压缩图片,删掉主题里没用的 JS,开启 Brotli 或 gzip(多数平台默认开启,可以在响应头的 content-encoding 里确认)。

做完以后,用同一网络、同一时段再跑一遍第二步的 curl 和第一步的 Network 面板,前后对比,确认改动确实有效。

什么时候需要境内节点?备案的边界在哪里

如果第三方资源都已经处理干净,主站的 TLS 握手和首字节在国内依然明显偏慢,那么剩下的瓶颈就是物理距离和跨境线路。这一段靠前端优化解决不了,只能让内容由离用户更近的节点提供。

这里有一条明确的边界:在中国大陆境内的服务器或 CDN 节点上提供网站服务,需要先办 ICP 备案,并且要通过持有相应资质的服务商接入。 境外托管平台和境外 CDN 的“亚太节点”通常部署在大陆以外,离用户近一些,但并不等于境内加速。

可以这样判断:

  • 个人博客、文档站:多数时候前面那些不备案的改善已经够用。
  • 面向国内用户的业务站、对首屏时间有明确要求的站点:建议评估备案,再选用持证服务商的境内 CDN。

cdnping 的 Edge 边缘加速介绍页也写明了这一点:它基于 Cloudflare 全球网络提供边缘加速,而中国大陆境内的加速同样需要 ICP 备案并经由持证服务商。

边缘网络本身也会出故障。cdnping 每 15 分钟同步一次 Cloudflare 官方状态页,记录显示 2026-10-10 04:13(UTC)发布过一条名为 “Elevated Errors in China Network Colos” 的事件,影响等级为 minor。所以如果某天站点在国内突然变慢,在怀疑自己的配置之前,先去平台的官方状态页看一眼,例如 Cloudflare Status,或者 cdnping 的 API 状态页.

一份可以照着走的排查清单

  1. 确认测试网络是国内直连(用 /ip 看分流状态)。
  2. Network 面板禁用缓存后刷新,找出最慢的 3 个请求,记下域名和 Timing 中最长的那一段。
  3. 对主站域名跑 curl 计时,不同时段至少各测 5 次。
  4. 用 dig 对比几个解析服务器的结果,排除解析异常。
  5. 用 cdnping online speed test 看页面依赖的公共 CDN 在当前网络的首次连接和往返。
  6. 自托管或异步化阻塞渲染的第三方资源。
  7. 配好静态文件的缓存头,压缩图片。
  8. 复测并对比改动前后的数据。
  9. 主站本身仍然慢、且业务需要时,再评估 ICP 备案和境内节点。

如果你的问题不只出在网站访问上,还包括开发环境整体的网络状况,可以接着看开发者网络自检清单(2026 版).

Related articles

Keep reading

How Chinese Websites See Your Real IP: How Mainland Split Routing Detection Works and Its Three Outcomes

Split routing detection checks whether one device has two exits: how domestic CDNs echo back the client IP, how CORS decides whether a web page can read it, how to tell mainland split routing, global proxy, and direct domestic connection apart, and how to test yourself on cdnping and generate a result image with your IP hidden.