CDN — 内容分发网络
CDN(Content Delivery Network,内容分发网络)通过在各地部署边缘节点,将静态资源缓存到离用户最近的位置,从而加速访问速度、降低源站压力。它是集群五层架构中的第一层。
核心原理
用户请求 → DNS 解析 → 智能 DNS 返回最近节点 IP
↓
边缘节点有缓存?→ 是 → 直接返回
→ 否 → 回源拉取 → 缓存 → 返回
核心要点:CDN 不生产内容,只是内容的”搬运工”和”缓存工”。
智能 DNS 与 CNAME
CDN 的流量调度依赖 DNS 系统:
- A 记录:域名 → IPv4(直连服务器)
- CNAME:域名 → 另一个域名(CDN 专用,将解析权交给 CDN 服务商)
- NS 记录:指定管辖 DNS 服务器
完整流程:用户请求 → LDNS → CDN 权威 DNS → 返回最优节点 IP
HTTPS / TLS
CDN 需要处理 HTTPS 证书:
- 证书类型:DV(基础)< OV(企业)< EV(最高级)
- TLS 握手:Client Hello → Server Hello + 证书 → 密钥交换 → 加密通信
- HTTPS 加速:CDN 节点做 SSL 卸载,减轻源站计算压力
- HTTP/2 多路复用:一个 TCP 连接并发多个请求,解决队头阻塞
手动配置 CDN 流程
- 在 CDN 控制台添加加速域名
- 配置缓存规则(哪些文件缓存多久)
- 配置回源地址(负载均衡器域名或 IP)
- 修改 DNS 的 CNAME 记录指向 CDN
- 上传 SSL 证书开启 HTTPS
- 等待 DNS 解析生效
CDN 架构演进
| 阶段 | 架构 | 说明 |
|---|---|---|
| 阶段1 | 用户 → 后端应用 | 传统单机 |
| 阶段2 | CDN 分发 → 应用服务器 | 引入 CDN 加速 |
| 阶段3 | CDN → Nginx 静态缓存 → 应用 | 静态文件缓存 + 动态请求分离 |
| 阶段3+ | CDN(静态)+ 负载均衡(动态) | 生产推荐:动静分离,各司其职 |
OpenResty 自建 CDN 缓存
OpenResty = Nginx 核心 + LuaJIT,可在 Nginx 各阶段嵌入 Lua 脚本:
| Nginx 阶段 | Lua 钩子 | 用途 |
|---|---|---|
| 变量设置 | set_by_lua | 设置动态变量 |
| URL 重写 | rewrite_by_lua | URL 重写/重定向 |
| 访问控制 | access_by_lua | IP 黑名单/限流 |
| 内容生成 | content_by_lua | 动态生成响应 |
| 日志记录 | log_by_lua | 自定义日志 |
灰度发布(金丝雀发布)
通过 CDN/负载均衡的分流能力,让少量用户先体验新版本:
灰度策略:按权重 → 按 IP → 按地域 → 按用户分组
流程:小流量验证 → 持续观察 → 全量发布