CDN 使用初探

Table of Contents

CDN 是什么

CDN(Content Delivery Network),即内容分发网络,是指一组在地理上分散的服务器,它们协同工作以提供互联网内容的快速交付。

CDN 可以快速加载互联网内容,包括 HTML 页面、javascript 文件、CSS 文件、图像和视频等。

使用 CDN 的原因

  • 缩短网站加载时间 - 通过使用附近的 CDN 服务器,将内容分发到网站访问者附近,访问者将能体验到更快的页面加载时间。由于访问者更倾向于离开加载缓慢的网站,CDN 可以降低跳出率并增加访问者在该网站上停留的时间。换句话说,网站速度越快,意味着更强的用户粘性。

  • 减少带宽成本 - 网站托管的带宽成本是网站的主要费用。通过缓存和其他优化,CDN 能够减少源站必须提供的数据量,从而降低网站所有者的托管成本。

  • 增加内容可用性和冗余 - 大流量或硬件故障可能会扰乱正常的网站功能。由于 CDN 具有分布式特性,因此与许多源站相比,CDN 可以更好地处理更多流量并对硬件故障容灾。

  • 改善网站安全性 - CDN 可以通过提供 DDoS 防护、安全证书的改进以及其他优化措施来提高网站的安全性。

具体使用

wu.run 是静态网站,一开始是托管在 GitHub 上,网站里的图片是放在免费的图床上。但是免费的图床不稳定,很容易就不能访问。后来,网站托管在阿里云轻量服务器上,网站的图片也是放在上面,但是服务器的带宽有限,图片较大时,访问体验较差。所以就想使用 CDN 加速图片访问速度。

云服务厂商基本都支持 CDN 服务,这里我选择了七牛云,因为七牛云提供每月 10G 免费流量。使用国内 CDN 服务的前提条件是需要有一个已备案的域名。不同云服务厂商 CDN 服务配置流程基本相同。

添加 CDN 域名

如七牛云添加 CDN 域名,包含三部分:域名配置、源站配置、缓存配置。

域名配置,填写需要加速的域名,这里我是使用二级域名:cdn.wu.run 作为 CDN 加速域名。你也可以使用类似 static.example.com 域名,这样的域名一看就知道大概率是 CDN 域名。

源站配置,所谓的源站,就是 CDN 缓存不存在或者 CDN 缓存失效时,从哪个地方拉取这些文件。这里我使用的七牛云的对象存储作为源站,即图片都存储在对象存储中,CDN 缓存不存在或者 CDN 缓存失效时,从这个对象存储中拉取。当然,源站可以不仅是七牛云对象存储,还可以是源站域名、IP 地址,以及高级设置中设置主备路线。

缓存配置,用于设置缓存时间,即 CDN 缓存文件的过期时间,我这里是使用推荐配置。

添加 CDN 域名解析

CDN 域名创建后,会提示添加 CDN 域名解析。添加 CDN 域名解析的作用就是让 CDN 域名解析到云厂商的服务器,从云厂商的服务器上拿到需要的文件(如图片资源)。如 wu.run 域名是阿里云上购买的,需要到阿里云上添加该域名一条新解析,一般是一条 CNAME 记录。

解析添加成功后,我们探测下 cdn.wu.run 这个域名。

 ~  dig cdn.wu.run

; <<>> DiG 9.10.6 <<>> cdn.wu.run
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42478
;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;cdn.wu.run.			IN	A

;; ANSWER SECTION:
cdn.wu.run.		311	IN	CNAME	cdn-wu-run-idvfzm3.qiniudns.com.
cdn-wu-run-idvfzm3.qiniudns.com. 11 IN	CNAME	dt003.china.line.qiniudns.com.
dt003.china.line.qiniudns.com. 11 IN	CNAME	tinychinacdnweb.qiniu.com.w.kunlunno.com.
tinychinacdnweb.qiniu.com.w.kunlunno.com. 60 IN	A 111.19.241.232
tinychinacdnweb.qiniu.com.w.kunlunno.com. 60 IN	A 111.19.241.238
tinychinacdnweb.qiniu.com.w.kunlunno.com. 60 IN	A 111.19.241.233
tinychinacdnweb.qiniu.com.w.kunlunno.com. 60 IN	A 111.19.241.236
tinychinacdnweb.qiniu.com.w.kunlunno.com. 60 IN	A 111.19.241.239
tinychinacdnweb.qiniu.com.w.kunlunno.com. 60 IN	A 111.19.241.235
tinychinacdnweb.qiniu.com.w.kunlunno.com. 60 IN	A 111.19.241.234
tinychinacdnweb.qiniu.com.w.kunlunno.com. 60 IN	A 111.19.241.237

;; Query time: 12 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue May 09 22:37:24 CST 2021
;; MSG SIZE  rcvd: 283

可以看到,cdn.wu.run 域名 已 CNAME 到 cdn-wu-run-idvfzm3.qiniudns.com。并经过多次 CNAME,直到转发到真正的 CDN 服务器上。

上传文件

因为这里我是用了七牛云对象存储作为源站,所以需要将图片上传到 CDN 域名绑定的七牛云对象存储中,且在七牛云上设置上传文件存储类型为标准存储。设置不同的源站,操作是不一样的。注意,如果对象存储的文件需要被外部访问,即作为 CDN 源站场景下,需要将对象存储的访问控制设置为公开空间。

上传成功后,就可以拿到文件的外链地址,这个地址就可以用于网站上。如 wu.run 网站上大部分图片地址是以 cdn.wu.run 开头的 CDN 域名。

访问控制

网站是公开访问的,其他人可以拿到网站上文件的链接,盗用这些链接用于其他地方,会造成我们 CDN 费用大涨(所以说免费的图床真的是用爱发电)。所以需要设置 CDN 域名访问控制。如七牛云会提供一些访问控制的选项,防止其他人盗链。

比如我这里开启了「Referer 防盗链」,设置了 Referer 白名单,并且 Referer 不能为空,否则只是拿到图片的 CDN 链接直接访问,将会返回 403 错误。

总结

以上是简单了解 CDN,并简单使用云厂商 CDN 服务的例子,更多的使用方法参考各家云厂商官方文档,这里就不再赘述了。