1、什么是 CDN
CDN,全称Content Delivery Network,即内容分发网络。这是一种构建在现有网络基础之上的智能虚拟网络,它依赖部署在全球各地的边缘服务器,并通过中心平台的负载均衡、内容分发、调度等功能模块,使用户能够就近获取所需内容。这种设计旨在提高用户访问的响应速度和命中率,降低网络拥塞,从而优化用户的网络体验。
CDN的核心思想是利用离用户更近的服务器来提供更快速的响应和更稳定的网络连接。它通常用于网站、视频、音频、游戏等大型内容的分发和加速。CDN通过全局负载均衡技术,根据网络流量、负载状态、用户的距离和响应时间等综合信息,实时地将用户的请求导向离其最近的节点服务器上,使用户能够就近获取所需内容。
CDN的关键技术主要包括内容存储和分发技术,它由初始服务器、分布在边缘的缓存服务器、重定向DNS服务器和内容交换服务器组成。这些组件协同工作,确保内容能够高效、准确地分发到用户手中。
总的来说,CDN是一个复杂的网络架构,它通过优化内容分发和提高网络性能,为用户提供更快速、更稳定的网络访问体验。
2、 url输入过程 cdn扮演怎样的角色
首先,我们会在浏览器中输入一个网址(URL)。这时,浏览器的第一步是进行DNS域名解析,查看是否有与该域名对应的IP地址。如果本地域名服务器中没有找到对应的IP地址,它会进行递归查找,最终找到对应的IP地址,并将其规则保存到本地的hosts文件中。
在这个过程中,如果网站使用了CDN,那么DNS的解析过程会有所不同。本地DNS在解析URL地址时,会把最终解析权交给CNAME指向的CDN的DNS服务器。CDN的DNS服务器会根据每台机器的负载量以及该机器离用户地理位置的距离等因素,为用户返回一个全局负载均衡IP地址。这个IP地址通常是与用户地理位置最接近的CDN节点的IP。
得到IP地址后,浏览器会建立TCP连接,并发送HTTP请求到该IP地址对应的服务器。如果是CDN节点,那么该节点会负责响应用户的请求,并提供所需的内容。如果CDN节点中没有用户请求的内容,它会向上一级节点查找,直到找到为止。
因此,CDN在这个过程中主要起到了加速和优化访问的作用。通过将内容缓存在离用户较近的CDN节点上,CDN可以大大减少网络传输的延迟,提高网页的加载速度。同时,CDN还可以根据网络流量、负载状态等因素进行智能调度,确保用户能够获得更稳定、更快速的网络体验。
3、CDN 的作用
CDN 的任务是实际上缩短物理距离,目标是提高站点渲染速度和性能。
CDN就可以理解为分布在每个县城的火车票代售点,用户在浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求。
从本质上讲,CDN 通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验
4、CDN 的优缺点
优点
- CDN 节点解决了 跨运营商 和 跨地域 访问的问题,访问延时大大降低;
- 大部分请求在 CDN 边缘节点完成,CDN 起到了分流作用,减轻了源站的负载。
缺点
当网站更新时,如果 CDN 节点上数据没有及时更新,即便用户再浏览器使用 Ctrl + F5 的方式使浏览器端的缓存失效,也会因为 CDN 边缘节点没有同步最新数据而导致用户访问异常
5、CDN 缓存策略
CDN 边缘节点的缓存策略遵循 http 标准协议,通过 http 响应头中的Cache-control: max-age 的字段来设置 CDN 边缘节点数据缓存时间。
当客户端向 CDN 节点请求数据时,CDN 节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN 节点就会向源站发出回源请求,从源站拉取最新数据,更新本地缓存,并将最新数据返回给客户端。
HTTP请求流程:
- 用户在浏览器输入要访问的网站域名,向本地 DNS 发起域名解析请求。
- 域名解析的请求被发往网站授权 DNS 服务器。
- 网站 DNS 服务器解析发现域名已经 CNAME 到了 www.example.com.c.cdnhwc1.com。
- 请求被指向 CDN 服务。
- CDN 对域名进行智能解析,将响应速度最快的 CDN 节点 IP 地址返回给本地 DNS。
- 取响应速度最快的 CDN 节点 IP 地址。
- 浏览器在得到速度最快节点的 IP 地址以后,向 CDN 节点发出访问请求。
此时判断是否有缓存,缓存是否有效。如果有效
- CDN 节点将用户所需资源返回给用户。
无缓存或者缓存失效
-
CDN 节点回源站拉取用户所需资源。
-
将回源拉取的资源缓存至节点。
-
将用户所需资源返回给用户。
6、如何避免 CDN 为 PC 端缓存移动端页面
如果 PC 端和移动端是一套代码则不会出现这个问题。「这个问题出现在 PC 端和移动端是两套代码,却共用一个域名。」
使用 nginx 配置如下,根据 UA 判断是否移动端,而走不同的逻辑 (判断UA是否移动端容易出问题)
location / {
// 默认 PC 端
root /usr/local/website/web;
# 判断 UA,访问移动端
if ( $http_user_agent ~* "(Android|webOS|iPhone|iPad|BlackBerry)" ){
root /usr/local/website/mobile;
}
index index.html index.htm;
}
解决方案通常使用 Vary 响应头,来控制 CDN 对不同请求头的缓存。
「此处可以使用 Vary: User-Agent ,代表如果 User-Agent 不一样,则重新发起请求,而非从缓存中读取页面」
Vary: User-Agent
当然,User-Agent 实在过多,此时缓存失效就会过多。
简答
使用 Vary: User-Agent,根据 UA 进行缓存。
Vary: User-Agent
但最好不要出现这种情况,PC 端和移动端如果是两套代码,建议用两个域名,理由如下
- nginx 判断是否移动端容易出错
- 对缓存不友好