前些天常常加班,阿里云服务器过期了,博客一直还没来得及迁移。
昨天才开始重新部署环境,centos版本、php版本、mysql版本都有更换,安装过程坑太多了,这就是IT工作的劣势,技术经验如果不跟上更新步伐,经验就不再是经验了。
下面就开始详细描述踩的哪些坑。
新服务器系统环境(用cat /etc/redhat-release命令查看):
CentOS Linux release 8.1.1911 (Core)
centos8支持yum安装nginx,所以nginx安装很方便,没啥坑。
yum -y install nginx
php-fpm是管理php进程的东东,不知道多久以前php和php-fpm是要分开安装的,但是现在编译php,带上--enable-fpm参数就可以在安装php的同时,把php-fpm也给安装进去。
昨天试了,centos8也可以直接yum来安装php了。但是不带mysqli扩展。本人博客数据库采用的mysqli驱动,所以只好另外去下载php源码包了。
下载php源码的位置,戳这里:https://www.php.net/downloads
先安装了7.4版本,结果php -v 和 网页执行php脚本里phpinfo看到的版本号不一致,这种问题之前在windows环境下安装也碰到过,但是处理方法并不一致。
Windows下是phpinfo版本显示正确,php -v显示版本不一致是因为环境变量里引入的php路径是其它php版本的,所以改下环境变量里php路径就好了。
现在Centos系统下php -v里我们可以把/usr/local/php软链到我们7.4版本下的php,但是网页访问phpinfo却始终不是7.4版本,还是yum安装的7.2版本。
php版本有两种,Nginx是如何判断采用的哪一种php版本呢?
一直陷入这个坑问题里。
后面才找到这个根本不是由Nginx来选择使用哪一个版本的。
前面说了,现在php都含有php-fpm, 想使用哪个版本php,就启动哪个php版本下对应的php-fpm服务。
安装好7.4版本php后,网站页面出现各种php方法被注释了的警告,额。。。看来php版本也不要说换就换啊。
只好又重新下载7.2版本的php源码了。
关于php源码编译安装,请参考这个链接,步骤更清楚:https://www.cnblogs.com/heijinli/articles/11715102.html
编译php之前,要先安装很多依赖:
yum -y install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ \ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \ zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel \ krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake \ boost-devel bison automake libevent libevent-devel gd gd-devel libtool* \ libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel \ gmp gmp-devel libcurl libcurl-devel openjpeg-devel
上面这个是前人试错总结出来的。
可惜还是不够全面,在安装过程中,我还是遇到了很多错误提示。
提示1:configure: error: Package requirements (sqlite3 > 3.7.4)
解决:yum install sqlite-devel
提示2:Package requirements (libxml-2.0 >= 2.7.6)
这个是安装php7.4版本出现的问题。
解决:./configure 后带上--with-libxml2=/opt/libxml2
提示3:configure: error: Package requirements (oniguruma)
oniguruma,百度了下,这玩意儿是php里正则要用到。之前还真没听过要为了正则安装这么个东东。
这个就是下载对应的源码,编译安装就好了,可参考这里:oniguruma编译安装
提示4:configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.
解决:yum -y install libicu-devel
提示5:configure: error: Cannot find ldap.h
解决:yum -y install openldap openldap-devel
这个上面依赖安装里有,但是不知道为何没有安装成功。这里只好重新装了。
提示6:libtool: link: `ext/hash/hash_adler32.lo' is not a valid libtool object
这是make时报的错。
解决:执行make clean后,再重新make。
好像是执行的yum -y install mysql-community-server,具体细节大家可以百度。
安装好mysql8后,我要给root设置密码,可是mysql8却不再支持password方法了。
百度说用sha1方法,然后我就把authentication_string(mysql5.6版本时都用的password列名,不知道啥时给改了)变成sha1方法加密的字符串,然后就悲剧了,mysql登录不了了。
然后mysql5.6版本时,执行下面这个就好了:
mysqld skip-grant-tables
现在mysql8,却要执行下面这个:
mysqld --console --skip-grant-tables --shared-memory
另外开一个ssh会话窗口,用mysql直接无密登录,然后开始重置密码。
use mysql; update user set authentication_string = '' where user='root' and host = 'localhost'; flush privileges;
然后重新mysql -uroot -p登录,不用密码就可以进去了。再执行下面命令来修改用户密码。
alter user root@localhost identified with mysql_native_password BY '新密码'; flush privileges;
现在mysql8还引入了caching_sha2_password加密方式,不知道是不是通过sha2方法加密的,这个以后再做了解和尝试。
fatal error: ext/standard/php_smart_str.h: No such file or directory
说是跟php7版本有冲突导致。
换成redis4版本,就ok了。
这里可以下载redis源码:http://download.redis.io/releases/