个人博客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测试)。

写到这里我才意识到这套方案最大的意义是给我省了一点钱,比起上腾讯云还便宜了不少,顺便提升了国内访问速度。