因为最近梯子还是不稳,于是入了个 Linode 的 VPS,Tokyo 的节点,顺便也把 blog 迁到 VPS 上,再上个 Let’s Encrypt 的 HTTPS。
作为 Web Developer,我完全不想折腾 ngnix,所以直接用 node 启个静态文件服务器。
(然而折腾完这个就暂时不想弄梯子了)
Getting Start
Server 选择的 Koa,因为比 express 新。
Let’s Encrypt 对 node 环境有直接支持,主要逻辑在 greenlock
package 里,同时对 express/Koa 还有高级 API 支持,在 greenlock-express
package 里。greenlock
支持通过 SNI 协议区分域名,自动生成证书,还能自动续期,可以说是非常方便。
所以先装依赖
1 | mkdir server |
Problem
然后问题就来了,在编写时点,greenlock-express
有一个 API Breaking Change 的 refactoring,但是 Koa 的文档还没更新,所以只能自己稍微研究下。
以下是配合 express 用的 example(看起来非常简单)
1 | ; |
关键问题在 app
属性上,express()
是个 function,而 new Koa()
就是个普通的 class instance。
Resolution
翻了源码,查了文档,原来 Koa
上有个 callback()
方法,可以获得 httpServer
需要的 function (req, res)
形式,于是只要把 require('express')()...
换成 new Koa().callback()
就可以了(具体 Koa middleware 的配置省略)。
Testing
我的 blog 原来在 GitHub Pages 上,所以 git clone
到 VPS 上。
Let’s Encrypt 会访问域名下的一个文件,来校验域名的归属。所以从测试开始,域名就必须解析到 VPS 上。去我的域名注册商 Hover 那里改一下 DNS 的 CNAME 记录,等 15 分钟 DNS 缓存过期,测试,通过。
测试环境下 Let’s Encrypt 生成的是不受信任的证书。
Publish
需要正式上线的时候,需要把 create()
方法参数里的 server
换成 production
(没错,这是个里技,文档没提,但是看源码,production
会被自动转换成内置的线上地址)。
Let’s Encrypt 的 ACME v2 验证已经正式投入使用了,greenlock 使用 ACME v2 不能再把
server
填成production
,必须使用 Let’s Encrypt 固定的"https://acme-v02.api.letsencrypt.org/directory"
另外如果已经在测试环境生成过证书,默认会被缓存,切换到生产也不会自动重新生成,需要删除 ~/letsencrypt
文件夹。
Ending
打算写这篇的时候,突然 Hexo 不识别我的目录了,hexo init
了一个新目录,对比了一下,我的 _config.yml
怎么没了!
于是只好照着新的重新创建了一个(我的 blog 源文件是没有 source control 的)。
所以哪天这个 blog 因为源文件丢失而挂掉也是很有可能的
顺便吐槽下 hexo generate
输出的文件名颜色和 PowerShell 的底色一摸一样,导致我只能看到一排的 Generated:
,PowerShell 这个色板也是厉害。
PY Trading
作为国际惯例,附上我的 referral code
Hover 的 $2 邀请码: https://hover.com/jXiGdbfU
(才 $2 真抠,.moe
域名现在要 $19/year)
Linode 的 $20 邀请码: 67b0b53411151c9280a53b9800d746ab79bd1df3
(网上到处都是就是了)