这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 CDN 把静态资源、动态请求和计算能力放到离用户更近的边缘节点,目标是降低延迟、减少回源、提升可用性和吸收攻击流量。CDN 的效果取决于缓存命中率、内容可缓存性、刷新策略、回源控制和监控。
22.1 CDN 架构
用户
-> Local DNS /智能调度
-> 边缘节点 Edge
-> 中间层 Mid
-> 源站 Origin
边缘节点:
- 就近缓存内容;
- 终止 TLS;
- 压缩和优化;
- 回源;
- 防护攻击;
- 记录访问日志。
22.2 调度方式
| 方式 | 说明 |
|---|---|
| DNS 调度 | 根据 Local DNS 位置返回边缘 IP |
| HTTP DNS | 客户端直接请求调度服务,减少运营商劫持 |
| Anycast | 同一 IP 广播到多个地域,按路由就近接入 |
| 302 调度 | 先返回调度中心,再跳转边缘 |
Local DNS 位置可能不等于用户真实位置,因此调度结果不总是最优。
22.3 缓存命中
请求到达边缘:
命中缓存 -> 直接返回
未命中 -> 中间层或源站
指标:
| 指标 | 含义 |
|---|---|
| 命中率 | 命中请求占比 |
| 回源率 | 需要请求源站的比例 |
| 回源带宽 | 源站压力 |
| 边缘响应时间 | 用户侧首包 |
| 源站响应时间 | 回源耗时 |
| 状态码分布 | 4xx / 5xx / 304 |
命中率低的原因:
- URL 参数变化;
- Cache-Control 不允许缓存;
- Cookie 影响缓存 key;
- 资源版本变化;
- 边缘节点容量不足;
- 用户分布太散;
- 频繁刷新;
- 动态接口被误判为静态。
22.4 缓存策略
静态资源:
Cache-Control: public, max-age=31536000, immutable
文件名使用内容哈希:
app.a1b2c3.js
style.d4e5f6.css
HTML:
Cache-Control: no-cache
接口:
Cache-Control: private, no-store
CDN 可能支持忽略或包含 query string,但必须与业务语义一致。带用户 ID、时间戳或随机数的资源不能被公共缓存错误复用。
22.5 刷新与预热
刷新:让边缘缓存失效。
URL 刷新:指定资源立即失效
目录刷新:批量失效
预热:发布前主动拉取到边缘
发布流程:
1. 上传新静态资源,文件名带新 hash
2. 验证新资源可访问
3. 发布新 HTML 引用新资源
4. 按需预热热门资源
5. 观察命中率和错误率
6. 保留旧资源一段时间
不要依赖“发布后刷新全部目录”作为常规流程,容易造成回源风暴。
22.6 回源控制
配置:
- 回源 Host;
- 回源协议;
- 回源超时;
- 回源重试;
- 回源跟随 301 / 302;
- 回源认证;
- 回源Range;
- 源站 IP 或负载均衡。
常见问题:
- 回源 Host 错误,源站返回 404;
- 源站证书不匹配;
- 回源超时小于源站处理时间;
- 重试放大源站压力;
- 回源带错 Cookie;
- 源站限速;
- 源站只允许部分 CDN 网段;
- 源站响应 no-store 但期望 CDN 缓存。
22.7 动态加速
动态接口不能被缓存,但 CDN 仍可通过优化链路改善:
- 就近接入;
- CDN 内部骨干网回源;
- 连接复用;
- TCP/TLS 优化;
- HTTP/2 或 HTTP/3;
- 智能路由;
- 请求压缩。
注意:
- 动态请求收益需实测;
- 敏感数据要评估代理点;
- POST 和请求体大小有限制;
- WebSocket 支持视 CDN 而定;
- 响应流式传输需要验证。
22.8 安全与防护
CDN 可以隐藏源站 IP、吸收流量攻击、配合 WAF 过滤请求。
措施:
- 源站只允许 CDN 回源网段;
- 配置回源鉴权;
- URL 防盗链;
- 时间戳签名;
- 频率限制;
- Bot 治理;
- WAF 规则;
- DDoS 清洗;
- 敏感路径禁缓存;
- 访问日志脱敏。
仅靠隐藏源站 IP 不等于安全,仍需源站防火墙和证书治理。
22.9 多 CDN 策略
原因:
- 不同地区性能差异;
- 单供应商故障;
- 成本谈判;
- 特定能力差异;
- 合规要求。
调度:
全局流量调度
|-- CDN A:主要地区
|-- CDN B:备份
+-- 源站直连:降级
要求:
- 统一域名和证书管理;
- 配置一致性验证;
- 双方缓存和刷新能力;
- 监控对比;
- 自动切流阈值;
- 定期演练。
22.10 排障
用户访问慢:
1. 确认用户地区和运营商
2. 解析 CDN 域名
3. curl 测边缘响应
4. 查看命中状态
5. 对比源站响应
6. 检查回源耗时
7. 查看资源大小和压缩
访问 404:
1. 确认源站资源存在
2. 检查回源 Host 和路径
3. 检查重写规则
4. 检查缓存 key
5. 检查源站路由
新旧内容混杂:
- HTML 缓存策略错误;
- hash 引用未更新;
- 部分节点刷新未完成;
- 用户本地缓存;
- 浏览器或中间代理缓存。
本章小结
CDN 通过边缘缓存、就近接入和回源控制降低用户延迟和源站压力。静态资源应使用内容哈希和长缓存,动态接口要谨慎设置 no-store,发布时优先新文件名而不是频繁刷新。CDN 治理重点是命中率、回源带宽、刷新预热、回源 Host、安全防护和多 CDN 切流演练。
思考题
- CDN 为什么能降低用户访问延迟?
- 哪些响应不适合公共边缘缓存?
- 如何安全发布静态资源并避免回源风暴?
- 回源 Host 错误会导致什么问题?
- 设计一个多 CDN 故障切换方案。