【乐享】从WordPress迁移到Hexo

背景信息

  我之前的网站架构大概是这样的

这样跑得也挺好,但是有个问题,就是AWS的免费EC2服务器给的CPU和硬盘实在是太抠了,导致整个网站的速度慢得一匹,而且硬盘处于长期爆满状态,只能通过减少SWAP来腾空间给Redis缓存。

所以,简而言之,WordPress在我这种穷学生的小破机上的性能过于垃圾,亟需大大的优化。

优化思路

1.无头WordPress (Headless WordPress)

  一开始我还不想离开WordPress,毕竟WP上面的一些插件是真的挺好用,而且如果更换平台的话势必会比较麻烦,搜索引擎上的收录链接也不一定能完全匹配。介于我是Vercel的老白嫖用户,所以我第一时间就把魔爪伸向了它。
  Vercel本身是不能托管WordPress站点的(不然早就被白嫖四了),虽说最近它新增了PHP-Runtime的支持,也就是小型PHP的托管,但是像WordPress这种巨无霸是怎么也不可能得。Typecho说不定可以,但是我也没试过。虽说WordPress不能直接跑在Vercel上面,但是Vercel支持无头WordPress(Headless WordPress),下面简单介绍一下。
  无头WordPress简单来说就是将WordPress分为前端和后端,可以理解为仓库和门店。其中前端,也就是门店,跑在Vercel上,负责呈现网页;后端,也就是仓库,储存着文章内容并且向门店分发。这样,用户访问时只需要到门店(前端),而不用频繁访问后端(仓库),因而一定程度上减轻了服务器的负担,有点类似于CDN吧。放一张Vercel官方的图:

但是,WordPress后端向前端发送数据的过程需要使用GraphQL,这玩意儿貌似有一点难学(就是懒),而且后端WordPress对服务器的压力依然比较大,所以最终放弃。

2.迁移Hexo

  然后就只有迁移CMS(Content Management System,内容管理系统)了。上一次迁移是从typecho迁移到WordPress,就是看中了WP的插件生态。不过这一次是肯定不会迁移会Typecho了,因为Typecho还是比较简陋,且社区不是很大,支持不是很多。然后,目光就转向了Hexo。

Hexo

介绍

  当然,我们得知道Hexo是个什么。这是也是一个CMS,且原生支持Markdown,但是是静态的。也就是说,相比动态的CMS,诸如WP、Typecho,Hexo的网页不是在用户访问的时候才即时生成的,而是先前就已经生成好的html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
INFO  Validating config
INFO Start processing
INFO
------------------------------------------------
| |
| ________ __ _ __ |
| |_ __ |[ | (_) | ] |
| | |_ \_| | | __ _ __ .--.| | |
| | _| | |[ | | | [ |/ /'`\' | |
| _| |_ | | | \_/ |, | || \__/ | |
| |_____| [___]'.__.'_/[___]'.__.;__] |
| |
| Thank you for using Fluid theme |
| Docs: https://hexo.fluid-dev.com/docs/en/ |
| |
------------------------------------------------

INFO Files loaded in 499 ms
INFO Generated: oi-note/2021-08-17/index.html
INFO Generated: page/3/index.html
INFO Generated: local-search.xml
INFO 3 files generated in 564 ms

因此,用户访问时相当于直接从服务器获取html文件而不用生成,这样就大大加快了访问速度。当然,在WP中也有类似的技术,比如Redis缓存等,但是WP本质上终究是一个动态的PHP程序,再优化也基本不可能快于Hexo等静态网页(富哥有钱加CPU内存请无视)。

部署

部署方式

使用免费的第三方服务

  部署Hexo有很多种方式,最广为人知的就是使用Github Pages,或者套个Vercel。这些方式的优点就是一分钱都不用还,从服务器到存储到域名,都可以用别人的。缺点就是访问速度不受控,基本属于慢得离谱的状态。你看看github.io被搞成什么速度,再看看vercel.app直接被DNS污染就知道原因了。而速度,是我迁移的出发点。因此,行不通。当然,如果需要的话,可以看看Hexo和Vercel的官方部署教程:
https://hexo.io/zh-cn/docs/github-pages
https://vercel.com/guides/deploying-hexo-with-vercel

部署在自己的VPS上

  刚好,我买了两年半的阿里云香港绝版2H1G的24块一个月的小鸡这时候就凸显出其优势了。阿里云香港的线路向来优秀,因此网络不成问题。

开始部署

安装nodejs

  hexo是基于nodejs开发的,因此当然要先安装nodejs。宝塔用户可以先升级到最新版宝塔,然后去网站——Node项目——Node版本管理器来安装nodejs

一般安装最新版,但是我的CentOS7太旧了,所以只能安装14.17.6

出现found 0 vulnerabilities即安装完成

部署hexo

安装完之后,SSH到服务器,在网站目录下新建一个文件夹,比如我是在/www/wwwroot下新建了hexo文件夹,这个hexo文件夹就是网站的根目录。进入根目录下。输入以下命令开始安装

1
npm install hexo-cli -g

安装完之后,如果是宝塔用户,需要建立软链接,以快速运行hexo:

1
ln -s /www/server/nodejs/v14.17.6/bin/hexo /usr/local/bin/hexo

当然,这里的v14.17.6要改成你自己安装的nodejs版本。然后输入hexo -v如果有一下输出,就成了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
INFO  Validating config
hexo: 7.2.0
hexo-cli: 4.3.2
os: linux 6.7.1-1.el7.elrepo.x86_64 CentOS Linux 7 (Core)
node: 16.20.2
v8: 9.4.146.26-node.26
uv: 1.44.2
zlib: 1.2.11
brotli: 1.0.9
ares: 1.19.1
modules: 93
nghttp2: 1.57.0
napi: 8
llhttp: 6.0.11
openssl: 1.1.1k
cldr: 41.0
icu: 71.1
tz: 2022f
unicode: 14.0

部署完成后,我们cd到网站根目录中,也就是hexo文件夹,然后进行hexo的初始化

1
hexo init

输出像这样,就完成了。

1
2
3
INFO  Cloning hexo-starter https://github.com/hexojs/hexo-starter.git
INFO Install dependencies
INFO Start blogging with Hexo!

配置Nginx前端

  其实就是添加网站,以宝塔为例,进入网站——PHP项目——添加站点(没看错就是PHP项目,只不过我们不开PHP罢了)

然后就是设置SSL以开启HTTPS(你不想设也行),接下来要设置网站目录。其中,网站目录不变,但是运行目录要选择/public,如图所示:

这是因为hexo每次生成静态的html文件时,文件就存在public目录下。

生成静态网站

  进入SSH命令行,cd到hexo文件夹,输入:

1
hexo generate

然后会看到类似于文章开头的输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
INFO  Validating config
INFO Start processing
INFO Files loaded in 322 ms
INFO Generated: archives/index.html
INFO Generated: archives/2024/index.html
INFO Generated: archives/2024/06/index.html
INFO Generated: index.html
INFO Generated: fancybox/jquery.fancybox.min.css
INFO Generated: js/script.js
INFO Generated: css/style.css
INFO Generated: fancybox/jquery.fancybox.min.js
INFO Generated: js/jquery-3.6.4.min.js
INFO Generated: css/images/banner.jpg
INFO Generated: 2024/06/16/hello-world/index.html
INFO 11 files generated in 369 ms

这时,如果不出意外的话,访问你的网站,就可以看到初始界面了。这时,Hexo站点搭建完毕。

迁移

迁移本移

首先,安装 hexo-migrator-wordpress 插件。

1
npm install hexo-migrator-wordpress --save

在 WordPress 仪表盘中导出数据(“Tools” → “Export” → “WordPress”)(详情参考WP支持页面)。插件安装完成后,执行下列命令来迁移所有文章。导出的文件为xml格式。然后开始导入

1
hexo migrate wordpress <source>

source是 WordPress 导出的文件路径或网址。比如我把文件名为bkp.xml,存放在网站的source目录下,那么就是

1
hexo migrate wordpress source/bkp.xml

更换主题

因为我的WP网站里面是有文章封面的,然而Hexo官方主题不仅不支持,还丑,所以有必要换一个主题。Hexo官方推荐了很多主题,你也可以自己搜一搜。
https://hexo.io/themes/
不过Hexo的主题安装是有点麻烦的。我用的是Fluid,以它为例。截取部分官方文档,通过 npm 直接安装,进入博客目录执行命令:

1
npm install --save hexo-theme-fluid

然后在博客目录下创建 _config.fluid.yml,将主题的 _config.yml 内容复制进去。如下修改 Hexo 博客目录中的 _config.yml

1
2
theme: fluid  # 指定主题
language: zh-CN # 指定语言,会影响主题显示的语言,按需修改

然后就装好啦

调整

  这应该是最折磨人的地方了。我WP里面的文章不是很多,所以还好。如果你的文章很多的话,需要自己找一下批量操作的方法,或者积少成多,一点一点改。进入网站目录下的source/_post文件夹下,里面就是文章的md源码了,下面我来简单介绍一下。
  源码分为两个部分,用---相隔

其中Part1是Hexo的题头部分,又称Front-matter,前置内容,Part2是你的正文。我们主要来看Part1。老规矩,我用GPT-4o帮大家翻译一下官方文档放在下面。
前置内容是文件开头的一个 YAML 或 JSON 块,用于配置您的写作设置。在 YAML 中写入时,前置内容以三个破折号终止;在 JSON 中写入时,前置内容以三个分号终止。

YAML

1
2
3
4
---
title: 你好,世界
date: 2013/7/13 20:46:25
---

JSON

1
2
3
"title": "你好,世界",
"date": "2013/7/13 20:46:25"
;;;

设置及其默认值

设置 描述 默认值
layout 布局 config.default_layout
title 标题 文件名 (仅限文章)
date 发布日期 文件创建日期
updated 更新日期 文件更新日期
comments 启用评论功能 true
tags 标签 (不适用于页面)
categories 分类 (不适用于页面)
permalink 覆盖文章的默认永久链接。永久链接应以 /.html 结尾 null
excerpt 页面摘要,纯文本格式。使用 此插件 格式化文本
disableNunjucks 启用时禁用 Nunjucks 标签 {{ }}/{% %}标签插件 的渲染 false
lang 设置语言以覆盖 自动检测 继承自 _config.yml
published 文章是否应发布 对于 _posts 下的文章,为 true,对于 _draft 下的文章,为 false
布局

默认布局是 post,与 _config.ymldefault_layout 设置的值相符。当文章中禁用布局 (layout: false) 时,它将不会被主题处理。但是,它仍将被任何可用的渲染器呈现:如果一篇文章是用 Markdown 编写的,并且安装了 Markdown 渲染器 (如默认的 hexo-renderer-marked),它将被渲染为 HTML。

标签插件 总是会被处理,不受布局影响,除非被 disableNunjucks 设置或 渲染器 禁用。

分类与标签

只有文章支持使用分类和标签。分类按顺序应用于文章,形成分类和子分类的层次结构。标签在同一层级上定义,因此它们出现的顺序并不重要。

示例

1
2
3
4
5
6
7
categories:
- 体育
- 棒球
tags:
- 受伤
- 战斗
- 令人震惊

如果您想应用多个类别层次结构,请使用名称列表而不是单个名称。如果 Hexo 在文章中看到以这种方式定义的任何类别,它将将该文章的每个类别视为独立的层次结构。

示例

1
2
3
4
5
categories:
- [体育, 棒球]
- [MLB, 美国联盟, 波士顿红袜]
- [MLB, 美国联盟, 纽约洋基]
- 对手关系

现在,你对hexo文件的基本语法应该基本掌握了吧。不过,有些主题还有自己的前置内容,比如Fluid主题就有封面图,就是index_img,不过格式都是YAML的标准格式,都是一样的。
  其实WP转到Hexo的最大的问题就是分类问题。Hexo的网址内容和分类名称是一样的,而WP是可以自定义的。比如我的一个分类叫你好,WP里自定义链接为hello,那么两个CMS的网址就是这样的

1
2
3
4
Hexo:
https://www.qwqwq.com.cn/你好/post
WordPress:
https://www.qwqwq.com.cn/hello

因此,主要改的就是分类这一方面,特别是先前在WP的自定义网址中引入了分类的,改起来会有点辛苦。

日常维护

  相比WP,Hexo的日常维护相对更灵活。本质上我们只需要写好md源文件后,上传到网站目录的source/_posts中,然后在网站目录下执行生成命令:

1
hexo generate

为此,我建议将执行命令作为计划任务,如放在宝塔的计划任务中:

尾声

  现在再来访问SZ Horizon,那速度就有了质的飞跃。不过Hexo还有很多可玩的地方,包括Fluid和各种主题。建议大家多看看官方文档里的各种部件和接口,还是很好玩的。


【乐享】从WordPress迁移到Hexo
https://www.qwqwq.com.cn/share/to-hexo/
Author
Stephen Zeng
Posted on
June 19, 2024
Licensed under