博客搬家 Hexo

说来也巧,上一篇博客刚好写在3年前,也是一篇替换的。

博客没写几篇,虚拟空间却已经被垃圾日志塞满,续费通知又来了,想想还是换个地方吧。

博客系统选择

WordPress 是不想继续用了,这么多年又出来好多博客框架可以玩一玩了。目标是支持 Markdown,导入 WP 历史文章。

首先尝试的 Ghost,商业化了,各种支持肯定更好。搭完了发现不太稳定,还以为是我的VPS太弱鸡(其实不是),就放弃了。

又尝试了 Hexo, 各种简洁,非常喜欢。当然遇到的问题还是不少,一路披荆斩棘,或者绕路,总算定型了。

稳定性问题

一番观察+思索后,锁定了博客不稳定的原因是 tls-shunt-proxy。作为 trojan 前的分流器,它承担了超出它能力范围的工作。打开一个页面,起码10个SSL请求,它忙不过来了。解决方法就是让它退居二线,让Nginx顶上去。

nginx 通过 ssl_preread_server_name 区别不同域名的流量,转发到不同的端口。科学上网专用域名的流量转给 tls-shunt-proxy (其实可以省了), hexo 静态文件一个端口,其他转发服务再一个端口。

1
2
3
4
5
6
7
8
9
nginx
├── hexo
├── other (redirect)
│ ├── nas
│ ├── gitea
│ └── webcam
└── tls-shutn-proxy
├── static fake site
└── trojan

SSL证书

为了实现上面的SNI转发,SSL是少不了的,可是那么多域名一个一个搞太麻烦,直接搞个泛域名证书。

1
acme.sh --issue -d zrenx.com -d *.zrenx.com --dns dns_cf 

HTTP 跳 HTTPS

找到两种跳转方式:

1
2
3
4
5
server {
...
#rewrite ^(.*) https://$server_name$1 permanent;
return 301 https://$host$request_uri;
}

导入文章

导入文章很简单,用 hexo-migrator-wordpress

导入评论

Valine比较简单,设置却走了很多弯路。

  • Valine.min.js CDN要换一个
  • LeanCloud 要设置安全域名
  • Valine 配置 serverUrls,要用 LeanCloud 绑定的域名,不然CORS错误

导入历史数据也挺麻烦,自己写了个脚本从Wordpress导出的xml里提取了,写成一个json文件,LeanCloud 结构化数据就能导入了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import fs from "fs";
import { XMLParser } from "fast-xml-parser";

import { dirname } from "path";
import { fileURLToPath } from "url";
const __dirname = dirname(fileURLToPath(import.meta.url));

const comments = [];

function parseComment(wpc, postUrl) {
const time = new Date(wpc["wp:comment_date"]);
return {
nick: wpc["wp:comment_author"],
mail: wpc["wp:comment_author_email"],
link: wpc["wp:comment_author_url"],
ip: wpc["wp:comment_author_IP"],
insertedAt: {
"__type": "Date",
"iso": time
},
updatedAt: time,
createdAt: time,
comment: wpc["wp:comment_content"],
url: postUrl,
};
}

const xmlparse = new XMLParser();

const xmldata = fs
.readFileSync(__dirname + "/WordPress.2023-10-23.xml")
.toString();
const data = xmlparse.parse(xmldata);
//console.log("posts", data.rss.channel.item);
data.rss.channel.item.forEach((post) => {
const postUrl = post.link.substring(16);
const wpcs = post["wp:comment"];
if (wpcs ) {
if (wpcs instanceof Array) {
wpcs.forEach(wpc => {
comments.push(parseComment(wpc, postUrl))
});
} else {
comments.push(parseComment(wpcs, postUrl))
}

}
});

console.log("comments", comments);
fs.writeFileSync("comments.json", JSON.stringify(comments), 'utf8');

写作

Hexo 怎么写博客呢,试了几个后台管理插件,都不理想。
SSH 我熟,Markdown 容易写,结合起来却不怎么方便了。
最终想到我天天在用的VS Code,两个插件搞定了。Remote - SSH直接管理远程文件,Hexo Utils方便写博客。