上次MediaWiki从1.23.5和1.24.2升级到1.27.0还是在2016年,选择1.27版本的原因是这是一个长支持周期的版本,可以在3年内不用大版本升级,但在2019年也到期了,本来应该升级到1.31这个长周期版本,不过也因为时间精力顾不过来而没有进行,到2020年的1.35又是一个新的长周期版本,我们2020年10月就进行了测试,后来人手不足搁置了一段时间,现在2021年3月再次回头来进行,终于是把剩下的小问题逐步解决,然后升级网站可以推出了,下面来记录一下需要进行的工作。
首先到MediaWiki官方网站,下载最新稳定版本,阅读1.35的发布说明,还需要按照官方的升级指导手册来进行,升级过程:
- 备份MySQL数据库中相关库、表;
- 备份Web文件;
- 创建另外一个库,将备份还原到新库中;
- 创建另外一个目录放置解压后的1.35版本文件,将备份文件中的.htaccess, robots.php等自己创建的文件复制过来
- 修改dns创建一个测试域名
- 修改apache站点配置,测试域名指向新目录
- 如果用到SSL,还要生成新测试域名的SSL证书
- 修改LocalSettings.php,让老站中的一些设置在新站中生效
- 逐个检查每个扩展程序,是否有最新版本需要升级,去进行获取、根据需要修改配置
- 运行maintenance/update.php进行升级,数据量几千到几万的站点大约需要30分钟左右,数百万页面的站点需要6小时左右
- 在测试域名下对各种页面进行检查、对各种操作进行测试,发现问题逐个排查、解决
- 切换新老站点的目录和其它一些配置,上线升级后的站点
几个特别的扩展程序:
- 动态页面列表DPL:老的Extension:DynamicPageList (third-party)已经不受支持,可改为新的Extension:DynamicPageList3,一些配置需要修改,用法上也有一些区别,需要仔细检查,参看DPL3手册
- 管理编辑权限的Extension:EditOwn这个也不再受到支持,可改为新的Extension:LockAuthor
-
Extension:ConfirmEdit的ReCaptcha NoCaptcha也调试通了,注意需要去Google ReCpatcha Admin Panel获取站点Key和密码
以前搞这些MediaWiki的升级都是我一个人弄,很费力,后面让同事参与后争取可以做到有新版本就及时更新,不用像现在这里几年才搞一次,随时跟踪MediaWiki的新变动、也避免一些安全问题、使用一些更新的功能。
同事还做了更多的工作,系列网站也还有一部分在进行升级中,我以后再来添加更多信息记录在这里。
遇到User name "Move page script" is usable, cannot create an anonymous actor for it. Run maintenance/cleanupUsersWithNoId.php to fix this situation.这种报错,解决的办法补充记录在《MediaWiki升级报错页面版本找不到》这篇博文中。
2021年7月30日补充:
WikiSEO这个扩展升级后,自动产生了open graph、twitter cards等标签,不过繁体版本却是显示的简体字,包括meta description, keywords也是简体,排查了好几天,在WikiSEO模块中修改程序都没有搞好,最后我修改了includes/OutputPage.php中的addMeta和addHeadItem两个函数,添加了简体到繁体的转换,才算是解决:
public function addMeta( $name, $val ) { //jamesqi 2021-7-30 if ($_SERVER['SERVER_NAME'] == 'tw.youbianku.com') { if (in_array($name, array('description', 'keywords'))) { $val = zh_hans_to_zh_hant($val); } } $this->mMetatags[] = [ $name, $val ]; } ... public function addHeadItem( $name, $value ) { //jamesqi 2021-7-30 if ($_SERVER['SERVER_NAME'] == 'tw.youbianku.com') { if (in_array($name, array('og:description', 'article:tag', 'twitter:description'))) { $value = zh_hans_to_zh_hant($value); } } $this->mHeadItems[$name] = $value; }
这个办法不太正规,但暂时也只好这样来解决了。
评论