利用CDN加速Github Pages访问

毕业以后,一直没有更新博客。工作这一年多来,愈发觉得应该记录下工作中的思考和感悟,趁昨日假期,折腾了一整天,重新配置了博客,并加入了CDN优化,现在这访问速度,自己都忍不住想多刷新几次。

前言

最最开始我是把Hexo博客双线架设在Github Pages和Coding Pages上,然后在Dnspod上配置国外CNAME到Github Pages上,国内则CNAME至Coding Pages。那时Coding Pages的访问速度确实也挺好,只是后来Coding Pages引入了跳转广告,之后我就撤掉了在它上面的部署。 随后腾讯云推出了折扣的云主机服务,我就买了三年的服务,在云主机上部署了git及nginx。虽然这台云主机的带宽只有1Mbps,但是对于我这小站来说,完全够用了,访问速度也是十分的优秀,后来我还在腾讯云上申请了SSL证书并配置了https服务。 在今年之前的某个时候,我想更新一下博客,但由于毕业的时候我丢掉了之前的ssh秘钥(这也是我中间一直没有更新博客的原因之一。。。),随后在腾讯云上添加新秘钥时又出错,机器连接不上,后来只好重置了腾讯云的主机,然后重新部署了Github Pages(不要问我为什么不重新部署在腾讯云上,因为心累),记得那时Github Pages还不支持自定义域名开始https,因此网站也堕落回了没有锁的状态。 直到昨天,我决定重新开始维护博客。

更新Hexo及Next主题

首先是更新HexoNext主题到最新版(目前分别对应3.9.0和7.4.0)。但是更新之后,我发现首页和正文的字体相比以前变得异常的大,随后通过更改next目录下的_config.yml中的font配置解决,设置此处的size为0.9(非直接设置字体大小,像是设置显示的放大倍数,根据注释猜测基数是16)。

1
2
3
4
5
font:
global:
external: true
family: Lato
size: 0.9

开启Https

开启https这一步就很简单了,目前Github已经支持自定义域名强制开启https,在repo的setting下找到Enforce HTTPS并打上勾即可。 在我第一次开启的时候,发现应该打勾的地方是灰色状态无法勾选,后来搜索之后,发现先删掉Custom domain内的域名,保存一下随后重填即可勾选上。此时已经可以通过带https的域名访问博客了。

使用CDN加速js及CSS文件的访问

Next主题引用了大量的js及CSS文件,我们可以配置国内的CDN来加速这些文件的访问,我主要使用的是BootCDN提供的服务。在Next配置文件中找到vendors设置,将CDN的链接配置进去即可。如下图所示:

1
2
3
4
5
6
# jquery: //cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js
# fancybox: //cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.js
# fancybox_css: //cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.css
jquery: //cdn.bootcss.com/jquery/3.4.1/jquery.min.js
fancybox: //cdn.bootcss.com/fancybox/3.5.7/jquery.fancybox.min.js
fancybox_css: //cdn.bootcss.com/fancybox/3.5.7/jquery.fancybox.min.css

注意:如果注释中写的链接指定了版本,则在BootCDN中也最好使用对应版本的镜像链接,否则网页显示可能出错。

配置CDN服务进行全站加速

此时网站的访问速度有一些提升了,但还不太理想,毕竟每次都需要请求Github远在国外的服务器。由于之前我的网站已经进行过备案,因此可以使用国内的CDN服务(国内的CDN服务基本都要求网站需要进行过备案,没有备案的同学可以尝试使用Cloudflare等提供的CDN)。大体搜索了一下,腾讯云和又拍云有提供免费的支持https的CDN(当然各有限制)。 ### 配置腾讯云 出于对腾讯云大品牌的信任,我自然先选择了腾讯云(然后后来发现这是一个错误。。。)。 配置腾讯云的CDN本身很简单,进入域名管理处,添加域名,进行一些基本配置即可,下面记录一下一些关键的配置。 源站信息填写Github提供的IP地址即可:

1
2
3
4
185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
回源配置填写网站绑定的域名(对我而言是tang.su)。 在高级配置中找到HTTPS配置,打开强制跳转HTTPS,设置301跳转。 随后点击右侧的前往配置,并编辑证书,回源方式选择协议跟随(因为在Github里我们已经打开了强制https,如果使用http协议回源会失败)。 HTTP2.0配置SEO优化配置下的开关也都可以打开。

配置了这些之后,我们能拿到腾讯云提供的CNAME地址,去Dnspod上绑定一下即可。 我设置的是国外地址CNAME至Github,国内CNAME至腾讯云提供的CDN地址。 见证奇迹的时刻到了,强刷网页,咦?好像并没有怎么变快?再刷,好像又变快了,到底怎么回事?点开开发者工具,发现第一次强刷网页时网站载入很慢,header内的信息显示的Hit From Upstream,即没有命中缓存。但此时再重刷会发现能命中缓存,然后速度也快了很多。但是没有命中缓存的时候,网站的访问速度还不如我直接访问Github!当然,不如直接访问Github Pages是正常的,毕竟多了一道中转,需要腾讯云从源服务器去拿数据,但是这个访问速度慢的有点太夸张。在我昨晚几个小时的测试中,未命中缓存时经常需要十多秒才能打开博客内的某个网页。我开始一直怀疑是我腾讯云内的设置有问题,于是翻来覆去的检查试验,最后也没发现什么问题,只好承认就是这个速度了。

配置又拍云

配置好腾讯云CDN之后的速度实在难以令我满意,后来抱着尝试的心态又去注册了又拍云。配置又拍云CDN的方式没有什么不同,创建服务,源站设置回源 Host与之前设置保持一致,同时配置好HTTPS证书,并强制HTTPS访问。 需要说明的是,又拍云也提供了免费的HTTPS证书申请服务,但是我半夜申请了之后,发现需要人工审核,我又急着使用,于是把之前腾讯云的证书下载了下来,并导入了又拍云。 导入方法: 在腾讯云下载证书解压之后,Nginx目录下会分别有一个.key.crt结尾的文件。用文本编辑器打开这两个文件,将.crt内的内容全部复制至pem 证书内,将.key全部内容复制至私钥内导入即可。 全部配置好之后,同样可以拿到又拍云提供的CNAME地址,将Dnspod内的解析更改至又拍云的地址即可。

见证奇迹

这个时候我又尝试访问了一下,发现速度比以前快很多,而且在博客内的各个页面跳转及强刷的速度都很快。我没太从又拍云返回的header信息中看出是否命中CDN缓存,但是目前看,无论有没有命中缓存,速度都比之前使用腾讯云CDN时快很多,强制刷新首页也能在两三秒内加载出内容,总之我自己十分满意。

后记

直到现在(这句话好像显得已经过去了很久,然而并没有),我也没弄明白使用腾讯云的时候加速效果为什么那么不明显,但是总之,目前使用又拍云做CDN的效果令我满意,然后也加入了又拍云联盟计划,我当然不会告诉你其实就是在页面底部挂个又拍云的logo就可以了。。。等审核通过之后,以后每个月会有15G的CDN流量,当然是远远超过我实际所需了。