说来也巧,上一篇博客刚好写在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: return 301 https: }
|
导入文章
导入文章很简单,用 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);
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方便写博客。