什么是CDN
- 概念:CDN 由分布在不同区域的边缘节点服务器组成的分布式网络。将源服务器内容分发至最接近用户的节点。
- 也就是一个CDN里面有很多服务器,一个主服务器负责管理各个节点非完全,并将请求重定向到适合的接近用户的节点服务器上。
- 节点服务器相当于源服务器的缓存,如果你第一次访问这个资源,节点服务器会先去源站拉去资源,存储到节点服务器中,如果后面还要访问这个资源,就可以直接在CDN中返回。
- 有点类似于Nginx 缓存静态数据,但是Nginx相当于一个app,是一个具体的服务器。CDN是很多个服务器。
- CDN的主要功能:
- 在不同的地点缓存内容**(静态资源)**。
- 通过负载均衡技术将用户的请求定向到最适合的缓存服务器上去获得内容。
- 优点:
- 加快静态资源的访问速度。
- 减轻服务器以及带宽的负担。
- 使用场景:
- 存储静态数据,动静分离。
- 大文件下载。
- 动态加速,如直播网站。
- 可以搭配OSS使用。(源为OSS,CDN从OSS获取数据)
- 常见名词:
- 源站:Origin Server, 使用CDN之前的服务器。数据的来源。
- CNAME域名:Canonical Name,指域名的别名。
- 用于将域名解析到另一域名,或者多个域名映射到统一域名上。
- 可以用于委托解析。
- 在CDN控制台添加了需要加速的域名之后,系统会为其加速域名分配一个对应的CNAME域名。(服务商给你分配一个域名,这个域名并不属于你)
- GSLB 全局负载均衡:负责CDN节点之间的相互协作。
- 回源:指CDN节点上没有用户请求的资源、或该资源的缓存已经过期,CDN节点需要从源站获取最新的资源内容。
- 预热:在CDN上提前将内容缓存到CDN节点上。
- 注意:
- CDN不能区别动态资源和静态资源,需要你自行分离动态资源和静态资源,然后对静态资源进行加速。
使用流程
- 传统访问网页的方式:
- 浏览器输入域名。
- 解析服务器获得相应IP地址。
- 向该IP对应服务器发送访问请求。
- 返回数据。
- 使用CDN的网页访问:
- 浏览器输入域名。
- 缓存层:
- 解析服务器获取对应的CNAME域名。
- 对获取的CNAME域名进行解析获得缓存服务器的IP地址。
- 向缓存服务器IP地址发送请求。
- 返回数据。
- 完整CDN工作流程:
- 用户发起请求。
- 智能DNS进行解析。(根据用户IP地理位置、接入网类型 解析至 离用户路由最短、负载最轻的缓存服务器)
-
经过本地DNS系统解析,DNS系统会最终将域名解析权交给CNAME指向的CDN专用DNS服务器。
-
CDN的DNS服务器将CDN的全局负载均衡设备(Global Server Load Balance, GSLB)IP地址返回给用户。
-
用户向CDN的全局负载均衡设备发送URL访问请求。
-
CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这个设备发起请求。
-
区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务。
选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
-
全局负载均衡设备把缓存服务器的IP地址返回给用户。
-
- 获得缓存服务器IP。
- 缓存服务器中是否有目标资源。
- 有:(命中)返回内容。
- 否:(回源)
- 向源站发起请求。
- 将获取的内容保存到缓存服务器。
- 将内容返回给用户。
- 可以看出CDN是和域名绑定的。如果你要动静分离,对静态文件进行CDN加速,那你应该给静态文件的位置和动态文件位置分配不同的域名。接下来就可以单独对静态文件的域名进行CDN加速。
命中率、回源率、预热
- 命中率越高越好,回源率越低越好。
- 可以通过预热的方式将源站的资源加载到CDN节点中,这样用户首次请求资源的时候可以直接从CDN中获取,无需回源。
防盗刷
- 目的:防止静态资源被其他的用户或网站非法盗刷。
- 解决方法:下面的方法可以搭配使用。
- Referer 防盗链:通过HTTP请求头信息里的Referer字段进行限制。
- Referer 字段:当前请求页面来源页面得网站地址。
- 时间戳防盗链:
- 时间戳防盗链加密的URL具有时效性,过期之后无法再访问。
- 通常包括签名字符串+过期时间。
- IP黑白名单配置。
- IP访问限频。
- Referer 防盗链:通过HTTP请求头信息里的Referer字段进行限制。
Reference
- CDN是什么?使用CDN有什么优势? - 阿里云云栖号的回答 - 知乎
https://www.zhihu.com/question/36514327/answer/193768864 - CDN是什么?使用CDN有什么优势? - Xigang的回答 - 知乎
https://www.zhihu.com/question/36514327/answer/121026637 - https://javaguide.cn/high-performance/cdn.html#cdn-工作原理是什么