CDN(Content Distributed Network)是内容分发网络的缩写。
由于 Github Pages 的速度一直不怎么样,今天就想起来要加速一下;本来 Pages 就是静态博客,加个 CDN 就得了。刚开始还想找个免费的蹭下,后来发现还要认证就算了,还是直接上阿里云比较省心,全家桶。
这一两年还算补了下网络知识,发现很多东西都是旧瓶装新酒罢了,CDN 也不例外;CDN 本质上就是分布式缓存服务器,为客户的服务器分摊流量压力。
以下这张图是从阿里云文档里扒出来的。
原理
如上图,用户要访问https://www.a.com
。在https://www.a.com
使用 CDN 服务之后,跟普通的请求的差别其实不大。
-
用户访问
https://www.a.com
; -
本地 DNS 根据返回该域名事先设置好别名(
CNAME
); -
本地 DNS 向 DNS 调度系统查询最合适的节点 IP;
-
向用户返回节点 IP;
-
用户向节点请求;
-
如果节点不存在缓存,则转发给源站(真正的内容提供商),如果存在缓存且缓存有效,则直接返回缓存;
-
节点根据缓存策略进行缓存;
-
返回内容给用户;
这里的关键就在 DNS 调度系统,DNS 调度系统会选出最好(根据 IP 所在地等信息进行判断)的 CDN 节点 IP 给用户;
这里要提下,有一种负载均衡策略就是通过 DNS 来做的,事先为域名生成多条 A 记录,用户访问时,DNS 服务器就会从这些 A 记录中随机(这里不太清楚具体的选择策略)选出一个,这样就能达到用户分流的效果。DNS 负载均衡策略主要存在以下缺点:
- DNS 是多级解析的,每级都可能进行缓存;
- 无法监控服务器状态;
- 负载均衡策略过于简单;
我们在购买 CDN 服务时,其中一个步骤就是将目标域名解析为云服务商私有域名的别名(CNAME
),这应该最关键的配置了,只有将域名映射到云服务端私有域名上,才能对流量进行控制。
阿里云 CDN 服务
下面就简单说明一下为 Pages 添加 CDN 的步骤,我用的是全站加速(其实是由于普通的 CDN 总是 301 重定向,目前还没找到原因,迫不得已用的全站,不过步骤基本一样)。
-
添加域名信息;
其中加速域名,就是希望资源加载速度能快点加载的域名;但这里要注意,不是实际要访问的域名,而是用来该问加速资源用的域名,例如为
https://pages.github.io
中的 css, js 之类的资源分配的资源域名https://pages-cdn.github.io
。之所以要跟实际访问域名区分开,是因为实际的域名已经对 DNS A 记录了,不能再添加 CNAME 记录。源站信息也是要注意的,源站可以是资源所在服务器的 IP 或者域名,当然,跟以上的加速域名是不一样的。
-
等审核完,会出现一条记录,需要我们添加一条域名解析 CNAME 记录,云解析这里就不细说了。
-
这里还有个回源配置的回源 Host以及静态协议跟随回源要设置一下;这里的回源 Host是用来指定主机的,由于服务器可能存在虚拟主机,所以需要用域名指定主机,HTTP/1.1 的 Host 头部一个道理;注意,如果是 HTTPS 的站点,CDN 也必须要配置 HTTPS,阿里云上的 HTTPS 设置中就有免费的,申请后等一下审核就行;
-
最后一个关键步骤就是将需要缓存的目录、文件和缓存时间进行设置。
除了第一次访问慢点之外,后面访问的速度还不错。