重回github pages

之前折腾的各种vps,包括vultr、HostUS、DigitalOcean等等,由于一些不可抗力,服务器开始都还很流畅,过一段时间就几乎不可访问了,ping值高达300多ms,ssh基本连不上!据说,某墙采用了流量探测的方法,发现异常流量也会直接搞得你不可用;还有就是坑爹的电信网,对国外出口流量本身就有限制,导致基本在家不可用。

最终一怒之下,还是把blog迁移到比较稳定可靠的github pages上来。


Github Pages 和 Hexo

github pages是github提供的一种空间托管服务,但是只能托管静态文件,对于写博客足以,静态文件支持html、css这些常见的网页件,markdown文件、jekyll文件,并不支持PHP这种动态脚本。虽然直接用jekyll也可以写静态博客,但是我发现jekyll对markdown的解析不是很好,相比而言hexo对markdown的解析更到位,至少我把之前在简书上写的markdown文章用hexo解析是好的,用jekyll解析的一塌糊涂。

使用hexo做静态博客有个比较麻烦的地方是,hexo本身的博客源码是基于node.js的,直接将源码放在github上是不能解析的,必须用命令

hexo generate

生成public文件,public文件里面是html、css文件,然后将其部署到github的username.github.io项目的master分支下,或者其他repository的gh-pages分支下,同时在source目录下添加CNAME文件(CNAME里面记录自定义的域名),这样hexo会把CNAME文件放到网站根目录下。我自己的处理方式是,在blog项目的master分支下保存博客源码,在gh-pages分支下保存html、css等静态文件。

hexo支持直接部署在github上,但是每次都会覆盖提交历史,因为hexo是force的方式进行push,在_config.yml添加如下配置

1
2
3
4
5
deploy:
type: git
repo: git@github.com:yuanwhy/blog.git
branch : gh-pages
message : yuanwhy-blog update {{ now('YYYY-MM-DD HH:mm:ss') }})

执行deploy命令

hexo deploy


自定义域名与CNAME原理浅析

这里简单地解析下github pages的基本原理,以笔者的域名yuanwhy.com为例,我们在访问yuanwhy.com的时候到底发生了什么?

1
2
3
4
5
6
7
8
9
10
GET / HTTP/1.1
Host: yuanwhy.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

这是我在chrome浏览器里输入yuanwhy.com的时候,通过F12观察到的请求头header,注意在header里面有一个字段host,github的服务器正是通过host来判断应该向浏览器返回一个什么样的html页面。当然前提是我得把yuanwhy.com这个域名建立A记录指向github提供的服务器地址。

github知道请求是要获取yuanwhy.com的首页,但是应该去哪个repository里面找呢?这个时候我猜测,github服务器肯定有数据库存储了yuanwhy.com和repository的对应关系,这个对应关系肯定是我在向blog项目的gh-pages分支添加CNAME文件的时候建立的,注意必须是gh-pages分支才会触发这个关系的建立,或者yuanwhy.github.io项目的master分支也同样能触发。

但是这里有个漏洞,如果我在自己项目的gh-pages的CNAME文件写上了别人同样指向github服务器的域名,那么他的域名会不会访问到我的repository上?哈哈,有待验证!