跳到主要内容

cdn 入门

· 阅读需 7 分钟

抽空好好研究了下 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 处理。这就需要后端进行一些配置了。