从决定更换系统到升级MediaWiki,拖拖拉拉地弄了一个多月。中间因为很多事情耽搁,也没有太大的动力去推进。
写这篇大杂烩的文章主要是为了记录整个迁移的过程,很多问题虽然都单独写过,但过程中的一些坑只有从整体来看可能更有体会。
起因
CentOS 7停止更新之前就一直在纠结应该升级系统还是干脆更换新系统。如果切换到AlmaLinux或RockyLinux,虽然网上有大量的教程,但从本地虚拟机实验的结果来看,有一定的报错概率,只能作为备选方案。
也考虑过用自定义镜像的方法在本地配置好服务器再上传,但简单测试之后发现家用电脑的CPU(笔记本使用AMD)和服务器CPU之间的差异会导致镜像无法打开,没有花太多时间在调试上,暂时作罢(见《【未解决】阿里云自定义镜像下载并用于本地虚拟机》)。
既然本地不行,那就再买台阿里云的服务器进行配置然后再切换。正赶上99计划,一年的费用比用几天也没贵多少,一咬牙就下单了。
迁移其他系统都比较顺利,运行也挺稳定,转念一想干脆把心百科独立在一台服务器上,毕竟它对系统要求比较高,于是开启了本次的折腾之路。
为什么单单要记录MediaWiki呢?因为在迁移完其他系统之后,单独运行MediaWiki反倒是CPU天天飙到100%,而且还是发生在服务器从1U2G到2U4G之后。没时间排查到底是不是受到攻击,干脆就直接更换系统升级MediaWiki。
迁移流程
先写个正常流程。
MediaWiki的迁移和升级基本类似,重要的就是备份数据库、配置文件和上传的图片等。同版本间的迁移以及低版本向高版本迁移都可以,高版本向低版本迁移即不提倡估计也没几个人会这么干。
如果是个人维基,那么可以跳过这一步。如果是公共的,还有其他用户可能会进行编辑,那么在迁移前最好还是将权限设为只读,以免造成内容的丢失。打开配置文件LocalSettings.php
,并向其中添加:
$wgReadOnly = '正在维护,马上回来';
单引号中的消息根据自己的实际情况来写。
在备份数据库前,先执行以下命令清空作业列表中的待处理作业,以避免这些参数在新版本中发生变化而失败:
php maintenance/runJobs.php
备份数据库的话,运行下面的代码:
mysqldump --user=wiki_db_user --password=wiki_db_user_password wiki_db_name > backup.sql
如果是完整的同版本间迁移,直接将安装目录全部打包即可,如果是低版本向高版本迁移,则需要备份如下文件或文件夹:
- 配置文件
LocalSettings.php
:迁移至新服务器后,记得检查其中的域名、开启的扩展和皮肤是否已经同样迁移或者重新安装或升级,以免因缺少文件等造成网站无法打开。 - 上传的文件:主要是上传的图片(还包括缩略图和删除的文件等),主要存放在
images
目录下。 - 网站logo:新版本已经可以指定logo的地址,因此不限于原来的
resource/assets
目录。 - 其他文件:自动生成的网站地图文件(比如sitemap.xml或sitemap目录等)、其他配置文件(如果你习惯将扩展的设置单独保存为配置文件并供
LocalSettings.php
调用)、.htaccess
文件(如果有的话)以及各搜索网站要求的验证文件等。
不管是全部还是部分文件,先打包一下。
然后用SCP传输到新服务器上,并解压到安装目录下,导入数据库后运行一下升级程序:
php maintenance/run.php update.php
1.40版以后虽然运行php maintenance/update.php
仍能成功,但会提示警告,所以最好还是按照上面的代码执行。如果一切顺利,整个迁移过程就算是完成了。
迁移中的问题
现实往往是不可能一帆风顺的。细数一下我中间的坑吧。
1、文件传输
心百科中的文件在不知不觉中已经增长到2G以上(这还是压缩后的容量),数据库也膨胀到200M以上(如果是用phpMyAdmin导出更是接近400M)。习惯下载并上传的做法无形中增加了流量费用,虽说不多,但没必要的开支还是该省就省。
所以正解就是用SCP在两台服务器中直接传输。
2、数据库导入
最开始用phpMyAdmin导出,然后想用phpMyAdmin导入,结果发现文件太大,无法上传。修改PHP的上传限制或者是传输到本地后再加载,因为数据库太大导致超时,导入不完整。只能改用MySQL命令行的方式导入。
但从MySQL数据库服务更换成Mariadb后还面临一个字符集排序的问题(Mariadb不支持utf8mb4_0900_ai_ci
),导致数据表导入不完整,通过查找替换的方式更换字符集之后才完美导入。
3、php函数禁用
不知道从哪个版本开始,MediaWiki的安装不再提示某个php函数被禁用后无法安装了,只有当你最终打开网站浏览某些页面时才会发现(最典型的就是proc_open
,只要你用了模块必报错)。当然这个问题不算太大,毕竟安装和升级这么多回了,早就驾轻就熟了。
4、php扩展未安装
在MediaWiki的安装文档中有提到过哪些php扩展是必装的,但因为用apt安装php时没有将其中的某个扩展加入,导致运行update脚本出错。反馈的信息只告诉你缺少php扩展,不会具体到名称,所以还是对着安装文档核对一遍。
- dom - 从MW 1.34起要求
- intl - 从MW 1.36起要求
- mbstring - 从MW 1.27起要求
- xml - 从MW 1.27起要求
- xmlreader - 从MW 1.36起要求
通过php -m
命令发现缺少了intl
扩展。
5、nginx配置错误
整个迁移过程中最大的坑之一就是对nginx的配置。因为用惯了Oneinstack的一键安装,所以一旦自己手动安装之后,很多配置问题都发生了变化(比如默认的网站目录、nginx的配置目录、php的配置等),但大部分都不影响正常使用,只要进行适当地调整就可以了。
但如果使用MediaWiki ShortURL Builder生成的代码,打开主页就会显示“file not found”。
重新用回最初的配置,能够正常显示,但不确定在过程中会有什么样的问题。暂时先这样吧,反正之前的配置也未必一定正确,毕竟还是有这样那样的错误发生。
6、未安装ImageMagick
上传图片后发现无法生成缩略图,结果才发现忘安装ImageMagick程序了。使用Debian的APT安装方式一键搞定(包括依赖):
sudo apt update && sudo apt upgrade
sudo apt install libpng-dev libjpeg-dev libtiff-dev
sudo apt install imagemagick
如果还是包括,可以尝试将配置文件中的$wgUseImageMagick = true;
和$wgImageMagickConvertCommand = "/usr/bin/convert";
注释取消掉。
7、搜索发生错误
使用高级搜索功能,结果发生“搜索时发生错误:由于出现暂时性的问题,我们未能完成您的搜索。请稍后再试。”的错误。
查找原因时发现CirrusSearch扩展的升级步骤中,首先要执行下列命令:
php UpdateSearchIndexConfig.php --reindexAndRemoveOk --indexIdentifier now
然后出现如下错误:
Inferring index identifier...error
<Error, collected 1 message(s) on the way, no value set>
补张后来截的图(因为修订过错误了,所以表格中的内容稍有区别):
查遍整个网络,结果还是在之前写的日志中找到了答案,只不过当时写得云里雾里,执行以下命令:
curl -X DELETE "localhost:9200/ms_test_content"
后面对应的是错误中提示的数据表,系统会返回{"acknowledged" : true}
。如果还有类似的表错误,继续执行上述命令并替换表名。
再次运行升级命令,终于正常。
最后
至此,所有的迁移工作都暂时告一段落。
参考资料:
https://www.mediawiki.org/wiki/Manual:Upgrading
https://gerrit.wikimedia.org/g/mediawiki/extensions/CirrusSearch/%2B/HEAD/UPGRADE