个人博客CDN选型和进阶玩法指北
网上几乎所有的文章都直接忽悠上CDN的车,难道上CDN就是提升速度的最优解?在CDN这条弯路上折腾了快两年,玩了一圈免备案的CDN,踩了各种各样的坑以后,恍然大悟,茅厕顿开,便在此大放厥词写下此文。本文主要介绍CDN的正确用法,以及性价比爆炸,便宜又效果好的网站加速方案。
TL;DR
在以下前提下,上CDN不如把网站搬到24块一个月的腾讯云香港轻量服务器
- 回源稀烂
- 不考虑国外访问
- CDN本身不太行
- 腾讯云香港还没有被玩坏
已知的性价比最高的方案是Azure CDN (Microsoft Standard) + GitHub Pages。但网站本身才是影响访问速度的大头。
注:本文讨论的前提站长懒得备案。如果备案了,毫无疑问国内回源+国内CDN能吊打上述方案。
上CDN一定提速吗?
啊这里有人可能会问了:“这个问题有必要问吗?”但仔细思考一下,免备案的CDN边缘节点最近就在香港,考虑到边缘节点是个公交车,还要服务别人,线路不一定比腾讯云的强。更令人智熄的是,基本上个人博客可以和访问量大不到哪去画个等号,你的网站被挤出Cache可太正常了,Cache Miss一下延迟就更爆炸了。无脑上CDN后发生的大概率事件就是CDN打不过三网直连的24块钱的腾讯云香港。
那怎么样才能让CDN搞快点呢?当然是头痛医头脚痛医脚,
- 回源问题:弄一个好点的源站就好了,当然CDN本身的Cache策略和能力也非常关键
- 边缘节点承载能力的问题:弄一个好点的CDN就好了嘛
所以问题就被简化为回源和CDN的选择问题了。
源站的选择
弄一个好点的源站,说着容易,实际上源站的选择还是很讲究的。
源站的类型
对于静态网站(如Hexo)来说,源站除了可以搭建在VPS上,更建议扔在对象存储上,因为
- 更高的SLA:自己的VPS维护不当崩崩崩可太常见了,对象存储的SLA动不动就是99.9%以上
- (可能)更高的性价比:个人博客一般不会太多空间,除非存了一堆视频。性能上可能有大厂的神秘优化
- Azure Blob Storage:实测每天大概0.1-0.2美元,小贵
- AWS S3 Bucket:免费额度应该能cover,计费也比Azure便宜
对象存储的缺点主要是
- 第一次配置比较复杂,企业级的云通常需要反复折腾IAM权限
- 为了忽悠你买CDN,对象存储对换用自己的域名和HTTPS的支持多少会有问题
- 有坑(如果用一个厂家的全家桶的话坑会少一点)
- Azure的官方文档就不会告诉你上传到\(web文件夹(容器)的\)在Linux下要转义
- AWS的S3 Bucket不兼容GeoDNS
- ...
不过调通了以后同步对象存储数据就像用网盘一样简单(因为这就是个网盘)。
地理位置选择
之前也提到了,个人博客上CDN就要时刻准备好Cache Miss回源,所以缩短边缘节点从源站下载数据的时间非常的关键。解决这个问题最好的思路应该就是缩短边缘节点到源站的地理距离,最好在同一个地区,因为
- 更短的延迟:这个没啥好说的,光速再快,理想情况下数据在中美之间走一圈都140毫秒起步
- 更大的带宽:一般来说城域网之间通信的带宽比国际线路的带宽大多了
另一个好处就是,因为只需要考虑同地区内的通信,所以源站的国际线路质量完全不需要考虑,什么CN2 GIA都完全不需要,源站能通网就行。
由于一个源站只能照顾一个地区,如果只考虑国内访问的话,一个香港源站应该就足够了。但如果要
- 照顾全世界的人民
- 照顾开着美国梯子的自己
- 刷高PageSpeed分数来优化SEO(谷歌应该是从美国访问你的网站)
,就可能需要不止一个源站了。
多地区延迟优化
多地区的优化是玩具级解决方案和企业级方案的分水岭之一,为啥这么说呢,因为从相关服务的定价来看,基本上云厂家就没考虑过个人玩家的死活。对于CDN来说,就是配置多个源站(这既是为了降低延迟,也是为了容灾),让CDN能根据访客的位置选择最近的源站。这大致有两种实现
- CDN自身支持多个源站并能选择最优的
- Azure Front Door直接支持多个后端,并且可以自动根据延迟选择后端
- Azure CDN (Standard Microsoft)的Rule Engine可以为不同地区指定一个源站
- (GeoDNS)让DNS根据地理位置将域名解析到不同后端,CDN通过这个域名回源。支持这个功能的DNS有
- Azure Traffic Manager:大概4港币增加一个源站,30港币每百万解析
- AWS Route 53:看到每月几十美元一个Policy Record后就没继续了解了
- DNSPod(腾讯云):360rmb每年,不乐意了
- 阿里云:免费版能按国内外区分(可香港也算国外,这没有区分度啊),从198rmb一年的企业版开始可以细分国外的国家地区
我都要!但我没钱咋办
多个源站,GeoDNS都是烧钱的东西(企业人傻钱多不在意),那普通人咋办?这里就要介绍这个无敌的存在了,GitHub Pages。这玩意除了能免费给你存东西以外,还安排上了Fastly CDN。GitHub Pages的架构我们不得而知,但从测速结果来看,很多地方的测速点测出的访问延迟都很低,应该是有做数据的geo-replication。也就是说DNS不用买,多地区存储也不要钱,唯一的毛病就是国内访问比较随缘,但作为CDN的源,这个毛病无伤大雅。而且像Hexo这种静态博客,甚至有插件能一键同步博客到GitHub Pages上。
CDN的选择
国内访问速度
根据我这两年来的观察,我主观的将我用过的CDN按照国内访问速度分为几个等级。
- T0:能和腾讯云香港五五开
- Azure CDN:反正就不知道为什么它的香港节点又稳又快
- T1:不一定能干过腾讯云,但可能跑得赢CN2美国VPS的
- AWS CloudFront
- UDomain
- CloudCone
- 这三家都有香港节点,但是表现属于时好时坏的那种
- T1.5:可能跑得赢辣鸡线路美国VPS的
- Cloudflare:免费的还要什么自行车,主要是免费版没给香港节点,但美国节点的表现不算差
至于国外网站访问速度估计大家都差不太多。
定价
- T0:看看就好
- Azure Front Door:背靠Azure CDN (Standard Microsoft),一条Rule也就每月170港币(至少会有一条,躲不掉的)
- T0.9:勉强可以接受
- AWS Lightsail Distribution:背靠CloudFront,5美元50GB,但可惜用不完
- T1:穷人友好
- Azure CDN (Standard):真正的按量计费,1港币1GB,5条免费Rules,Azure少数不贵的东西
- CloudFront:按量计费,0.12美元1GB
- UDomain:按量计费,1.2港币1GB,充值的方式很怪,非常不现代
- CloudCone:按量计费,0.045美元1GB,需要首充20美元的样子
- T2:博爱
- Cloudflare:套餐0元起步
结论
结论其实很明显,我肯定首推Azure CDN (Standard Microsoft),因为Front Door这个价格就离谱,其他家的CDN会让你怀疑为什么要花这个钱买个减速器(当然CloudFlare配合廉价美国VPS能省钱)。当然Azure确实比较高冷,首先得有张外币卡,然后就是各种问就是企业级的设计,以及莫名其妙的设计,比如说对根域名不友好,CNAME验证各种不通过,官网文档只会让你去买他家DNS,用cdnverify
绕过的方法就是不说,也不给根域名自动签TLS证书(AWS就可以);不可以CDN前端用HTTPS后端HTTP(Front Door倒是可以)等等。但没办法谁让他家CDN国内访问就是快,看在价格不贵的份上原谅他了,免费5条规则也算良心,可以拿来配HTTPS强制跳转和HSTS,虽然这些东西可能在别家CDN面板上一键就能配好。
Summary
Azure CDN (Microsoft Standard) + GitHub Pages这套方案可能比较绕,但一个月花不了几个钱(估计5rmb不到)速度又倍棒。不过还有一个问题值得思考,上这套方案就能让网站访问速度无人能敌?其实不是,从谷歌PageSpeed的分数看来,我从单回源(新加坡)+AWS CDN换到上述这套方案,PageSpeed也就提升了3分左右(国外访问速度)。另外提升的20多分靠的是对网站自身的调整,如减少了外部文件的加载数量。我曾今遇到过一个高度优化的网站,哪怕用的是Cloudflare,走国内国外网络的PageSpeed都是满分(用Chrome Lightroom测试)。
写到这里我才意识到这套方案最大的意义是给我省了一点钱,比起上腾讯云还便宜了不少,顺便提升了国内访问速度。