升级手记:通通最新版,php-5.5.0/nginx-1.4.1/mysql-5.6.12

俗话说“稳定压倒一切”,不出问题或没有特殊需求的话,哪怕他们如火如荼的发布新版,吹嘘着新功能新特性,大部分人仍会选择不升级。

手上的机器大多也是停留在超旧的版本上,比如:php-5.2.x,nginx-0.8.44,mysql-5.0.89 …

相比之下确实太老太老了,都好几年前发布的甚至有的已经逐步停止支持(即使有BUG也没人修复),总归得向前看。这次激进一点,全部拿最新版本开刀。

我个人有一个习惯,使用新东西前会比较全面的去了解一下。像这些重要软件都会采用源码方式编译,仔细核对手册上的配置选项级含义,然后做一套基础模板出来。这么多年过去了,会有新的选项支持或废弃了旧选项。

1. nginx 这是足以取代 apache 的新生 web 服务器软件,目前我们已经全面推广在使用。特点就是高性能,低开销。从 0.8.44 升级来还算顺利,配置文件也基本没变。我的配置指令如下:

CFLAGS=-O2 ./configure --prefix=/path/to/nginx \
--user=nobody --group=nogroup \
--without-select_module --without-poll_module \
--with-http_ssl_module --with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre \
--without-http_ssi_module --without-http_userid_module \
--without-http_geo_module --without-http_map_module \
--without-http_uwsgi_module --without-http_scgi_module \
--without-http_memcached_module

make && make install

一路顺利,然后还测试了最近很火红和被热追的 ngx_lua 模块,安装比较复杂,这里不细说了。

下面再分享一下我这儿关于 PHP 的配置部分,完美支持 PATH_INFO(甚至你的目录名取为 *.php 也支持):

## PHP/FCGI support
error_page 434 = @fastcgi;
location ~ \.php$ {
  if (-d $request_filename) {
    rewrite ^ $uri/ redirect;
  }
  if (!-f $request_filename) {
    return 434;
  }
  include fastcgi.conf;
}

## PHP with pathinfo
location ~ \.php/ {
  try_files $uri $uri/ @fastcgi;
}

## FastCGI handler
location @fastcgi {
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  if (!-f $document_root$fastcgi_script_name) {
    return 404;
  }
  include fastcgi.conf;
}

2. PHP-5.5,编译安装也很顺利,内置了 ZendOpcache,因此配合 apcu(取代apc) 来做 user cache。
但面临的大量 error log,主要是以前不规范的 E_NOTICE,还有很多 E_STRICT, E_DEPRECATED 这种是随着 PHP 变迁
而造成的,怨不得人。最无比蛋疼的是:preg_replace 中的 /e 修正符,mysql 扩展(mysql_connect)deprecated 了。

🙁 为确保新代码的规范性,我们决定在 php.ini 里采用 E_ALL,而旧代码则在公共头文件修改 error_reporting 来临时屏蔽。

3. MySQL 5.6.12,这个是最纠结的。编译时间相当长,下面是我的 cmake 配置:

cmake -DCMAKE_INSTALL_PREFIX=/home/soft/mysql56 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1

make && make install

漫长编译过后。从网上下载了一份比较新的中文版的 my.cnf 对照 changeslog 改了改做模板(不少选项失效了,如:query-slow-log)。
就头疼那个数据库转换,拿几个库简单测试一下都不太好,用 mysql_upgrade 均失败,大概版本跨度太大了。

于是手动修改新的 my.cnf 将服务绑在别的端口和 socket 上先,然后新旧2个 MYSQL 都开起来。
采用 mysqldump 将旧版数据导出来(7G多),再导入新版 mysql 中,再在新版处运行 bin/mysql_upgrade 完成升级。

注:需要手动删除旧版导出数据中的 `mysql.user` 表的 root 等相关帐号,避免冲突导不进。

升级手记:通通最新版,php-5.5.0/nginx-1.4.1/mysql-5.6.12》上有2条评论

  1. hightman 文章作者

    后记:步子跨太大,似乎扯着蛋了。编译完导入旧数据时发现提示不支持 ‘gbk’ 字符集了。原来是 cmake 配置时不会刷新,我手动删除 include/my_config.h 后再配置和编译终于OK

    回复

hightman进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注