CentOS7 编译安装最新版NGNIX、PHP、MySQL(二进制包)

以前 VPS 上搭建的 WEB 服务器环境都是用的一键懒人包,如 Oneinstack ,最近折腾其它软件,把 WEB 环境搞挂了,MySQL 死活不给面子,一通百度、GOOGLE也没能治好她这个娇小姐的病。罢了!罢了!只好放弃治疗,重新纳妾取妃,新人换旧人。备份了数据,重装了 VPS 的系统。然后,就开始搭建 WEB 环境,一开始也是用的一键懒人包 Oneinstack ,没想到 Oneinstack 经过不断的升级迭代,居然水土不服了,NGINX 安装不上;PHP 也安装不上……作为一个爱折腾的人,作为一个用了快5年的 Linux 系统 VPS 的博主,决定挑战一下自己,编译安装最新版的 NGINX 和 PHP 。注:本博客构建于WordPress 之上,故需用NGNIX + PHP + MySQL 。

CentOS7 编译安装最新版NGNIX、PHP、MySQL

详细指南CentOS7 编译安装最新版NGNIX1.17.8、PHP7.4.2、MySQL8.0.19

0.系统信息及内核版本等

cat /etc/*-release   # cat /etc/issue   # lsb_release -a
### CentOS Linux release 7.7.1908 (Core)
uname -a    # cat /proc/version 
### Linux go2do 2.6.32-042stab120.11 #1 SMP Wed Nov 16 12:05:45 MSK 2016 x86_64 x86_64 x86_64 GNU/Linux

1.编译安装最新版 NGINX/1.17.8

1.1编译安装NGINX之前的准备工作

主要的准备工作包括:创建 WEB 服务器专用的用户和用户组;下载依赖库。

1.1.1 创建www-data用户和组

网页文件的属主就是它了,可以不创建该用户目录,设置为不允许登录。当然这步不是必须的,但为了安全建议创建一个专用的用户并限制权限。

useradd -M -r -s /sbin/nologin www-data 
# -M 不创建用户目录,-r 系统用户,-s 登录用的 login shell
# 删除用户,使用的命令“userdel 用户名”即可。使用“userdel -r 用户名”来将它留在系统上的文件及文件夹也删除掉。

1.1.2 下载依赖库

这个是因人而异的,因为每个人需要的 NGINX 的功能模块不一样,列举几个常用必须的。

#因为要用到 NGINX 的 http_v2_module 模块,所以需要 openssl-1.0.2 及以上,使用" openssl version "或者" yum info openssl "查看版本,OpenSSL 是用于加密传输的
# 一开始用的 openssl-1.1.1d 是最新版,但是与 nginx/1.17.8 有兼容性问题,编译无法通过
mkdir ~/src   #在当前用户目录创建 src 目录用于存放下载的源码
cd  ~/src   
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz  
tar zxvf openssl-1.1.1a.tar.gz  
# 也看到有人用 yum install openssl openssl-devel 的方式解决这个依赖问题,本博主未验证该方法的有效性,因为 yum 里面的版本不一定符合要求。
#另外 openssl/1.0.1 存在安全漏洞,因此处于安全考虑也应当升级 OpenSSL 版本,在升级之前检查一下的路径" which openssl "
#不要轻易去卸载系统自带的包,编译安装新版 OpenSSL 时加入选项 " --prefix=/usr/local/openssl "安装到其它路径,升级 OpenSSL 之后,可以使用软链接将其链接回原来的默认路径
#编译安装其它需要使用  OpenSSL 软件时,使用  OpenSSL 新的路径,如 " /usr/local/openssl "作为附加选项即可。
 
# PCRE  是一个 perl 兼容的正则表达式库,详细的信息可以查看:http://www.pcre.org/
#一般都默认安装了,rpm -qa | grep pcre 检查是否安装,如果没有,安装方式如下:
yum install -y pcre pcre-devel
 
# zlib 是一个无损的数据压缩库,详细的信息可以查看:https://www.zlib.net/
一般都默认安装了,rpm -qa | grep zlib 检查是否安装,如果没有,安装方式如下:
yum install -y zlib zlib-devel
 
### xxx-devel 的安装包一般是xxx软件的开发包,用于编译的时候连接的库之类的文件

1.2下载并编译安装NGINX/1.17.8

cd  ~/src 
wget http://nginx.org/download/nginx-1.17.8.tar.gz
tar zxvf nginx-1.17.8.tar.gz
sudo ./configure --prefix=/usr/local/nginx  --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-openssl=~/src/openssl-1.1.1a 
sudo make 
sudo make install
#以上步骤只要没有报错,出现" error "字样就算是顺利完成了最新版的 NGINX/1.17.8 的安装工作,后续的工作就是配置虚拟主机、性能优化和安全优化等工作了。
/usr/local/nginx/sbin/nginx -V  #测试 NGINX 能否运行, 查看 NGINX 加载的模块,小写的 “  -v  ”是查看NGINX版本。
/usr/local/nginx/sbin/nginx -t  #测试 NGINX 的配置文件是否正确。
/usr/local/nginx/sbin/nginx -s reload   #重新加载配置文件
# --prefix=/usr/local/nginx  用于设定 NGINX 的安装位置
# --with-http_stub_status_module  服务器状态监控模块,在配置文件的 server 段子开启相关功能即可使用,开启方法:stub_status on;
# --with-http_v2_module  用于开启 http/2 支持
# --with-http_ssl_module  用于开启 SSL 支持,开启方法:listen 443 ssl http2;
# --with-http_gzip_static_module 用于启动预压缩功能,对所有类型的文件都有效,开启方法 :gzip_static on
# --with-http_realip_module 在前端使用代理或CDN缓存的情况下,用于获取用户真实IP
# --with-openssl=~/src/openssl-1.1.1a  指定 OpenSSL 依赖库的 !源码!目录
 
#缺失 OpenSSL 依赖库时报错如下:
#./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules,
# or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl= option.

1.3 启用 NGINX

# a.直接启停控制:
/usr/local/nginx/sbin/nginx
# 快速停止nginx 
/usr/local/nginx/sbin/nginx -s stop 
# 完整有序的停止nginx,quit是一个优雅的关闭方式,Nginx在退出前完成已经接受的连接请求  
/usr/local/nginx/sbin/nginx -s quit 
 
# b.创建 systemd 启动文件nginx.service 启停控制:(PS:我的效果不佳)
# Note: this file ( /usr/lib/systemd/system/nginx.service )
# will be overwritten on package upgrade, please copy the file to 
#
# /etc/systemd/system/nginx.service 
# 
# to make needed changes.
# 
# systemd-delta can be used to check differences between the two nginx.service files.
# It's not recommended to modify this file in-place, because it
# will be overwritten during upgrades.  If you want to customize,
# the best way is to use the "systemctl edit" command.
 
[Unit]
Description=nginx
Documentation=man:nginx
After=network.target
#After=syslog.target
 
[Service]
Type=forking
#systemctl status就是根据pid来判断服务的运行状态的,注意与 conf 文件里面的设置的 PID 文件路径保持一致
PIDFile=/usr/local/nginx/run/nginx.pid;
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
 
# 以root权限来启动程序 或者 chmod u+s /usr/local/nginx/sbin/nginx,因为普通程序不能使用1024以下的端口
PermissionsStartOnly=true
 
#给服务分配独立的临时空间
PrivateTmp=true
 
# Give up if ping don't get an answer
# Disable service start and stop timeout logic of systemd for nginx service
# TimeoutSec=600
 
#Restart配置可以在进程被kill掉或者Failure 之后,让systemctl产生新的进程,避免服务挂掉
# Restart=always
# Restart=on-failure   
 
# 拉起间隔
# RestartSec=5   
[Install]
WantedBy=multi-user.target
# Alias=ngnix.service

网站根目录权限遵循:
文件644 文件夹755 权限用户和用户组 www-data,其余文档777权限是不正常的
如出现文件权限问题时,请执行下面3条命令:

chown -R  www-data. www-data /data/html/
find /data/html/ -type d -exec chmod 755 {} \
find /data/html/ -type f -exec chmod 644 {} \

2.编译安装最新版 PHP/7.4.2

2.1编译安装PHP之前的准备工作

编译安装PHP之前的需要完成的准备工作是:下载安装依赖库。这个是因人而异的, 而且 PHP 需要的功能模块挺多的,列举几个常用且必须的。GD绘图库及IMG、JPEG等图形库,一般都安装了,我这里省略不装了。

# libxml2 是一个C语言的XML库,能简单方便的提供对XML文件的各种操作,详细的信息可以查看:http://xmlsoft.org/
#一般都默认安装了,rpm -qa | grep libxml2 检查是否安装,如果没有,安装方式如下:
yum install -y libxml2 libxml2-devel
 
# curl 是一个浏览工具,完成 HTTP 请求,支持很多协议如ftp等,一般都默认安装了,否则,无法升级WordPress及插件。会报错,如“No working transports found.”   
# rpm -qa | grep curl 检查是否安装,如果没有,安装方式如下:
yum install -y curl curl-devel libcurl libcurl-devel
 
# php-mbstring 字符串编码处理,如果缺少,会报错,如“ PHP Startup: mbstring: Unable to initialize module ”
# rpm -qa | grep php-mbstring 检查是否安装,如果没有,安装方式如下:
yum install  -y  php-mbstring
 
# libiconv 主要是解决多语言编码处理转换如果缺少,会报错,如“/usr/bin/ld: cannot find -liconv ”
# ~/src/php7.4.2/ext/iconv/iconv.c:1031: undefined reference to `libiconv_open'
# ~/src/php7.4.2/ext/iconv/iconv.c:1290: undefined reference to `libiconv_close'
 
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
tar zxvf libiconv-1.16.tar.gz
cd libiconv-1.16
sudo ./configure --prefix=/usr/local/libiconv
sudo make 
sudo make install

2.2编译安装PHP/7.4.2

# git 克隆下来的文件没有 configure 文件,所以通过 " ./buildconf --force "生成该文件,如果已经存在 configure 文件则不需要生成
wget https://www.php.net/distributions/php-7.4.2.tar.gz
tar zxvf php-7.4.2.tar.gz
cd php-7.4.2
sudo ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-fpm-group=www-data --with-fpm-user=www-data --with-fpm-systemd --with-mysqli --with-openssl --with-curl --with-zlib --enable-fpm --enable-mbstring --enable-opcache --disable-debug --disable-fileinfo --with-iconv-dir==/usr/local/libiconv --with-openssl-dir=/usr/lib/openssl
sudo make 
sudo make install
#以上步骤只要没有报错,出现" error "字样就算是顺利完成了最新版的 编译安装PHP/7.4.2 的安装工作,后续的工作就是配置虚拟主机、性能优化和安全优化等工作了。
# --prefix=/usr/local/php  用于设定 PHP 的安装位置
# --with-config-file-path  用于指定的 php.ini 路径
# --with-config-file-scan-dir=/usr/local/php/etc/php.d  php.ini的扩展目录
# --with-fpm-group=www-data 设置 FPM 运行的用户组(默认是nobody)
# --with-fpm-user=www-data  设置 FPM 运行的用户名(默认是nobody)
# --with-fpm-systemd  启用 systemd 集成 (默认是no,需用 service 方式启动)
 
# --with-mysqli=mysqlnd 启用对 MySQL 数据库的连接模块
# --with-mysqli=/usr/local/mysql/bin/mysql_config
#以上二选一,详见:https://www.php.net/manual/zh/mysqli.overview.php
 
# --with-curl  启用 curl 浏览工具模块
# --with-zlib  启用 zlib 无损数据压缩库的模块,
#如果没有–with-zlib,进 wordpress 后台报500错误(Fatal error: Uncaught Error: Call to undefined function gzinflate() )
# --enable-opcache  启用 opcache 缓存模块
# --enable-fpm  启用 fpm-cgi 网关接口
# --enable-fastCGI 支持fastcgi方式启动PHP
# --enable-mbstring  启用多字节,字符串的支持
# --disable-debug      关闭调试模块
# --disable-fileinfo   关于 fileinfo 函数,官网给出的定义是:本模块中的函数通过在文件的给定位置查找特定的 魔术 字节序列 来猜测文件的内容类型以及编码。 
#虽然不是百分百的精确, 但是通常情况下能够很好的工作。(https://www.php.net/manual/zh/intro.fileinfo.php)
#由于编译时十分占内存,故如非必须,小内存编译时“disable”
# --with-mcrypt     mcrypt算法,函数库需要安装
# --with-mhash       mhash算法,函数库需要安装
# --with-iconv-dir==/usr/local/libiconv  使用whereis libiconv 进行查找,不是 libiconv 使用源码目录, !安装后的工作目录!,yum 方式安装该库不需要该参数指定路径
# --with-openssl-dir=/usr/lib/openssl    使用whereis openssl 进行查找,不是 OpenSSL 使用源码目录, !安装后的工作目录!,yum 方式安装该库不需要该参数指定路径
#一般都默认安装了,如果希望使用最新版的,需要下载源码编译安装
 
# ./configure --help 可以查看详细的支持的编译参数,中文翻译:https://www.cnblogs.com/HKUI/p/5137115.html
#安装完成后,如需再次编译安装,需用 phpize 重新配置编译参数,还要make clean 一下
# php -v 测试是否安装成功及查看安装的版本
# php -i 或者 phpinfo() 函数查看详细的安装信息

2.3 启用 PHP-FPM

如前所述,格物躬行博客是基于 WordPress 搭建的,而 WordPress 是由 PHP 语言编写的,所以安装 PHP 的目的是为了让 NGINX 通过 FastCGI接口,将 PHP 语言的动态 WEB 页面解析传递给 PHP 语言解析器,PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 进程管理器,用于管理 PHP 进程池的软件,用于接受web服务器(此处为NGINX)的请求。

cp ~/php-7.4.2/php.ini-development /usr/local/php/etc/php.ini
#源码里面有php.ini-development和php.ini-production,如果不是调试开发阶段,选择后者
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
#把启动用户改为和nginx服务同一个启动用户,前面Nginx使用的是www-data账户,这里改成和Nginx使用一样的账户
 
#启动php-fpm,以下三选一即可,三更佳
cp ~/php-7.4.2/sapi/fpm/php-fpm /usr/local/bin #使用方法:" /usr/local/bin/php-fpm "
cp ~/php-7.4.2/sapi/fpm/init.d.php-fpm  /etc/init.d/php-fpm   #使用方法:" service php-fpm {start|stop|force-quit|restart|reload|status|configtest} "
cp ~/php-7.4.2/sapi/fpm/php-fpm.service /usr/lib/systemd/system/php-fpm.service  #使用方法:" systemctl {start|stop|restart|status} php-fpm "
 
 
#查看启动脚本中指定的程序目录和pid文件(默认已经修改过了,如果没有修改过执行下面操作)
grep -E 'PIDFile|ExecStart' /usr/lib/systemd/system/php-fpm.service
#修改启动脚本,把里边 prefix 相关的内容用实际路径代替
 vim /usr/lib/systemd/system/php-fpm.service
#将
# PIDFile=${prefix}/var/run/php-fpm.pid
# ExecStart=${exec_prefix}/sbin/php-fpm --nodaemonize --fpm-config ${prefix}/etc/php-fpm.conf
# 修改成
# PIDFile=/usr/local/php/var/run/php-fpm.pid
# ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
 
#重新载入 systemd
 systemctl daemon-reload
#让 php-fpm 随机启动
 systemctl enable php-fpm

3.安装最新版 MySQL/8.0.19

3.1安装 MySQL 之前的准备工作

安装 MySQL 之前需要进行的准备工作是:创建 MySQL 用户和组,数据库文件的属主就是它了,可以不创建该用户目录,设置为不允许登录。当然这步不是必须的,但为了安全建议创建一个专用的用户并限制权限。

useradd -M -r -s /sbin/nologin MySQLD
# -M 不创建用户目录,-r 系统用户,-s 登录用的 login shell
# 删除用户,使用的命令“userdel 用户名”即可。使用“userdel -r 用户名”来将它留在系统上的文件及文件夹也删除掉。

3.2 安装 MySQL/8.0.19

MySQL使用编译好的二进制包比较方便,官网:https://dev.mysql.com/downloads/mysql/ 上各平台的编译后的二进制包都有。

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz
tar zxvf mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz
#因为是二进制包,将上面解压的文件移动到目标目录即可,如:
mkdir /usr/local/mysql  
cp –r  ~/src/mysql-8.0.19/  /usr/local/mysql/  
# 或者直接解压到目标目录
tar -zxvf mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
#然后用" mv "改名
mv mysql-8.0.19-linux-glibc2.12-x86_64 mysql

3.3 启用 Mysqld_safe

Mysqld_safe是一个 Shell 脚本程序,用于启动 mysqld,并且是 mysqld 的守护进程,增加了一些安全特性,例如在发生错误时重新启动服务器,并将运行时信息记录到错误日志。

#创建数据库文件夹,用于存放数据
mkdir ~/mysql
#设置权限,规定为 MySQLD 所有
chown -R MySQLD:MySQLD ~/mysql
#进行数据库初始化,初始化自动生成的数据库的临时密码:" ... A temporary password is generated for ..."或者查看" error log "日志。
/usr/local/mysql/bin/mysqld --initialize --user=MySQLD --basedir=/usr/local/mysql/ --datadir=~/mysql
/
#创建启动文件,官方文档" mysql.server "建议将启动文件放在" /etc/init.d/ "
cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysql
ln -s /etc/init.d/mysql /etc/init.d/mysqld
 
#找一份 MySQL 的配置文件:my.cnf ,然后放在" /etc/ "或者" /etc/mysql.d/ "目录下
#然后,根据实际情况,配置 my.cnf 中的,如
basedir=/usr/local/mysql/
datadir=~/mysql
socket = /tmp/mysql.sock  #注意赋予权限,可创建/tmp/mysql/文件夹赋权 “chown -R ...”
pid-file = /var/run/mysql/mysqld.pid #注意赋予权限,可创建/tmp/mysql/文件夹赋权 “chown -R ...”
 
 
#mysql.sock问题:Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 
#这是可以由于系统默认的文件位置和文件位置不一致,解决办法找到文件创建软链接 
find / -name mysql.sock 
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
 
#还有一种常见问题:MySQL启动错误:Error writing file '/var/run/mysqld/mysqld.pid' 
#查看"ll /var/run/ "下面是否有 mysqld 目录,以及所属于是否为" MySQLD:MySQLD  "
 
 
/etc/init.d/mysql  start    ## 启动 mysql 服务器端
/etc/init.d/mysql   stop     ## 停止 mysql 服务器端
/etc/init.d/mysql   status   ## 查看 mysql 服务器端状态

**关于 Systemctl 及 /etc/init.d 系统启动文件的基础知识**

    • 对于使用 systemctl 控制各种服务的系统:
  • /usr/lib/systemd/system/ 该目录一般存放用户自己安装软件或制作的 .service 文件;
  • /lib/systemd/system/ 该目录一般存放系统软件 .service 文件;
  • /etc/systemd/system/ 优先级最好,而且开机具有自启动特性,systemctl enable xxx 就是创建前面两个目录中 .service 至该目录的软链接;
  • /etc/init.d 该目录存放 service 命令执行服务控制脚本的目录,属于systemd 之前的 System V init 时代的产物;
  • chkconfig –add 服务名 ;chkconfig 服务名 on / off 设定开机自启动, systemd 兼容 chkconfig 的设定,也会开机自动执行 ;
  • /etc/init.d 是 /etc/rc.d/init.d/ 的启动脚本的软链接,这些脚本被ln 命令来连接到 /etc/rc.d/rcN.d 目录。(这里的 N 就是运行级0-6)。

@其它@

置于优化配置、安全防护,且看下回分解!

欢迎投稿、分享转载,转载请保留如下信息:格物躬行博客[https://www.go2do.net]

本文由 [go2do] 原创,本文链接: https://www.go2do.net/vps/how-centos7-ngnix-php7-mysql8-compile-install.html



You may also like...

3 Responses

  1. 格物躬行说道:

    在我的系统上,经过测试,发现用systemctl 启动nginx和php-fpm都有稀奇古怪的问题
    systemctl start nginx 启动造成假死
    systemctl start php-fpm 启动造成WordPress“建立数据库连接时出错”,有时候是502网关错误

    最终按如下方式启停:NGINX
    sudo /usr/loca/nginx/sbin/nginx
    sudo /usr/loca/nginx/sbin/nginx -s reload
    sudo /usr/loca/nginx/sbin/nginx -s quit
    sudo /usr/loca/nginx/sbin/nginx -s stop

    最终按如下方式启停:PHP-FPM
    sudo /usr/local/php/sbin/php-fpm
    ps -ef|grep php|awk '/root/ {print $2}'|xargs sudo kill -15

    最终按如下方式启停:MySQL
    sudo /etc/init.d/mysql start
    sudo /etc/init.d/mysql stop
    sudo /etc/init.d/mysql status

  2. 格物躬行说道:

    不重新编译全部PHP源码,安装PHP扩展的方法:
    1、下载需要的源码(可以先去 php源码目录/ext/ 里面看看)、解压;
    2.、配置,不想重新编译全部 php 源码时,这时我们就可以使用 phpize 命令
    3、 ./configure --with-php-config=/path/to/php-config
    4、 make && make install
    5、 将编译生成的 xx.so 文件,该文件在当前源码目录的 /modules/ 中,拷贝到 php的/usr/local/php/lib/php/extensions/no-debug-non-zts-... 文件夹
    6、最后, 在 php.ini 添加 extension = xx.so,重启 PHP,即可。

    部分扩展,如 opcache.so ,在 php源码目录/modules/ 里面,可以直接 拷贝到 php的/usr/local/php/lib/php/extensions/no-debug-non-zts-... 文件夹,在 php.ini 添加 extension = opcache..so,重启 PHP,即可。

  3. 格物躬行说道:

    关于 WordPress 的 PHP 扩展,WordPress 主机团队在团队手册 (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)中维护着一份必需和推荐的模组列表。

发表评论

电子邮件地址不会被公开。

本页共执行147次数据库查询,耗时0.425秒,使用内存 1.78 MB