本文章以比较通俗的语言讲述下 CDN 是什么,CDN 为什么能加速网站访问,为什么大部分网站都要使用 CDN,涉及细节部分并不需要我们用户了解,所以不会详细描述。文章如有错误,欢迎指出,也欢迎一起探讨。
1、CDN 是什么
CDN即内容分发网络(Content Delivery Network)的简称。简单地说就是 CDN 厂商在全国甚至全球各地,都部署了机房,每个机房就是一个 CDN 节点,然后节点自身也做了一定的优化。然后北京的用户访问就会分配到北京或者北京周边的节点,深圳的用户访问就会分配到深圳或者深圳周边的节点,就近原则;如果你的网站流量很大,这种策略也类似于负载均衡(一对一、一对多),一万个人同时访问你的网站,分配到全国各个节点肯定比只分配到一台服务器是要好的。
视频详解:腾讯云、阿里云
2、为什么 CDN 能够加速网站访问
首先说下最常见的网站架构,最常见的网站是搭建在一台服务器上的,服务器上配置好 nginx、mysql、php 等网站运行的必备环境,然后网站就可以运行起来,可以通过 IP 地址访问,如果你有域名的话,可以通过把域名解析到这个 IP 地址,然后用户输入域名就可以访问你的网站了。
2.1、没有 CDN 之前访问情况
比如你的服务器在北京,这时候北京的用户访问你的网站,离服务器近,访问速度当然也快;深圳的用户访问你的网站,由于离北京比较远,访问速度相对于北京用户来说会稍慢,但是由于都在国内,差异不大;如果这时候美国的用户访问你的网站,由于这时候属于跨国访问,访问网站的速度就会大大下降,严重影响用户体验。
2.1、使用 CDN 之后访问情况
当你的网站使用 CDN 后,北京的用户访问你的网站,会分配到北京或者北京周边的节点;深圳的用户访问会分配到深圳或者深圳周边的节点;美国的用户访问会分配到美国或者美国周边的节点。当访问人数很多的时候,还能够减小你北京服务器(源站)的压力,因为这时候用户访问的请求其实没有到服务器,全部在 CDN 节点上。 并且当该节点收到请请求后,会把该请求内容缓存到 CDN 节点上,后续还有用户访问到该 CDN 节点,则直接返回,访问速度大大提高,所以有时候会发现用了 CDN,但是请求还是慢,一般是因为是初次访问,该 CDN 节点没有该内容的缓存,也就是没有命中缓存,后续再次访问的话就会很快。
3、使用 CDN 后的利弊
3.1、利
加速网站访问,就近分配节点,实现跨运营商,跨区域全网覆盖。
隐藏服务器真实 IP 地址
可以使用各 CDN 产商的功能,比如防盗链,不同资源的针对性加速等等
节约服务器成本。即使购买 1 核 1 G 1M 的服务器也能应对大部分场景,因为只有第一次才需要回源,后续访问的压力都在 CDN 节点
3.2、弊
当一个文件名相同的文件,文件的内容发生了变化,由于之前已经有用户访问了该文件,文件就被缓存到 CDN 节点中,这时候你即使已经上传了新的文件,用户访问的还是旧文件,这时候就需要手动刷新 CDN 缓存或者带 query 参数请求,CDN 节点才会再次回到原站请求最新的文件。有时候开发过程中没注意这个问题会非常苦恼。
一不小心一栋楼就没了,使用 CDN 记得配置到防盗链等访问控制,不然很容易被盗刷,产生高额费用。
4、CDN常用名词解释
- 加速域名:也就是你在 CDN 厂商后台添加的域名,比如你添加了一个域名,cdn.timhbw.com,那么这个就是加速域名,并不是说你现在网站的域名(timhbw.com)
- CNAME 记录:在你的域名解析商,点击【添加解析】的时候,会让你选择记录类型,用的最多的是 A,就是指向 IP。CNAME 也是记录类型的一种,Canonical Name 翻译为中文也就是别名。比如 cdn.timhbw.com 你添加了一个 CNAME 记录,记录值是:timhbw.com,那么访问 cdn.timhbw.com的时候,所有的请求会转到 timhbw.com。
- CNAME 域名:你在 CDN 厂商添加加速域名 cdn.timhbw.com,就会自动分配一个 CNAME 域名,比如七牛云是 xxx.qiniudns.com,腾讯云是:xxx.cdn.dnsv1.com,阿里云是:xxx.kunlun.com 类似这种。
- 动态内容:是指多次访问同一内容,响应返回的数据是不是相同的,比如API 接口、.jsp、.aps、.php等
- 静态内容:是指多次访问同一内容,响应返回的数据是相同的,比如图片、html、js、css、apk、ipa等
- DNS:也就是域名解析服务。作用就是你输入 timhbw.com 后,会自动把域名转换为网络可以识别的 IP 地址,经过一系列处理后,浏览器上就可以服务器返回的内容。
- 边缘节点(CDN 节点):也就是前面提到的 CDN 节点
- 命中率:用户请求的时候,如果该节点已缓存访问的内容,则直接返回给客户,则是HIT(命中),如果 CDN 节点没有该内容缓存,就需要回到源站获取,成为 MISS(未命中)。命中的请求数占总请求数的百分比就是命中率。
- 中间源:位于源站 和 边缘节点 中间的一个回源服务器。中间源服务器可缓存多个边缘节点的回源请求,对同一内容的请求,中间源服务器只需进行一次回源即可将内容分发至各边缘节点,可以降低源站的压力。
- 源站:就是实际的业务服务器,比如你的云主机,或者各大厂商的对象存储等
- 回源:当用户发起一个请求,边缘节点发现没有缓存该内容,则会回到源站去请求该内容。
- 冷资源:如前面所说,CDN 是利用缓存加速,会把资源存储在 CDN 节点,但是由于 CDN 节点的存储容量有限,当存储容量不够后,会按照“最近最少使用”原则,将最近访问的资源中访问频率最低的资源从节点中清除。
- range 回源(分片缓存):一般用在点播和下载平台等大文件分发,将一份文件拆分成若干个小文件回源,减少回源消耗流量。比如一个 500MB 的文件,当开启 range 回源后,客户端发起的请求中含有 range,则源站收到 CDN 的请求中也带有 range,客户端请求多少数据就响应多少数据,对应的 HTTP 状态码是 206,请求中断后也不会再请求。当没有开启 range 回源的时候,客户端发起的请求中含有 range,但是源站收到 CDN 的请求没有带 range,源站会返回完整的 500MB 的数据,会导致回源放大问题,就是 CDN只请求了 10MB 数据,但是源站却返回了 500MB 数据。
- 回源 HOST:回源 HOST 决定了 CDN 节点在回源站请求资源的时候,在源站访问的站点域名,也就是访问到该 IP 上的哪个站点,也就是 nginx 配置中的 server_name。
- 回源协议(协议回源):比如客户端使用 HTTPS方式请求资源,当 CDN 节点上没有缓存该资源,就会以相同的 HTTPS 方式请求源站获取内容。同理如果是客户端是 HTTP 请求,则 CDN 节点也以 HTTP 方式请求源站获取内容。
- 去参数回源(过滤参数):比如你使用两种方式访问同一个资源:https://static.timhbw.com/logo.jpg?test、https://static.timhbw.com/logo.jpg?cdn,可以看到链接后面有?test,这个叫 query 参数
- 如果这个功能开启,则 CDN 节点会使用 https://static.timhbw.com/logo.jpg 向源站发起请求,然后缓存
- 如果这个功能关闭,则 CDN 节点会使用 https://static.timhbw.com/logo.jpg?test 、https://static.timhbw.com/logo.jpg?cdn 分别向源站发起请求,然后分别缓存。