木匣子

Web/Game/Programming/Life etc.

木匣子 2019 on S3

一个多月前休陪产假期间,想着好久没写博客了,但 AWS 上还开着个 EC2 ,挺费钱的。不如把博客静态化放到 S3 上面吧!?经过短暂的选型,最终决定使用 hexo 这款基于 node.js 的静态博客系统。原因当然是出自于对 javascript 的喜爱。

于是花了一两周的时间,把十年来使用的三个不同的博客系统(分别是 wordpress/typecho/ghost)导出后整合到了一起。整合的过程虽然借助了一些 exporter/importer ,但是不同平台间还是存在很多差异,最后通过手工编辑修复了许久。好在文章少,时间多。

没想到在试用了一段时间的 hexo 后觉得静态化是如此的美妙:可以直接用文件系统管理 markdown 格式的日志文件,还可以直接用 git 做版本控制。生成静态文件和部署也很容易。

于是又花了几周的业余时间学习 hexo 模板开发,并写了现在使用的这套博客模板(hexo-theme-mutoo),虽然风格朴素(大概是因为设计细胞「用进废退」了吧),但是在一些小细节上还是花了点功夫。

内容和模板都完成后,就到了部署环节了。由于所有内容都是静态文件,得益于 S3 的 static website hosting 功能,可以直接将生成的静态网站整个同步到 S3 的 Bucket 中。然后就可以通过 S3 提供的地址访问网站了。

http://<bucket-name>.s3-website.<AWS-region>.amazonaws.com

同步的工作也很容易,配置好 AWS Cli 后,直接:

$ aws s3 sync ./public s://your-bucket-name --profile s3-user

其中 --profile s3-user 是在 IAM 中预先设置好的用户,并绑定了相应的 Bucket 读写权限。该命令如此简单,以至于不需要为 hexo 专门设置一个 hexo-delopyer-s3 。只要把这一行放到 package.json 的 “scripts” 字段下就行了:

{
  "scripts": {
    "clean": "hexo clean",
    "server": "hexo server",
    "generate": "hexo generate",
    "deploy": "aws s3 sync ./public s3://your-bucket-name --profile s3-user"
  }
}

然后可以通过 $ yarn deploy 进行部署。

S3 默认提供的域名又丑又长,可以考虑绑定独立域名,但是有个缺点就是 S3 服务不支持 https 协议。所以建议使用 Cloudfront 这个 CDN 服务作为反向代理来访问 S3 中存放的页面,同时提供 https 协议支持。

除此之外,Cloudfront 还支持绑定 Lamda@Edge[1] 来实现一些请求的重定向,弥补了静态网站的不足。毕竟重定向对于一个正在迁移重组的网站是非常重要的,可以避免站外的一些老旧链接失效。

静态化博客免去了数据库维护的负担,Cloudfront 免去了证书管理的负担,一身轻松呀!至于价格,对于一个小博客来说,S3 + Cloudfront 真的是超级的便宜。

突然间又重新燃起了写博客的欲望。

Postscript

当时在比较静态博客生成器的时候,把目光局限在 “written in javascript” 上了。最近发现一款用 go 语言编写的静态网站生成器 Hugo 比起 hexo 更快更强大,有很多 hexo 没有的功能。有空来研究一下,看看未来有没有可能迁移到这个平台上,或者用它来制作其它项目。


  1. 一种专为 Cloudfront 服务的 Lamda 分布式脚本