前两天朋友的一个discuz论坛的QQ互联一直无法正常使用,一用QQ登录就报502。一直以为是QQ互联平台升级造成的,今天仔细看了apache的error日志,才发现这原来是个软件bug.
论坛软件配置如下:
论坛比较老了,使用的是:
- 系统: centos6.9
- 软件:
discuz x3.2
php5.2.17
apache2.2.2
问题解决过程:
问题描述:
使用QQ互联登录,在访问connect.php时,直接报502。
问题方向:
- discuz 云平台关闭,造成的问题
- QQ互联平台
- 系统软件过老或discuz版本地低
问题解决过程:
- 先是查看discuz日志,发现在报502时,discuz日志中看不到任何反馈。
- 试着重新关闭和开启discuz云平台,发现云平台site_id丢失,在从备份中找到并恢复pre_common_setting表中的site_id后,问题还是没有解决。
- 怀疑是QQ互联平台的问题,几经周折找到QQ号登录后,发现没有相应的appid配置。当时,都考虑重新申请一个QQ互联appid了,但由于网站是没有备案的,所以审核过不了。查了网上一些升级discuz3.2到3.4的文章,发现升级后,discuz3.4是不再使用Discuz云平台了,而且discuz云平台也已经关闭。而升级后,原来的QQ互联的appid是可用的,是不用重新申请的。也就是说,QQ互联相对于discuz云平台是独立的,而当初的云平台在开通时,会自动帮你申请一个QQ互联的appid,而且当时是不用备案的,而且现在可以继续使用下去。
- 在经过上面的排查后,本来准备做discuz升级操作了。考虑到是对外再使用的系统,我准备是迁移数据,然后在新的服务器上先做升级测试,没问题后,再对运行的系统做升级操作。在这期间,我查看了apache的error.log日志,发现在运行connect.php时,会有下面的报错:
[Wed Mar 20 15:36:13 2019] [notice] child pid 29410 exit signal Segmentation fault (11)
[Wed Mar 20 15:56:55 2019] [notice] child pid 29265 exit signal Segmentation fault (11)
[Wed Mar 20 15:56:57 2019] [notice] child pid 29385 exit signal Segmentation fault (11)
从上面的日志看,之所以discuz没有报错日志,是因为php进程在运行connect.php是,core dump直接退出了,当然不会在discuz日志中有什么报错。于是用了一个qqtest.php脚本脚本出处来测试用https和QQ互联平台进行连接时,是否正常。
运行qqtest.php,发现无法通过 。
直接用php运行这个qqtest.php,直接报core dump
[root@localhost public_html]# /www/php/bin/php qqtest1.php test Curl <br>curl_init good! <br>Segmentation fault (core dumped)
google搜索 php curl Segmentation fault (core dumped) 发现了这篇文章,提示升级到php5.4,或是删除两个文件,通过搜索想删除的两个文件路径,我又找到了这篇文章,临时解决方法是:
mv /etc/pki/nssdb /etc/pki/nssdb_bak
论坛QQ登录立马恢复了。
解决问题总结:
- 出问题一定要先去找日志,discuz日志中没有,就应该去apache日志中找,还没有就应该去系统日志中找,找到错误日志是解决问题最快的方法。
- 先查自己的问题,再去查别人的问题,除非问题已经很明确是别人的。
- 软件越老,BUG越多,还是很容易出问题的。
后继工作:
后面有时间,还是得把这个老论坛应用做升级,先在php5环境上把discuz升到3.3,稳定后,再把php运行环境升级到php7.0,这才是正道。为备份及将来云迁移方便,可以把discuz运行环境打包到docker中,运行数据再独立打包。完成上面的工作,这个老论坛又可以安定在云上“为人民服务了”。