2026-09-14 日报
今日主题
CDN 就近调度(GSLB):按客户端 IP 下发最优资源域名
BriefIntroduction
现在的互联网都是面向全球的服务,一般都会做 GSLB(Global Server Load Balancing,全局负载均衡)——也就是常说的 CDN 调度 / 就近接入:看客户端 IP(再叠加地区、运营商、线路质量),选出当前最优的 CDN 节点 / 域名。
DNS 那条路是:浏览器解析静态域名时,按 IP 指到不同 POP。这里走的是 应用层调度,发生在 SSR:打开页面的 HTTP 已经打到 Node,请求上带着客户端 IP。出 HTML 之前用这个 IP 拿到 host 前缀,和 pathname 拼成完整地址写进文档。浏览器下载到的已经是选好的 CDN,自己不再选路。
放在 SSR,是因为浏览器看不到这份入站请求上的真实 IP,首屏也等不及再问一跳。调度失败就退回兜底域名,页面照样能出。
以前写死某一家 CDN,供应商一挂切站影响面很大,恢复往往很慢。边缘改配置不是主因,客户端缓存清不掉才是——浏览器按完整 URL 做强缓存,旧 script src 还打着故障域名。下一份 SSR HTML 换了 host,缓存 key 跟着变,才能绕开那份清不了的本地缓存。动态调度大约一分钟能换域名,固定 URL 往往要更久。
1 | 完整地址 = prefix(按请求动态选) + pathname(相对固定) |
变的是前面那截域名。同一条 path,测试 / 生产、国内 / 海外可以对上不同 prefix。
一、选型大概怎么走
不是「看一眼 IP 就返回一个域名」,粗线条是:
1 | 要不要就近(多域名开关) |
没开就近,就用配置里的固定域名。开了才按区域和厂商表选。
区域尽量用客户端公网 IP;请求没带上、或 IP 无效,就退化到「当前服务所在机房」,海外用户可能拿到国内 host。所以 SSR 要把 当前这次请求 传给调度,不要在启动时算一次然后全站共用。
同一页里的 CSS / JS 应共用同一个 host,避免一个页面打到两家 CDN。挑哪一家时,同一用户短时间内尽量稳定(利于缓存命中),权重可调,方便灰度切流。
整段计算在 Node 里完成。Chrome 只能看到最终 URL,看不到为什么是这家。
二、SSR 时做什么
- 列出要加载的资源
- 用当前请求算出完整 URL,写进 HTML(或交给客户端的一张 URL 表)
- 页面上的脚本都读这个结果,不要再按环境自己拼域名
- 调度超时或失败:fallback + 日志,不要拦住进程启动,也别拼出空 host
一句话: 域名不写死,SSR 按这次请求的 IP 选出 CDN 前缀再拼进页面;浏览器只消费结果,不参与选型。