【乐享】从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 |
|
因此,用户访问时相当于直接从服务器获取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 |
|
安装完之后,如果是宝塔用户,需要建立软链接,以快速运行hexo:
1 |
|
当然,这里的v14.17.6
要改成你自己安装的nodejs版本。然后输入hexo -v
如果有一下输出,就成了!
1 |
|
部署完成后,我们cd到网站根目录中,也就是hexo文件夹,然后进行hexo的初始化
1 |
|
输出像这样,就完成了。
1 |
|
配置Nginx前端
其实就是添加网站,以宝塔为例,进入网站——PHP项目——添加站点(没看错就是PHP项目,只不过我们不开PHP罢了)
然后就是设置SSL以开启HTTPS(你不想设也行),接下来要设置网站目录。其中,网站目录不变,但是运行目录要选择/public
,如图所示:
这是因为hexo每次生成静态的html文件时,文件就存在public目录下。
生成静态网站
进入SSH命令行,cd到hexo文件夹,输入:
1 |
|
然后会看到类似于文章开头的输出结果:
1 |
|
这时,如果不出意外的话,访问你的网站,就可以看到初始界面了。这时,Hexo站点搭建完毕。
迁移
迁移本移
首先,安装 hexo-migrator-wordpress 插件。
1 |
|
在 WordPress 仪表盘中导出数据(“Tools” → “Export” → “WordPress”)(详情参考WP支持页面)。插件安装完成后,执行下列命令来迁移所有文章。导出的文件为xml
格式。然后开始导入
1 |
|
source是 WordPress 导出的文件路径或网址。比如我把文件名为bkp.xml
,存放在网站的source
目录下,那么就是
1 |
|
更换主题
因为我的WP网站里面是有文章封面的,然而Hexo官方主题不仅不支持,还丑,所以有必要换一个主题。Hexo官方推荐了很多主题,你也可以自己搜一搜。
https://hexo.io/themes/
不过Hexo的主题安装是有点麻烦的。我用的是Fluid,以它为例。截取部分官方文档,通过 npm 直接安装,进入博客目录执行命令:
1 |
|
然后在博客目录下创建 _config.fluid.yml
,将主题的 _config.yml 内容复制进去。如下修改 Hexo 博客目录中的 _config.yml
:
1 |
|
然后就装好啦
调整
这应该是最折磨人的地方了。我WP里面的文章不是很多,所以还好。如果你的文章很多的话,需要自己找一下批量操作的方法,或者积少成多,一点一点改。进入网站目录下的source/_post
文件夹下,里面就是文章的md源码了,下面我来简单介绍一下。
源码分为两个部分,用---
相隔
其中Part1是Hexo的题头部分,又称Front-matter
,前置内容,Part2是你的正文。我们主要来看Part1。老规矩,我用GPT-4o帮大家翻译一下官方文档放在下面。
前置内容是文件开头的一个 YAML 或 JSON 块,用于配置您的写作设置。在 YAML 中写入时,前置内容以三个破折号终止;在 JSON 中写入时,前置内容以三个分号终止。
YAML
1 |
|
JSON
1 |
|
设置及其默认值
设置 | 描述 | 默认值 |
---|---|---|
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.yml
中 default_layout
设置的值相符。当文章中禁用布局 (layout: false
) 时,它将不会被主题处理。但是,它仍将被任何可用的渲染器呈现:如果一篇文章是用 Markdown 编写的,并且安装了 Markdown 渲染器 (如默认的 hexo-renderer-marked),它将被渲染为 HTML。
标签插件 总是会被处理,不受布局影响,除非被 disableNunjucks
设置或 渲染器 禁用。
分类与标签
只有文章支持使用分类和标签。分类按顺序应用于文章,形成分类和子分类的层次结构。标签在同一层级上定义,因此它们出现的顺序并不重要。
示例
1 |
|
如果您想应用多个类别层次结构,请使用名称列表而不是单个名称。如果 Hexo 在文章中看到以这种方式定义的任何类别,它将将该文章的每个类别视为独立的层次结构。
示例
1 |
|
现在,你对hexo文件的基本语法应该基本掌握了吧。不过,有些主题还有自己的前置内容,比如Fluid主题就有封面图,就是index_img
,不过格式都是YAML的标准格式,都是一样的。
其实WP转到Hexo的最大的问题就是分类问题。Hexo的网址内容和分类名称是一样的,而WP是可以自定义的。比如我的一个分类叫你好
,WP里自定义链接为hello
,那么两个CMS的网址就是这样的
1 |
|
因此,主要改的就是分类这一方面,特别是先前在WP的自定义网址中引入了分类的,改起来会有点辛苦。
日常维护
相比WP,Hexo的日常维护相对更灵活。本质上我们只需要写好md源文件后,上传到网站目录的source/_posts
中,然后在网站目录下执行生成命令:
1 |
|
为此,我建议将执行命令作为计划任务,如放在宝塔的计划任务中:
尾声
现在再来访问SZ Horizon,那速度就有了质的飞跃。不过Hexo还有很多可玩的地方,包括Fluid和各种主题。建议大家多看看官方文档里的各种部件和接口,还是很好玩的。