12. CDN
12. CDN
内容分发网络(Content Delivery Network,简称 CDN)是一种分布式的服务器网络,旨在提高内容传输的效率、可用性和可靠性。CDN 通过在全球范围内分布的节点缓存内容,将数据传递到离用户最近的节点,从而加速用户访问并提升稳定性。
CDN 的工作原理
CDN 的核心机制在客户端(用户)与服务器(源站)之间充当中介,将静态资源从源服务器分发到全球的边缘节点,通过缓存加速资源访问。用户请求时,CDN 会根据用户的位置、服务器负载等因素选择最佳节点提供内容。这种方式显著降低了延迟,并减少了源站的负载。
交互流程
内容缓存:静态内容(如 HTML 页面、CSS 文件、图片和视频)会预先缓存在边缘节点。
智能路由:利用 DNS 或 HTTP 重定向技术,将用户请求引导到最优的边缘服务器,而不是直接到达源站。
CDN 边缘节点处理请求:CDN 检查本地缓存,判断是否存在对应资源:
- 缓存命中(Cache Hit):所需资源已在 CDN 节点缓存,则直接返回缓存内容。
- 缓存未命中(Cache Miss):边缘节点未缓存所需内容时,它会向源服务器请求(回源机制),并将获取的内容缓存以备后续使用。
源站响应:如果 CDN 向源站请求资源,源站会根据 HTTP Header 指定的规则返回数据,并附带缓存策略。
缓存更新与传递:CDN 根据源站返回的 HTTP Header 决定如何缓存、缓存多长时间,以及是否需要立即更新缓存。
关键 HTTP Header
CDN 判断是否缓存内容以及缓存策略的核心依据是 HTTP 响应头中的特定字段:
Cache-Control
- 定义缓存行为的主要字段。
- 常见指令:
public
:内容可被任何缓存节点(包括 CDN 和浏览器)存储。private
:内容仅供客户端缓存,CDN 不缓存。no-cache
:允许缓存但需每次向源站验证。max-age=seconds
:缓存内容的最长有效时间。must-revalidate
:缓存到期后必须向源站验证。
Expires
- 指定内容过期时间的绝对值,优先级低于
Cache-Control
。
- 指定内容过期时间的绝对值,优先级低于
ETag
- 内容唯一标识符,用于验证缓存内容是否已更改。
- CDN 可通过比对
ETag
判断是否需要重新缓存。
Last-Modified
- 内容最后修改时间。
- 与
If-Modified-Since
结合使用,当内容未更改时,返回 304 状态码,无需重新下载。
Vary
- 决定缓存内容的多样化。
- 如
Vary: User-Agent
表示根据用户代理(浏览器类型)存储不同的版本。
缓存交互示例
以下是一次完整的 CDN 缓存交互流程示例:
首次访问:
- 客户端请求资源,CDN 缓存未命中。
- CDN 向源站发起请求,源站返回资源并附加
Cache-Control: max-age=3600
。 - CDN 缓存资源,返回给客户端。
缓存命中:
- 在
max-age
期限内,客户端请求直接由 CDN 返回缓存内容,无需访问源站。
- 在
缓存验证: 当缓存到期(超过
max-age
)或Cache-Control: no-cache
指定时:- CDN 使用
If-None-Match
(基于ETag
)或If-Modified-Since
(基于修改时间)向源站验证。 - 如果内容未更改,源站返回 304 状态码;若已更改,返回新内容并更新缓存。
- CDN 使用
CDN 的优势
- 提高访问速度
CDN 通过减少服务器到用户的物理距离和优化网络路径,显著提升内容加载速度。例如:
- 静态资源从最近的节点加载。
- 使用 HTTP/2、多路复用和压缩技术进一步优化传输。
- 减轻服务器压力
通过缓存技术,CDN 能将大部分静态内容请求分流到边缘节点,从而降低源服务器的负载。通过在多个服务器之间分配流量,防止单点过载,确保高并发访问时的系统稳定性。
- 提升可靠性和可用性
分布式架构能防止单点故障。当某个节点故障时,CDN 可自动将流量切换到其他健康节点,保证服务不中断。
- 抗流量攻击
CDN 提供的分布式防护能够有效抵御 DDoS 攻击。它们通过流量分散和智能流量清洗机制保护源服务器。提供额外的安全层,保护源站点不被直接暴露。
CDN 的组件
- 边缘节点(Edge):负责缓存并提供内容服务。
- 控制中心:管理内容分发策略和节点状态。
- 监控系统:实时监控流量、节点健康状况及性能。
- 源站(Origin):内容的原始存储地,当缓存过期或未命中时提供内容。