WordPress 网站迁移回本地树莓派

发布于 2022-08-06  137 次阅读


长篇大背景

最近感觉钱非常不够用,想找点地方节省一点非必要支出,然后就想到了自己网站——十多年的博客写作坚持,多个网站域名和主机,每年都耗费不少钱财,全都是在为爱发电,一点收益都没有。

再看看这些网站的访问量数据,不禁觉得实在不值,虽然流量确实是非常大……但这些应该是各种爬虫,以及那些自动脚本吧!要是真人访问,怎么都没什么有意义的评论的咧。。。

把网站砍掉吧!考虑了几天,虽然实在不舍得,最终还是决定一个主机不再续费。

我比较常用的主要有三个网站:

  • 现在这个博客网站,主要是发一些比较正式或者长篇的文章
  • 独立的个人微博客(基于WordPress),没什么时间写长文章的时候偶尔发发短文吐槽啥的,就当是QQ空间、朋友圈、微博那种
  • 还有一个相册网站,本来是打算用来存各种照片,然后通过外链的形式提供给其他博客使用的——因为怕 VPS 主机的空间不够。

相册网站运行了两三年了,发现确实没什么建树,纯属浪费……我并没有那么多的图片需要托管的,就我现在的忙碌状态一年到头根本没多少时间折腾博客……

VPS 自身的空间我觉得已经够我用了,特别是在后面迁移微博客的时候,竟然发现我写了 10 年的微博客内容,里面几千张的图片总共占用也就几百 MB ,我还一直在杞人忧天干嘛……

估计是以前被网上那些“大神”博主所误导,什么空间小,大量图片要使用图片外链啥的,这么多年根深蒂固,印象深刻,以至于每次迁移网站都考虑到这个图片空间的问题,甚至连自己开发的 RewrZ 博客系统,也是怕空间不够而使用了外链……简直了!

使用这些外链图片除了完全没必要之外,还对我的迁移造成了极大的麻烦——很多外链图片失效了!没办法再找回来了!还有效的外链图片,为了防止它后面失效,我还要将它们全部下载回本地!

如果有后来者看到这篇博文,我有个忠告,那就是你的网站能不用图片外链就不要用,等你的图片真的多到已经把你空间撑爆了再考虑!!到这个时候你还可以考虑:

  • 已有的图片进行批量无损或有损压缩!
  • 找个可以自定义路径的外链图片——方便后续迁移到更大的空间的时候将这些图片本地化,方便替换掉文章里面的图片连接,如果路径能做到与本地化完全一致的话就更好了!

除了相册网站关闭外,个人微博客决定迁移到本地,反正也没什么真人访问,很多也是些类似于发在朋友圈、QQ空间之类的个人吐槽,记录什么的,也没必要对外开放。当然,本博客会继续正常运行对外开放。

空闲下来的主机也舍不得扔,毕竟这个价格现在也极其难找到同性价比的了,可能用来搭建个私人聊天服务器,或者云笔记啥的小玩意。

微博客迁移回本地,正好家里还有个树莓派一直闲置中,是时候发挥这个花了两百多买的玩意了,可不能浪费了。

树莓派安装 Linux 服务器系统

首先要装个服务器系统给它,我选择 Debian 系统。

到官网(https://www.raspberrypi.com/software/)下载官网系统镜象刷入工具 Raspberry Pi Imager,自行挑选一个自己觉得合适的系统,按它的提示,将系统刷写进 TF 卡即可,然后把 TF 卡插到树莓派上面,开机运行几分钟会自动安装完毕。

全都是可视化操作,非常简单,对于选择困难症唯一的难点估计就只有挑选个合适的系统了。

树莓派 部署 LNMP 环境 + WordPress

运行 WordPress 的环境我选的是 LNMP ,直接按官方步骤执行就是了,非常简单:https://www.lnmp.org/install.html

如果数据库或者PHP安装不上,可以试试低一点版本的,有可能是版本太高,树莓派系统不支持或者说性能不够,最终会导致安装失败。

安装完成后按官方步骤添加虚拟主机:https://lnmp.org/faq/lnmp-vhost-add-howto.html

到 WordPress 官网下载安装包(https://cn.wordpress.org/latest-zh_CN.tar.gz),解压到添加的虚拟主机路径下,使用域名或IP地址访问,熟悉的 WordPress 安装界面就出来了,按界面提示步骤填写好提交,安装完成。

WordPress 本地调试

本地调试只要是主题和插件,可以在本机上装个 WNMP 之类的测试环境工具来用,主题有啥地方想改动的就改动改动,改好了再上传到正式环境里面。

这一步骤可以不用,你也可以直接在正式环境里面调试也没多大问题,反正也没什么人访问不是么。

不过我在这里倒是栽了一个跟头……可能是在国内哪个主题网站下载的破解主题里面有恶意代码,导致所有的主题都感染了,自动添加了些莫名其妙的后门代码,后面花了我不少时间才将它们清除完(自认为清除干净)……

开源免费的内网穿透工具 NPS

如果只需要内网访问,上面其实就已经将 WordPress 安装完毕的了,可以开始迁移。如果不需要外网访问,或者有公网 IP 的可以直接跳过此步骤。

我之所以需要外网访问,并非想微博客对外公开,而是平时我自己在外面突然想吐槽的时候方便拿起手机就能发而已……

无公网 IP 一般有两种选择,一种是类似于花生壳之类的 DDNS(动态域名解析),现成的内网穿透工具,另一种就是自己搭建一个内网穿透。前者大部分需要收费,免费的有各种限制,而且还要你提供各种实名信息,现在信息泄漏这么严重,可要慎重。

如果你家里用华硕路由器,那么恭喜你,你也可以直接用华硕内置的 DDNS,免费的,还不用你提交各种实名信息备案之类的。

我这么多域名可不能浪费了,于是……我选择了最难的一种——自己搭建内网穿透,这种必须自己有一台运行在公网的服务器,我正好有 VPS,因为我想绑定域名,所以域名也备好了,添加了 A 记录解析到 VPS 的 IP 地址上。

在对比了现有的内网穿透方案后,我最终选择了全面协议支持的轻量级开源内网穿透工具:https://github.com/ehang-io/nps

NPS 安装

这玩意安装非常简单,按官方教程指引,先在服务器/VPS 上安装服务端(nps),再到本地服务器/树莓派上安装客户端(npc)即可: https://ehang-io.github.io/nps/#/run?id=%e6%9c%8d%e5%8a%a1%e7%ab%af

如果你的服务器上还运行着其他服务,为了避免端口被占用的情况,最好改一下服务端配置文件的端口:

https_proxy_port 域名代理https代理监听端口 http_proxy_port 域名代理http代理监听端口

NPS 使用配置

因为我要的效果是只要在外网访问我的域名,就能直接访问到我本地的网站。所以我需要内网穿透的域名解析功能,按官方步骤操作: https://ehang-io.github.io/nps/#/example?id=%e5%9f%9f%e5%90%8d%e8%a7%a3%e6%9e%90

这里有一个坑,我设置好有一直没有正常运作,排查了我好久,看了很多次官方文档都不知道是哪里的问题,一模一样的操作和配置为何会不行呢?

捣鼓了好久最终才发现这货要跟服务器上的 nginx 打配合才行: https://ehang-io.github.io/nps/#/nps_extend?id=%e4%b8%8enginx%e9%85%8d%e5%90%88

主要是这个要做端口转发,将80端口转发自己设置的相应端口上面……

server { listen 80; server_name *.proxy.com; location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8010; } }

我服务器上本来就正在运行了其他网站服务,按照官方配置添加到服务器的 nginx 上,重启服务,终于成功。

WordPress 备份 + 迁移

使用最简单方便的备份迁移术:自带的导出导入

因为文章比较多,导出来的 xml 文件有好几 MB ,直接导入到 WordPress 一般都会直接卡死,导入失败。

使用一个名叫 WXRsplit 的小工具,可以将 xml 切割成多份再分批导入,这还很顺利。

本想着这样还能把附件导入,自动将文章里面的图片也下载了,结果全部报错:附件导入失败!

文章是全部导进来了,但是图片还都是外链……失败!

将所有外链图片保存到本地

于是我想着先想所有外链图片保存到本地,文章所有图片外链的连接也更改到本地之后再进行迁移。

找了很久物色到一个 WP 插件:IMGspider :

IMGspider(图片蜘蛛)是一款用于WordPress文章图片抓取的WordPress插件,支持JPG, JPEG, PNG, GIF, BMP, TIF等常见图片爬取下载,实现一键抓取文章内容所有引用图片到本地服务器。

一顿操作猛如虎,一看结果渣成狗。爬取失败!爬取失败!浪费时间!浪费时间!

还好,我的外链图片大部分是用两款 WP 插件配合使用,同步到了 Github 上面。它们分别是:wp-github-gos 和 External Media without Import。

External Media without Import 插件的作用是可以将外链图片添加到 WP 的媒体库上方便管理,使用起来,外链的图片就像是直接上传到了媒体库一样。

wp-github-gos 插件的作用是在上传图片到媒体库的时候,自动将图片上传到 Github 自己建的仓库,再自动返回一个图片直链地址,而这个直链地址,还可以自定义。我就是利用这个自定义将自己的域名绑定上,路径还改为类似于 WordPress 的媒体库地址一样(即类似于 https://i.rewrz.com/wp-content/uploads/2022/07/31/tupian.jpg 这样的地址),这为我后面迁移提供了很大的便利,直接 SQL 替换图片连接的域名就行了,否则逐个更改图片外链地址会累死我。

所以我直接打开我的 Github 库,将整个库拉了下来(也就 400MB+ 的图片),放到搭建好的本地 WordPress 文件夹 \wp-content\uploads\ 里面。

使用 WordPress 备份插件迁移

WordPress 有很多备份迁移的插件,我一直都是用免费的 WPvivid备份插件,是时候考验一下它的实际使用如何了……

结果连备份下载都有问题……

然后又更换了好几个免费的插件均告失败。

最后使用 Backup Migration ,貌似有戏,备份和还原都能正常工作了。

谁知道还原刚开始还很顺利,等它运行了两个小时后,提示错误、失败…………………………

我差点炸了。

只能用最后的方法了——手动迁移。

操作数据库手动迁移 WordPress

差点忘了自己好歹曾经也是个工程师,仔细想想,为何不一开始就自己手动迁移,反而在这些愚蠢的插件上浪费时间呢?插件自动迁移的失败,很有可能是我之前的是多站点,现在要将其中一部分迁移到单站点,这些插件不够智能,没有考虑到会有这样的场景。

只能自己手动迁移了。

其实现在也就只剩下数据还原而已,其他前面的都已经做了。

Backup Migration 插件备份数据就是可执行的 SQL 脚本,我只需要迁移文章、文章类别、标签就行了,因为没什么评论,干脆就不迁移了。

所以我需要保存的表也就以下几个:

  • wp_term_relationships
  • wp_term_taxonomy
  • wp_terms
  • wp_termmeta
  • wp_posts
  • wp_postmeta

由于多站点的数据库表名称跟单站点的数据库表名称是不一样的,所以只需要将 SQL 里面的表名称,改成自己单站点安装的时候生成的表名称即可!然后登录 phpMyAdmin 依次将相关 SQL 导入执行即可!如果导入的时候有报错,注意看清楚报错的描述和内容,随机应变调整一下就行了,非常简单。

开始使用吧!

导入完成后,刷新一下网站,完美还原!

最后还要——持续的改善与运维

虽然现在是已经将整个网站迁移完毕了,但还是需要有后续不断地优化维护的,例如修改一下主题、安装一些插件什么的,不过,这些都是小意思可以慢慢来!重要的是,终于可以开始更新写作啦!