什么是内容分发网络(CDN)?

内容分发网络 (CDN),其英文全称为 Content Delivery Network 或 Content Distribution Network,翻译为 内容分发网络,是指一种通过多个地理位置分散的服务器来更高效地交付内容的技术。

具体来说,我们可以把内容分发网络分为两部分来理解:

  • 内容:主要指各种静态资源,包括图片、视频、文档、JavaScript、CSS和HTML文件等。
  • 分发网络:是指将这些静态资源分布在不同地理位置的服务器上,以便实现更快速的本地访问。例如,位于北京的用户可以直接通过北京的数据中心访问资源。

简而言之,CDN的核心功能是将静态资源分发到多个地点,以实现更接近用户的访问,从而加快访问速度,并减轻主服务器和带宽的负担。

可以将CDN比作京东的仓储与运输体系,它在全国范围内建立了庞大的仓库网络。当用户下单后,商品总是从距离最近的仓库发货,确保快速的配送服务。

图片

京东仓配系统

你可以将CDN视为一种特殊的缓存服务,分布在各地,专门用于处理静态资源的请求。

在讨论全站加速和内容分发网络时,需要注意二者的区别。全站加速(不同云服务提供商通常称为ECDN或DCDN)不仅加速静态资源,还可以加速动态资源,而内容分发网络(CDN)主要针对的是静态资源

图片

阿里云文档:https://help.aliyun.com/document_detail/64836.html

大多数公司在项目开发中会使用CDN服务,但自建CDN服务的公司少之又少。考虑到成本、稳定性和易用性,建议选择专业的云服务商(如阿里云、腾讯云、华为云、青云)或CDN提供商(如网宿、蓝汛)提供的现成CDN服务。

那么,很多人可能会疑问:既然可以实现就近访问,为何不直接在多个地点部署服务呢?

  • 成本过高,需要同时部署多份相同的服务。
  • 静态资源通常占用较大空间并频繁被访问,直接通过服务器或缓存处理静态资源请求会对系统资源造成巨大的消耗,从而影响其他服务的正常运行。

在不同地点部署多个相同的服务(如同城或异地灾备、多活等)主要是为了确保系统的高可用性,而非单纯实现就近访问。

CDN的工作原理解析

要理解CDN的工作原理,我们需要搞清楚以下三个问题:

  1. 静态资源如何被缓存到CDN节点?
  2. 如何找到最合适的CDN节点?
  3. 如何防止静态资源的盗用?

静态资源如何被缓存到CDN节点?

静态资源可以通过预热的方式同步到CDN节点。用户首次请求资源时,CDN节点可以直接提供该资源,无需回源,从而减轻源站的压力并提升用户体验。

如果没有预热,用户访问的资源可能在CDN节点中不存在,此时CDN节点需要请求源站获取该资源,这个过程被称为回源

命中率回源率是衡量CDN服务质量的两个重要指标。命中率越高越好,而回源率越低越好。

如果资源更新,你还可以对其进行刷新,以删除CDN节点上缓存的旧资源,确保用户访问到最新的资源。

如何找到最合适的CDN节点?

全局负载均衡(GSLB)是CDN的核心,负责协调多个CDN节点的工作。最常用的方式是基于DNS的GSLB。

CDN通过GSLB找到最合适的CDN节点,具体过程如下:

  1. 浏览器向DNS服务器发送域名请求;
  2. DNS服务器根据CNAME(标准名称)请求GSLB;
  3. GSLB返回性能最佳(通常是距离用户最近)的CDN节点(边缘服务器)的地址给浏览器;
  4. 浏览器直接访问指定的CDN节点获取内容。

为了便于理解,上图进行了一些简化。GSLB内部可以看作是CDN专用DNS服务器与负载均衡系统的结合。CDN专用DNS服务器返回负载均衡系统的IP地址,浏览器使用此IP地址向负载均衡系统请求以找到对应的CDN节点。

GSLB是如何选择最合适的CDN节点的呢? GSLB会综合考虑请求的IP地址、CDN节点的状态(如负载、性能、响应时间和带宽等)来判断返回哪个CDN节点的地址。

如何防止资源被盗刷?

如果资源被其他用户或网站非法盗用,将会导致不小的开支。

为了解决这个问题,最常用且简单的方法是设置Referer防盗链。具体来说,通过HTTP请求的头信息中的Referer字段限制请求。我们可以获取到当前请求页面的来源网站,从而判断请求是否合法。

几乎所有CDN服务提供商都提供这种基础的防盗链机制。

图片

腾讯云CDN Referer防盗链配置

然而,如果站点的防盗链配置允许Referer为空,攻击者可以通过隐藏Referer绕过防盗链。

通常,我们还会结合其他机制来确保静态资源不被盗用。其中一种常见的方法是时间戳防盗链。与Referer防盗链相比,时间戳防盗链的安全性更高。它加密的URL具有时效性,过期后将无法访问。

时间戳防盗链的URL通常包含两个参数:一个是签名字符串,另一个是过期时间。签名字符串一般是通过用户设定的加密字符串、请求路径和过期时间通过MD5哈希算法生成的。

时间戳防盗链示例URL:

http://cdn.wangsu.com/4/123.mp3?wsSecret=79aead3bd7b5db4adeffb93a010298b5&wsTime=1601026312
  • wsSecret: 签名字符串。
  • wsTime: 过期时间。

图片

时间戳防盗链的实现相对简单且可靠,强烈推荐使用。绝大多数CDN服务提供商都提供现成的时间戳防盗链机制。

图片

七牛云时间戳防盗链配置

除了Referer防盗链和时间戳防盗链外,你还可以配置IP黑白名单、IP访问频率限制等机制来防止盗刷。

总结

  • CDN的核心功能是将静态资源分发到多个地点以实现更接近用户的访问,从而加快访问速度,减轻主服务器和带宽的负担。
  • 基于成本、稳定性和易用性,建议直接选择专业的云服务商(如阿里云、腾讯云、华为云、青云)或CDN提供商(如网宿、蓝汛)提供的现成CDN服务。
  • 全局负载均衡(GSLB)是CDN的核心,负责协调多个CDN节点的工作,通常是基于DNS的GSLB。CDN会通过GSLB找到最合适的CDN节点。
  • 为了防止静态资源被盗用,我们可以结合使用Referer防盗链时间戳防盗链

参考资料