• 该篇目并非教程,仅作为个人经历留档。如果有人感兴趣的话未来可能会出玩转服务器系列的文章。

背景

其实从五年前我第一次建站的时候,就听说过CDN,但是当时才高二,对这些基本一窍不通,自然也是没有深入。当时仅仅是弄明白LNMP就已经够我喝一壶的了,搭建完环境后也只是放了个静态页面。

后来,大一的时候,闲得发慌,就给网站全部重新构建了一下(V1,说实话项目找都找不到了)。虽然也是静态页,不过比原来高级了不少。

再后来,就是大家都知道的新冠疫情了,我们学校整整在家上课了一个学期。当时正好时间多,还遇到了一个机会,酷安上面我的一个上古帖子重新火了,于是为了那个应用集我准备搭建一个开源软件站,这时候我才真正开始学php搭建动态站点。

开源应用站搭完之后,我一鼓作气又重新写了一遍我的博客(V2版本,还在运行,可以直接在导航站进入)。断断续续写了几篇,因为我的技术实在太一般了,文笔也很一般,所以内容很少。大概一年前,我发现了一个非常好看的wordpress主题sakura,于是我就做了个镜像站,也就是现在这个站点。

我的博客截图

我的博客V2版本

现在我在北京工作,说忙也忙说不忙也不忙。有天摸鱼,我发现我有好几个站点我连域名都忘了,心想着这可不行,于是摸鱼的时候下定决心做一个我自己的网站的导航索引站,也就是现在的我的主页

在这个时候,我又想起了以前尝试过很多次都没成功的CDN,于是我又开始研究起来到底怎么才能把这个CDN套上去。

为什么要用CDN

五年前,我的网站服务器部署在美国,国内访问的速度非常慢,查到的办法有的就说是可以套CDN,当时也不知道CDN到底是啥,研究了一下就放弃了。

后来,学了计算机专业,发现这玩意甚至是计网的课内的东西(雾。说白了,网站就是放在一个服务器上的一堆文件。静态页面就是HTML,CSS,JS这类东西,动态网站也不过就是通过相关的Server先编译或计算渲染出态的页面再发送给请求者而已。比如PHP的PHP-FPM,Java的Tomcat(不过还是不一样的,php是动态编译运行,Java是先编译成jar包或者war再运行)。

也就是说,访问者访问网站的原理一定是打开浏览器,DNS解析出域名IP,然后到IP对应的机器上找80或者443端口(输入网址不指定端口的时候)的Web服务器应用(Nginx、Apache),然后怎么编译怎么运行的不去考虑,总之就是Web服务器把相关的文件(可能是HTML类的文件,可能是视频可能是图片)返回给浏览器渲染而已。

所以,这其中就有两个问题,一个是访问者一定会获取到目标站点的IP,知道IP之后能做的可就多了,DDoS,端口扫描等等都是很危险的。抛开危险问题除外,还有一个问题,就是访问者访问网站的速度就完全取决于访问者和服务器之间建立的TCP链路稳定性和速度,也就是说,离得越远,服务器带宽越小,或者请求的文件越大,都会造成严重的延迟、加载慢的问题,大大地劣化使用体验。


CDN可以保证服务器的安全性

这个时候CDN就有所意义了。CDN全称Content Delivery Network,内容分发网络。顾名思义,内容分发网络其实就是将内容也就是文件进行分发的网络系统。简单说就是,本来访问者需要和我的计算机连接从我这里拿数据,但是使用了CDN之后,我站点上的内容会在CDN提供商的多个服务器上缓存,访问者只需要就近请求CDN提供商的服务器就能拿到静态的数据,如果是需要动态生成的数据,则由CDN服务器进行回源请求。这一点和边缘计算还是有一定的区别的,边缘计算可以理解为每个CDN节点上都带有一个服务端应用来进行相应,所以也可以理解为CDN就是不带计算功能的边缘计算。

这样,我们发现,CDN就可以完美解决上面提出的两个问题。域名会先解析(一般采用CNAME)到CDN提供商的CDN泛播服务器上,然后通过其再连接到就近的CDN节点,如果需要回源则是CDN服务器来进行。也就是说,整个过程访问者请求到的所有的IP都是由CDN提供商提供的,访问者永远获取不到网站服务器的真实IP。同时,由于用户请求的是CDN提供商的服务器,这时可以由CDN提供商对流量进行清洗,如果发现是攻击流量或请求则可以直接拦截,大大增强了站点的安全性,


CDN可以加快网站访问

其二,由于大部分静态资源都是缓存在CDN服务器上的,因此会大大减轻源站服务器的压力,因为源站只需要对动态的请求进行解析即可,而不需要将大型文件通过链路返回,不仅减轻了Web服务器应用的压力,而且在国内的网络情况下(带宽资源极其昂贵),有效的减少带宽利用也会剩下不少钱,同时访问者因为带宽阻塞导致的无法访问的情况也会大大减少。

因此,可以发现,使用CDN有两大优势,一是安全,二是加快访问速度降低源站压力减少资源占用。


CDN的必要性

那么,作为个人使用者,我们很多人可能只有一个一年只有几十访问量的小博客,那我们为什么要用CDN呢?问得好,没必要,真的,没必要。。除非你的网站在国外,需要CDN进行加速,否则个人站点是真的完全没必要上CDN的。至于安全性,一个小破博客谁没事闲的来攻击你,我唯一一次被D还是因为当时做我的世界服务器,把官网和皮肤站挂到了自己服务器上才有人来干我。所以说,个人站确实没必要上CDN,不过上了肯定更好,毕竟访问量不多,流量也很便宜,WAF也不贵,玩玩还行。

至于我,我为什么闲的无聊上了个CDN。。因为我一看100G的流量包才20就手贱买了,然后就一直没用,还有半年就到期了,感觉不用就可惜了。。。而且我是真的不需要多少流量,我的图片资源都存在OSS里面,CSS和JS我也都是能放到JsDelivr就放到公共CDN上面,所以半年上下载流量一共也就30来个G,这100G的流量包基本用不完(碎碎念)

1630144001315.png

我换新的服务器之后的流量总和

CDN提供商的选择

现在,知道了CDN的作用,那么就可以着手选择一个CDN提供商了。说实话,我也是在这一步上浪费了好长的时间。


CloudFlare

说到CDN,自然首先想到的就是CloudFlare(CF,谁跟我提穿越火线我跟谁急)还有就是Fastly这类全球CDN提供商(说起来前段时间这两家一个起火一个宕机,整的大半个地球网都炸了)。Fastly不是很清楚,但是CloudFlare我是相当熟悉了,当初某上网工具被墙的时候就用的是CloudFlare做中转(不过速度实在太慢了,建议直接换IP,套这个速度想死的心都有)。至于为什么选择CF,因为它有免费套餐。。

当年就是因为速度太慢我才放弃了CF,这次我又抱着试一试的态度重新捡回了CF用。说真的,CF的配置是真的超级方便,直接把域名的解析DNS改成CF的DNS就直接生效了。而且不仅CDN,CF还提供一堆其他的功能,着实是十分贴心了。

至于怎么配置CF,网上的教程一大把,我这篇只是记录一下我的CDN历程,就先按下不表。总直就是,DNS解析到CF之后,可以选择CDN,SSL管理,DDoS防护等等一系列的功能。和国内的云计算厂商把服务拆的稀碎不一样,CF是能整合的整合,能用简单的方式表达就用简单的方式,新人友好度Max。

不过我试了一下,最后还是没有选择CF,因为国内的访问速度依旧是,慢的离谱。我的源站服务器在北京,正常访问也就200ms左右,套了CF可好,直接变成10s+,我人在北京服务器在北京,结果流量还得去国外溜达一圈,是不是闲的。所以我觉得吧,CF这种,除非人在国外或者服务器在国外,其他情况还是少用的好。

1630144234950.png

CloudFlare定价


CloudFlare争议

不过提起了CF,我就想到了最近沈逸的神奇言论。虽然我确实不关心政治,不过这也太搞了。沈逸发微博说港独的网站都是CF的,意思是CF支持港独云云,下面有人提出质疑,然后直接被群起而攻之,说什么五十万,什么沈逸一个网络安全博士不比你懂技术啥的。我觉得就离谱。先不说他就ping了一下港独的服务器看到是CF的ip(P.S.ping域名是最简单的检查CDN是否生效的办法,但是他直接当成了查源站IP的方法)就说CF反华,还说什么CF就是因为给港独提供投票才出名的。。大哥,全世界一半的网站都在用CF的服务,怎么到你这就是给他们提供投票才出名。然后,至于为什么CF会提供服务,这道理不简单么,因为人家免费啊。CF谁都能注册,谁都能用免费的套餐,那港独不用免费的CF去用死贵的Fastly?人家CF也不知道港独用了自己的CDN啊,就离谱。好比什么呢,一个人网购了一块馒头,噎死了,然后说是邮递员的问题,因为他把馒头寄过来了,所以噎死的,让人家赔钱一样离谱。

我不反对把技术和政治挂钩,但是首先你得把技术研究明白了啊,你要说人家明确反华了再开炮那我觉得你说的好,但是你在这乱开这种低成本的炮,有病?非要让国内彻底网络孤立才开心?我觉得被污名化的公知这个词,说的就是这种人,尤其是现在应大环境而生出来的这种爱国公知,打着爱国无罪的旗号,靠着流量赚钱,真是可悲可泣。


如何选择国内的CDN

回到正题,CF在国内用是不太现实了,速度慢,而且指不定那天就给打成反动派,于是我就把目光放回了国内。

这里要先说一下,为什么我买了阿里云的流量包却还去看别人家的CDN呢,因为不仅CDN要花钱,连HTTPS请求也是要单独花钱的(1551买流量包之前根本不知道),而人家CF,不仅免费,还免费提供15年的自签SSL证书。。看看人家这个觉悟,再看看你,阿里云!

在聊国内CDN之前,我们要先说明一点,就是国内的CDN基本都需要域名备案才可以(除非有一些个人小公司的不用,比如我以前开MC服务器买的雨云,便宜是真便宜,不敢用是真不敢用,三天两头故障,而且他官网的证书也就是个R3的免费证书),所以如果你的服务器在国外或香港,或者用的家宽或者没备案,基本就可以不用往下看了,还是去看看CF吧。

1630144310328.png

雨云的CDN流量包


百度云加速

那么国内有没有免费的CDN呢,别说,还真有。百度云加速(和百度云是俩东西),他们家的CDN是有免费套餐的,而且免费套餐每个月都有10G的流量,说实话是真的蛮良心的。不过经历了我一番尝试,最后还是放弃用百度云了。

首先,你需要做实名验证,还不像阿里云直接调支付宝的验证就行,需要手持身份证照片,有点劝退。而且,注册好了发现,百度云的免费套餐不支持源站IP加速和泛域名解析加速,也就是说,我二十来个网站的一个个加进去,麻烦的要死,思来想去,最后还是放弃了百度云加速。

1630144477705.png

百度云加速,全表去官网自己看


其他一众收费的CDN

最后,绕来绕去又绕了回来,也就是国内那几家云计算大厂,阿里云,腾讯云,京东云,华为云,百度云(不是百度云加速),七牛,AWS中国和Azure中国。至于这几家怎么选择,我觉得还是你的服务器在哪家就用哪家,部署起来比较方便。我就是吃了这个亏,我的域名,服务器,OSS等等一系列的服务都在阿里云上面,结果不得不还得用阿里云的CDN(因为方便),就和苹果的生态似的,可是阿里云毕竟外号套路云,又贵又坑,当知道腾讯云是良心云的时候已经晚了,因为生态已经全在阿里云了。。。

所以,最后我还是选择的阿里云的CDN(阿里云的网站CDN不在CDN里面,叫DCDN、全站加速,阿里云的CDN只是用来缓存静态资源的),然而,麻烦的事才刚刚开始。

1630144562026.png

我的阿里云资源包

部署CDN

解析

现在,原理懂了,服务商也选好了,那么理应CDN部署起来会方便很多吧,并不!(当然大程度上是因为我自己作的)

部署CDN的第一步其实十分简单,就是配置源站解析而已。上面提到,你的域名不是解析到你的服务器上的,而是解析到服务商的CDN域的。阿里云开通了CDN服务之后,第一件事就是建立一个站点,输入源站的域名或IP(因为我是要全站加速所以直接用了IP),配置好了源站后,这时需要把自己的域名解析到他给你的CDN域名上,也就是去DNS云解析

这个时候我遇上的第一个坑,我的网站没用泛解析,是每个站点都单独做的解析,所以我一开始加了泛解析到阿里云CDN后发现无效,因为独立域解析优先级高于泛解析,想了想是把每个解析都变成CNAME,还是删掉,最后我选择了后者。把CNAME解析添加到泛解析上*.utopiaxc.cn,然后把其他的解析全部停掉了,心想着这样总该没问题了吧。

改完之后,用CNZZ的站长工具ping一下,发现确实全国大部分节点已经解析到CDN上了,刚准备收工,然后发现博客打不开了。。。

1630144639237.png

1630144722603.png

这种ping不到真实IP,ping出来的都是阿里云的ip就是正确配置了


SSL

我们都知道,现代浏览器认为https协议是安全的,而不使用SSL的网站被认为是不安全的(基于SSL证书的公私钥非对称加密算法)。这问题就来了,HTTPS的流量是加密的,也就是说,CDN如果想解析流量然后加速,就必须支持SSL。那么就出现了第一个问题,解析HTTPS是需要计算的,像阿里云这么精明的厂商,自然不会放过这赚钱的机会。

于是我去看了眼定价,好嘛。静态HTTPS千万次¥36/年,动态HTTPS百万次¥12.6/年,也就是说这俩还都得买,那也太不值当了,因为本来也没多上请求量。不过还好的是,不买资源包可以用后付费的按请求次数收费,是每万次¥0.05,这就比较适合我了,所以也就没去买资源包。

1630144931692.png

静态HTTPS资源包

1630144992611.png

动态HTTP/HTTPS资源包

1630145042056.png

套了DCDN后我一天的总用量

价格的问题解决了,现在该解决证书的问题了。其他的都还好说,到证书这我傻了。遇到的第一个坑点是,我做的泛域名加速,但是我服务器上用的不是泛域名证书,我服务器上是一个网站一个证,都是用文件验证的解析,所以我没办法把我的证书都放到一个CDN上,我这就直接傻掉,要么只能HTTP,要么就只能走一个站点。

我想这也不行啊,就去找了一下有没有什么办法一个源站配多个证书,看到最多的说的是回源SNI,可是也只能配一个域名,多个证书依旧不起作用。

现在,我面临的两个选择,一个是换泛域名证书,另一个是把CDN拆开。我犹豫了一毫秒就去打开了Google,查:免费的泛域名证书。

结果除了Let's encrypt,没有一家公司提供免费的泛域名证书。而说回Let's encrypt,这玩意的R3证书有效期只签三个月,也就是说,我每三个月还得把证书再上传到阿里云?离谱,但是没办法,CDN已经套上了,再不上SSL证书我的网站都没法访问了,就只能把原来所有的证书都删了,用DNS验证了一个*.utopiaxc.cn证书,放到阿里云托管上去了(说起来很简单,但是其实做起来非常复杂了,就是重复性的枯燥工作)。

1630145579640.png

通过Chrome验证的我的证书


自动部署续签的证书到阿里云

一想到每三个月要上传一次证书我就头大,这要是哪次自动续签之后忘记上传了,那我的网站岂不是直接无法访问了(因为开了HSTS)

于是在GitHub上搜索了一通,找到了几个自动上传脚本(利用阿里云accessKey),研究了一下选择了一个星多的用(虽然也没几个星星)。用的是0xJacky/cdn_cert,但是脚本有些问题,我自己魔改了一番终于是能用了。提了个issue,作者好像修复了,但是我实在懒着再弄一遍了就没更新。

不过这块我也不清楚上传上去的证书会不会直接部署到CDN上,如果不能的话就只是一个自动上传,然后我还得自己去选一下?不过看以前的issue好像是可以自动部署的,先观望一下吧,实在不行就定个备忘,每天看一下过没过期(像个傻子)

1630145912754.png

GitHub Issue

WAF防火墙

上面提到过,CDN还有一大功能就是检测访问并拦截攻击,这里就要提一下阿里云的WAF了,没想到啊没想到,不愧是你,套路云,又得花钱。得,又是个后付费的项目,按小时算的,而且WAF只能防护异常请求,不能防护DDoS(还有个DDoS防护,现在还在测试阶段,估计开放了也要收费)。于是乎我又买了个WAF资源包,价格也算正常,够用就行。

1630176991686.png

WAF资源包定价

其他CDN配置

说起来,阿里云的CDN配置选项还真是不少,这里就不一一说了,要是有人看的话或者感兴趣的话之后我单独写几篇介绍一下CDN的配置。

不过,这块要注意,静态资源可以开防盗链,页面就不要开了,不然没法从外部链接进到网站,CDN会直接报403 错误。

最后

最后吧,我还是不建议大家去部署CDN,一是费钱,二也是因为没啥用。不差钱不差时间玩玩还行,尤其是个人网站,真的没必要。

回顾这么多年研究建站和CDN,有点感慨,怀念过去。就这样。

本篇内容为原创内容,采用CC BY-NC-SA 4.0协议许可
2021-08-28 18:26
UtopiaXC
于北京


尽管如此,世界依旧美丽