VPS, Koa and Let's Encrypt

因为最近梯子还是不稳,于是入了个 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
2
3
4
5
mkdir server
cd server

npm init --yes
npm i koa koa-better-serve greenlock-express

Problem

然后问题就来了,在编写时点,greenlock-express 有一个 API Breaking Change 的 refactoring,但是 Koa 的文档还没更新,所以只能自己稍微研究下。

以下是配合 express 用的 example(看起来非常简单)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'use strict';

require('greenlock-express').create({

server: 'staging'

, email: '[email protected]'

, agreeTos: true

, approveDomains: [ 'example.com' ]

, app: require('express')().use('/', function (req, res) {
res.end('Hello, World!');
})

}).listen(80, 443);

关键问题在 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

(网上到处都是就是了)