前言

大家可能都有过这样的经历,把博客建立在类似github上面的外网上,然后国内正常的访问方式访问博客,静态资源的加载速度都非常的慢,解决这个问题的方法就是使用CDN,依赖市场上的CDN,可以实现博客的加速访问,接下来就来详细讲述CDN(内容分发网络)的原理。

Content Delivery Network

CDN全称是Content Delivery Network,俗称内容分发网络,它是集中在世界各地的边缘服务器的集合。当你的服务器需要给来自世界各地的用户响应内容的时候,由于距离原因难免会有很大的网络延迟,所以就有人专门在世界各地设置了能帮你转发内容的服务器,并且有专门的人员进行维护。这些服务器叫做边缘服务器,意思就是接近用户的服务器,它们构建起来就是内容分发网络体系。CDN的这些服务器就是近距离给用户发送网页内容的。

分发内容

CDN服务器分发的内容分为两个部分,一个是静态内容,一个是动态内容。
简单的理解可以是长期不需要改变的内容为静态内容,经常需要改变的内容为动态内容,就好比网页中的标题,导航栏等,就是一开始设计好之后就基本不会更改的。而类似于echarts图表这种,可能会随某些操作进行变化的称之为动态内容。
像博客这种大部分都是静态内容的就很适合使用CDN,接下来通过分发流程讲解原因。

分发流程

CDN肯定一开始是不知道源服务器给了什么内容的,就需要主服务器将静态内容提前push到CDN服务器上面,当世界各地的用户需要访问网站的时候,就近的CDN就把内容响应到客户端,这也就是说如果你的静态博客像hexo这样的,在本地发布好才上传的博客,就可以先将静态的内容通过主服务器缓存到CDN服务器上面,这样客户端访问就可以飞快的运行。

如果是动态内容,由于主服务器没办法预测用户会产生怎么样的动态数据,所以也就没办法提前缓存到CDN服务器上面,这样的话CDN的作用就不是很大了,虽然也有CDN能够提高动态的服务,比方说时间。时间是一直变动的,如果一直让主服务器提供时间的动态内容,万一主服务器产生了网络的波动,时间就没办法同步。这时候就可以采用CDN上面的接口。有些CDN会提供类似的时间接口,让主服务器用CDN上面的接口,这样用户就可以直接在CDN上面获取时间,而不是通过主服务器了

CDN的设置无形中给主服务器设置了一道墙,因为访问主服务器的内容就得先访问CDN服务器,这样就能减少或者避免DDOS攻击,但是这样一来就会攻击CDN服务器了。这样的话CDN服务器接受的了吗?

安全性和可靠性

CDN的老板们肯定考虑过这个问题,他们将检测多台服务器的负载情况,如果说某台服务器超载了,那么就把用户的请求移动到没有超载的CDN服务器上面,这种情况也称之为负载均衡。

但是CDN是怎么将这些流量转移到别的服务器的呢?这里值得一提的是这个名为任播的技术,利用它的通信方式,服务器对外都拥有同样的ip地址

如果这个ip地址收到用户的请求之后,请求就会由距离最近的CDN服务器响应,同样的道理,只要使用这个技术,不管你的攻击有多猛烈,都可以将流量转移到没有超载的服务器上面
不仅如此,CDN还会帮你把文件进行最小化或者压缩文档,就和webpack打包之后生成的js/css代码类似,省略掉不必要的字符后都是一行的。
最后正式因为CDN更加接近用户提供服务,大大减小了CDN到源服务器之间的带宽的占用和使用

结语

大部分的镜像源和网站都会使用CDN,比如npm的unpkg,hexo使用的jsdelivr,这些免费的东西最后可能还是会避免不了被禁用的命运。比如后者在国内的驾驶照就被吊销了,只能使用所谓的“附近”节点,导致hexo有段时间直接GG,好在现在笔者所处的位置访问还算ok,可能以后会考虑部署到自己的服务器上面并购置CDN包吧。