跳到主要内容

CDN、代理简述

CDN(内容分发网络)

CDN 的本质就是一个具有 反向代理 功能的 内容缓存服务器

在没有 CDN 的参与下,我们访问一个网站的内容需要解析完 IP 地址 去直接访问 源站服务器。一般情况下这是没有问题的,但如果访问者距离 源站服务器 较远,尤其是一些跨国业务,会导致访问速度变慢。

针对这个问题,便出现了 CDNCDN 边缘节点分布在各地,访问者可以就近访问距离近的 CDN 边缘节点,从而加快访问速度。

在这个过程中,访问者作为 消费者源站服务器 作为 商家,而 CDN 则是 快递仓库

  1. 访问者请求内容
  2. 若就近的 CDN 节点已缓存该内容,便直接返回,无需再连源站
  3. 若没有缓存,则 回源 访问源站,把内容返回给访问者,并缓存到节点供后续使用

这样就能理解为什么说 CDN 是一个具有 反向代理 功能的 内容缓存服务器

  • 缓存命中时:直接返回给访问者
  • 缓存未命中时:边缘节点 反向代理 该请求,代为访问源站获取内容并返回,同时写入缓存

对前端而言,CDN 还关系到:

  • 带 hash 的静态资源如何长缓存
  • HTML 入口为何通常不能长缓存
  • 源站 Cache-Control 与 CDN 控制台规则如何配合
  • 域名仍是业务域名时,请求为何会先打到边缘节点

更完整的说明见:CDN 详解(前端视角)

代理(proxy)

代理 处于 客户端 访问 服务端 的过程中,接收 客户端 的请求然后转发给 服务端,并接收 服务端 返回的响应再转发给 客户端

客户端 仅与 代理服务器 通信,无需直接访问实际服务器地址——真正跟 服务端 建立连接的是 代理服务器

正向代理(forward proxy)

正向代理 是为 客户端 提供代理服务的,即 服务端 不知道真正的 客户端;在请求过程中,正向代理 隐藏了 客户端 的身份。此时 代理服务器 代表 客户端 去通信。

主要用途:突破 客户端 的访问限制等。

反向代理(reverse proxy)

反向代理 是为 服务端 提供代理服务的,即 客户端 不知道真正的 服务端;在请求过程中,反向代理 隐藏了 服务端 的身份。此时 代理服务器 代表 服务端 去通信。

主要用途:服务器的 负载均衡安全防护 等。

CDN 对外表现接近“站点侧的反向代理 + 缓存”:用户以为在访问业务站点,实际先连的是边缘节点;源站地址通常只写在 CDN 的 Origin 配置里。

flowchart LR
subgraph 正向代理
C1[客户端] --> FP[正向代理]
FP --> S1[任意目标站]
end
subgraph 反向代理
C2[客户端] --> RP[反向代理 Nginx 等]
RP --> S2a[应用 A]
RP --> S2b[应用 B]
end
subgraph CDN
U[用户] --> E[边缘节点]
E -->|命中缓存| U
E -->|未命中| O[源站]
O --> E
end