cdn 入门

抽空好好研究了下 cdn,算是小有收获。

在研究期间,接触了阿里云,腾讯云,七牛云。这三个都很好,不过阿里云是需要付费才能使用的,腾讯云和七牛云都有免费额度。在协议上,基本上 https 流量都是收费服务。此外,七牛云可能有些特殊,它的对象存储域名访问是和 cdn 绑定的,所以一开始我也绕了很大的弯路。

这里,我只讨论 cdn,先不考虑对象存储。

cdn 是什么

维基百科对其的定义是:

内容分发网络(英语:Content delivery network或Content distribution network,缩写:CDN)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

简单来说,就是提供数据分发的服务器。你有一个数据要分享,只需要交给它,它可以帮你完成分享给多人的过程。

一般的,cdn 服务商都会在国内部署大量节点。每个用户访问 cdn 域名时候,会自动匹配离他最近的节点(速度最快)。

比如,你有一个文件想要分享,但是你的服务器在北方地区,南方地区访问很慢,此时需要 cdn 支撑。把你的文件交给 cdn,由它负责快速的分享给朋友们。而且,一般 cdn 默认提供默认的 http 和 https 域名供使用,也可以自定义域名使用。

cdn 简单原理

上面已经说到,cdn 厂商会在各个地区增加节点,让用户直接连接最近的节点,起到加速作用。

具体的加速流程也很简单:

假设网站地址 yukapril.com,部署在北京,期望访问 cdn.yukapril.com 进行加速。

配置好以后,东北用户 A 访问 cdn.yukapril.com 资源,自动路由到最近的东北节点。此时东北节点没有需要的资源,只好访问网站 yukapril.com 先获取一下(这个过程叫做回源),再分发给用户。

此时 A 用户感觉速度不一定快,还可能变慢了,因为原本 A 用户可以直接访问北京的服务器,现在由东北的一个节点服务器负责代理传输数据了,这个过程可能快可能慢。

之后,东北用户 B 在访问 cdn.yukapril.com 相同资源后,由于东北节点存在当前资源,所以直接返回了,用户 B 感觉速度快多了。

cdn 没有相应数据的时候,就会回源查询。

每个资源都有自己的缓存时间,超过这个时间,cdn 也会进行回源查询。

所以,cdn 解决的是相同地区第二次几以后访问的速度。除了第一此外,其余访问均可以通过 cdn 缓存进行处理,减少了服务器出口带宽压力。

所以,常见的场景是:

  • 你的服务器访问比较慢,比如服务器在国外,或者国内距离客户很远。
  • 你的服务器带宽很小,出口流量不能支持多人同时访问,比如是 1M 带宽主机。
  • 服务器没办法配置 https(ssl),比如是虚拟主机,此时用 cdn 做 https 代理。

使用 cdn 的流程

在服务云厂商注册后,建议查看下具体的 cdn 自费,不同厂商计费方式都可能有一定出入。

一般来讲,cdn 计费主要有包含:用户访问 cdn产生的上下行流量费,以及 cdn 访问你的服务器的回源费用。不同服务商可能会有免费策略。

这里不考虑任何费用问题,只考虑如何接入和使用 cdn。主要需要三点:

  • 域名接入
  • 配置回源地址
  • 配置加速内容的策略

这三点有的厂商在第一步时候就进行配置,也有在后续流程或者详细设置中配置的。

具体实践

下文以七牛云为例子进行配置

假设原域名是 yukapril.com 服务器在国外,访问慢。你希望对中国用户进行提速,提速 cdn 域名为 cdn.yukapril.com

图片供参考,内容以实际为准。

img

  • 加速域名:就是填写加速后的域名,这里我填写 cdn.yukapril.com

  • 通信协议:一般就是 http,如果你需要 https 也可以。这里配置 https 后,需要添加证书,可以是在 cdn 厂商购买(可能有免费证书),也可以是自己已有的证书。这里配置 https,不限制源站必须也是 https,所以这样配置 cdn 可以起到对源站 http 协议进行一次加密传输的效果。此外注意查看 https 计费

  • 源站配置:

    • 基础设置,一般使用源站域名或者 IP 地址,而且有的厂商支持多域名多 IP 方案。后续文章我会说到对象存储,届时可以选择云存储。
    • 源站域名:就是 cdn 没有资源的时候,去哪里获取。此处就是填写自己的网站。
    • 回源 HOST:这个需要说下,cdn 没有资源的时候,会去“源站域名”的网站获取,但是请求数据需要有主机头。如果不填写,默认是用 cdn 地址代替。鉴于省事,所以回源 HOST 就和“源站域名”一致,这样源站服务器不需要额外配置主机头(域名绑定)。详细说明见下文。
    • 源站测试:这个好像只有七牛云有,需要确保你的服务器有一个测试文件而已
  • 缓存配置:主要进行控制每个路径、资源的缓存策略,不同厂商不同。基本上常用“遵循源站”,如果源站没有缓存策略,这里必须配置,否则每个资源都不缓存,cdn 没有起到作用。

回源 HOST

一个服务器的一个端口,可以配置多个主机头,不同的主机头可以对应不同的网站。主机头相当于一个访问网站的标志。

访问 yukapril.com 服务器 80 端口,但是主机头是 cdn.yukapril.com。此时就要额外配置主机头 cdn.yukapril.com,否则服务器找对了,但是没有对应主机头信息,也不能访问网站。

配置好以后,会给出一个 CNAME 地址,要求把 cdn 域名(cdn.yukapril.com)配置到此上面。

之后就是稍微等待下,一般不会很久。访问 cdn 资源后,直接可以显示原来的内容。如果查阅自己的服务器日志,应该只有第一次的访问记录。

cdn 缓存的刷新

cdn 数据一旦缓存,除了缓存到期,否则就不会在回源查询了。如果我们的资源有了问题,更新后,此时 cdn 还是老数据…

这时候就需要对 cdn 缓存进行刷新了。目前所有的厂商都支持 cdn 缓存刷新功能,但是刷新频率都有限制。

刷新上,支持资源文件级别的精准刷新,也支持目录级的刷新。基本上刷新后半分钟左右都可以见效。

cdn 与前端的结合

cdn 可以支持全站 cdn 和部分资源 cdn 两种形式。

全站 cdn 就是所有流量都走 cdn,其中包括访问页面等。这样配置时候,需要注意缓存配置,页面不缓存,其他静态资源视情况而定;对于地址参数上,需要注意不能忽略。而且,可以把 cdn 地址配置成主站域名,把源地址配置为其他域名。

部分资源走 cdn 比较主流,仅仅是对图片 css,js 文件进行 cdn 加速。一般还会和对象存储进行结合。主要问题在于 js 资源发送 ajax 会跨站,此时需要对接口进行 CORS 处理。这就需要后端进行一些配置了。