提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

今天早上的MySQL的崩溃让我下定决心要升级老旧的MySQL,哪知道遇到了一堆麻烦的事情,也让我感到服务器升级前一定要慎重再慎重的重要性。

首先就是MySQL就够我折腾的了,升级到5.5版本,本来以为只需要apt-get install就可以解决的问题,但是出现了杯具的错误,首先是 Unable to set password for the MYSQL root...This may happened because the account already has a password...subprocess installed post-installation script return error exit 。然后mysqld守护进程启动失败!于是想是不是MySQL 5.1没有卸载干净?本来是想直接从5.1升级的,结果死活升级不了,于是使用apt-get dist-upgrade,但是提示需要REMOVE mysql-server,下定决心后按下y回车,然后老旧的MySQL华丽丽的被卸掉了。好了,后来我采取下面两句罗列并删除所有和mysql有关的package:

dpkg --get-selections | grep 'mysql-' | awk '{print $1}'
# purge表示清除配置文件,也就是彻底删除
apt-get purge package1 package2 ...

接着使用dotdeb的源,出现mysql-server: Depends: mysql-server-5.5 but it is not going to be installed,然后提示缺少什么perl库(perlapi),死活装不了啊,然后好不容易找到了这个库的源,更新,安装。又出错了,和刚才的问题一样,我陷入了沉思……仔细搜索了安装的输出,找到这么一句话“ Unknown/unsupported storage engine: InnoDB ”原来老旧的配置文件my.cnf没有被清除掉,里面配置是skip-innodb,而MySQL5.5 GA默认引擎为InnoDB,所以出错了。两种解决办法:一是启用InnoDB;二是通过在my.cnf的[mysqld]节配置default-storage-engine=MyISAM,来修改默认存储引擎。做完这些终于勉强把新版本的MySQL装上去了。

接下来是重新安装PHPMyAdmin,仍然使用万能方便的apt-get install phpmyadmin,结果提示Apache什么的,没理它,继续安装,终于装好了,然后因为需要,重启了VPS,结果重启后,当进入系统时我差点把喝的水喷到屏幕上,竟然给我搞了个Apache2替换了我的Nginx,进程里N多Apache2,我可怜的内存就这样被消耗了。赶紧卸载:

sudo apt-get purge apache2 apache2.2-common
sudo apt-get purge apache2-mpm-prefork apache2-utils
sudo apt-get purge apache2.2-bin libapache2-mod-php5
sudo apt-get autoremove apache2
sudo rm /etc/apache2 -rf
sudo rm /etc/init.d/apache2

然后通过invoke-rc.d nginx start看看我的Nginx是不是还活着,还好Nginx还在,勉强恢复了运行,但是PHP页面还是显示502 Bad Gateway,看来php-cgi放假了,ps aux一看果然找不到php-cgi。赶紧invoke-rc.d php-cgi start启动。

结果相当不顺利,提示:“php-cgi unable to open pidfile php.pid”,跑到/var/run里面一看,原来这个pid文件应该在/var/run/www目录里面的,结果www目录没有了,当然无法创建了:

cd /var/run
mkdir www
chown www-data:www-data www

做完这些启动php-cgi,测试了一下WordPress,WordPress运行竟然也出错了,开启wp-config.php里面的WP_DEBUG为true,再次运行,PHP报错如下:

Fatal error: Call-time pass-by-reference has been removed in...

意思是调用时引用传参已经被移除了,就是不能通过function(&$a)这种方式传参调用函数。奇怪的是为什么我以前没有遇到过?继续查看发现PHP竟然被升级到最新版本5.4了,凹,万能的apt-get,既然已经升级就只有改WordPress了,好在出错的主要是其中的插件,我把不需要的给禁用,还有些自己改了插件代码,勉强能够运行了。我想升级了php,有些扩展需要重新编译了,比如eAccelerator,结果编译eAccelerator出现了“error zend_class_entry has no member named line_start”编译错误,看来又是和PHP 5.4有关系,eAccelerator貌似已经停止开发了,所以只有放弃,后改用APC。

这还不算完,当我再次重启VPS后,php-cgi又挂了,还是之前的问题:/var/run/www目录又神奇消失了,好在没有帮我把apache又装上去。算了,我也不想纠结于这个问题,干脆提前换php-fpm吧,apt-get install php5-fpm。

这个搞定后浏览了下博客,还算正常,但是接着又出现错误,PHP报错“Fatal error: Internal Zend error - Missing class information for in /MY PATH/wp-super-cache/wp-cache-base.php on line 5”,wp-super-cache又有问题了!上网搜索一下,找到 《SuperCache "Internal Zend error" WTF?》 ,看来是和APC有关系,楼下老兄给出办法:

echo "apc.filters=wp-cache-config" >> /etc/php5/conf.d/apc.ini
echo "apc.include_once_override=0" >> /etc/php5/conf.d/apc.ini

姑且先试一下,不行的话只有停用APC了。最后想反正已经用了php-fpm了,下次php-cgi可以不启动了,遂决定update-rc.d -f php-cgi remove将php-cgi的启动项移除,结果又失败!算了,这个不影响大局,先凑合着吧。

今天算是吃尽升级的苦头了,伤不起啊。

参考文档: 《APCとWP Super Cacheを併用していると500エラーがたまに出る問題の解決策》