一次 Discuz X3.2 切换数据库后无法登录的问题排查经历

情景再现

我本人在阿里云有一台 ECS 云服务器,平时没事干喜欢在上面做各种服务器相关的实验,比如 Linux 系统下 Web 服务器的搭建,研究各种常见的 Web 服务器架构和运维方式。久而久之也懂得了不少东西,于是我的一位大学期间的老师(本人现在已毕业参加工作)就委托我帮忙搭建一个小的 Discuz 论坛,平日里方便她教学使用。

可是最近总听她反馈说网站访问起来很慢,希望我能优化优化。其实我也大概清楚这其中的情况,因为我多数情况只是用这台云服务器做各种各样的尝试,所以它的配置比较低:单核1G内存。不过,以前没有做过生产服务器,所以我觉得它的优化空间应该还是蛮大的,当然,平日里上班也比较忙,没有太多时间系统地学习服务器优化方面的东西,于是乎,我便想出了一个旁门左道的方法。

我是将整个论坛安装在一个 All In One 环境中的,也就是说一台服务器,一块硬盘,也没有经过分区什么的,Apache 和 MySQL 也是直接装在上面就开始跑了。这样下来,长此以往,1G的内存想必只能撑住这两个主力军的运行,想要速度快恐怕得做点文章了。那么,优化从哪里入手呢,我估计说出来大家都会说我这样也好意思拿出来说叫优化。不过能解决问题的方法就是好方法,不是吗?

也不知道我是怎么想到这招的:在阿里云官方申请了一个免费的云数据库 RDS,把我论坛的数据库导出到这台免费的云数据库上,然后再把云服务器上的 MySQL 服务停掉,这样做的后果是:服务器内存使用率瞬间降下来了!哈哈,只跑一个 Apache 还是够够的啦,毕竟咱的网站不大。

然而,程序员仿佛永远身处于 BUG 的漩涡中无法自拔:一切随之而来的由数据库切换导致的问题摆在了我的面前,怎么办?版本回退?这可不是我的风格。出问题不怕,解决就是了!

啥情况:直接无法登录了!

进入到网站的主页,尝试登录,输入用户名密码,点击登录,没有反应,也不报错;刷新页面,再次尝试登录,报了一个错:“系统内部错误,在此处无法完全显示”,嗯?这是什么鬼?!

凭我工作时候遇到过的问题分析:

没有直接弹出错误页面,但是页面也没有任何跳转,也没提示数据库连接失败,那么,应该是尝试连接了数据库,但是没有连上。那么,没有连上数据库为什么不报错呢?为什么只给了一个弹出层:系统内部错误。一种可能性是数据库服务没启动,连接自然不成功,可是我把数据库连接转到另一个数据库了呀,阿里云数据库是支持外网连接的。

等一等,会不会是忘了改 Discuz 下面的配置文件,额,我相信熟悉这个论坛搭建的人都知道数据库连接是有个配置文件的吧,而且肯定知道切换数据库是要修改那个配置文件的吧:/xxx/xxx/xxx/config/config_global.php(/xxx/xxx/ 是网站内容放置的绝对路径)。

试一试再将云服务器上的 MySQL 服务启起来,诶?启起来居然可以登录了!可是我已经修改过数据库连接指向了呀,和这个服务启不启有什么关系呢?再关掉 MySQL 服务,又不能登录了。到这里,唯一能确定的就是和 MySQL 的连接有关系。

【分析】:Discuz 登录时会做两次身份校验,一次是在它本身的数据表中,还有一次是在 UC_Center 的数据表中,会不会是我只改了config_global.php这个配置文件,而没有修改 UC_Center 相关的数据库配置文件?

【尝试】:进入到 Discuz 配置文件目录cd /xxx/xxx/xxx/config,仔细一看,果然还有个配置文件config_ucenter.php静静地躺在那里,不用说,这个文件肯定和 UC_Center 的数据库配置相关了,打开修改掉相应的数据库配置项即可,具体有以下这几项:

define('UC_DBHOST', 'localhost');
define('UC_DBUSER', 'root');
define('UC_DBPW', 'dzroot');
define('UC_DBNAME', 'discuzx');
define('UC_DBTABLEPRE', '`discuzx`.ucenter_'); (注意别忘了这一项)

【结果】:OK,至此你的论坛已经可以成功登录了。

等一等:这样真的就OK了吗?

当你想要以管理员的身份登录到后台管理中心时,你会被眼前的一幕而震惊:

Error: Can not connect to the MySQL server
Errorno: xxxxx

纳尼?!刚才不是已经改过数据库配置文件了吗?两个配置文件都已经改过了呀,怎么还会报这个错误呢?!

【分析】:既然上面提到的两个配置文件都已经做了对应的修改,这里登录后台还会报数据库连接错误,那么有一种情况,就是 UC_Center 对于后台管理中心有一套另外的数据库配置文件,到底是不是这么回事呢?

【尝试】:在对应的 uc_client 和 uc_server 目录下搜索配置文件,看能否挖掘出额外的配置文件,使用find命令:find /xxx/uc_client -name config_*.php,没有搜索到;再到另一个目录:find /xxx/uc_server -name config_*.php;惊喜总在一瞬间:uc_server/data/config.inc.php

【方法】:打开uc_server/data/config.inc.php文件,将其中对应的数据库配置部分修改成对应正确的数据库配置。

【结果】:再次尝试登录后台管理中心,大功告成!

你可能感兴趣的:(discuz,mysql)