本文主要记录如何在
CentOS 7.6
中编译安装PHP
官方最新的8.0.3
版本。由于像Nginx
、Mysql
和PHP
的的源码都是用C/C++
写的,所以自己的CentOS 7.6
服务器上必须要安装gcc
和g++
软件。搭建
LNMP
环境一般是先安装Mysql
/MariaDB
,再安装Nginx
,其次是安装PHP
准备工作
创建用户和组
先先创建一个名为
php
且没有登录权限的用户和一个名为php
的用户组,然后安装php
所需的依赖库和依赖包,最后通过.configure
进行安装的详细配置。
- 创建
php
系统用户和系统用户组
groupadd -r php && useradd -c "PHP Server" -r -g php -s /sbin/nologin -d /usr/local/php php -M
安装相关包
安装依赖库
- 安装编译软件及依赖
yum install -y gcc gcc-c++ make autoconf automake
- 安装
PHP
常用的库依赖
yum -y install oniguruma oniguruma-devel freetype freetype-devel libpng libpng-devel libjpeg libjpeg-devel libxml2 libxml2-devel libevent libevent-devel zlib zlib-devel curl curl-devel openldap-devel openldap-clients libicu-devel libicu-devel libtidy libtidy-devel sqlite-devel libcurl-devel libxslt-devel net-snmp-devel libedit-devel libxslt-devel bzip2-devel gd-devel php-ldap gmp-devel re2c
链接LD
库
- 定义lib库
cat << EOF > /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
EOF
# 使环境变量立即生效
ldconfig -v
编译安装 PHP
- 下载并解压文件
(备用:https://blog.xiaoqy.com/pub/packages/php/php-8.0.3.tar.gz)
wget -P '/usr/local/src' https://www.php.net/distributions/php-8.0.3.tar.gz \
&& cd /usr/local/src \
&& tar -zxvf php-8.0.3.tar.gz -C '/usr/local/src' \
&& cd php-8.0.3
如果发现目录中并没有
configure
文件, 但是有一个名为buildconf
的文件,通过运行这个文件生成configure
文件
# 运行 buildconf 文件, 生成 configure 文件,加入 --force 选项
./buildconf --force
- 预编译
./configure \
--prefix=/usr/local/php \
--exec-prefix=/usr/local/php \
--bindir=/usr/local/php/bin \
--sbindir=/usr/local/php/sbin \
--includedir=/usr/local/php/include \
--libdir=/usr/local/php/lib/php \
--mandir=/usr/local/php/php/man \
--with-config-file-path=/usr/local/php/etc \
--with-mysql-sock=/var/run/mysql/mysql.sock \
--with-mysqli=shared,mysqlnd \
--with-pdo-mysql=shared,mysqlnd \
--with-openssl \
--with-snmp \
--with-mhash \
--with-zlib \
--with-zip \
--with-gettext \
--with-curl \
--with-pcre-jit \
--with-jpeg \
--with-freetype \
--with-gmp \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-pear \
--with-tidy \
--without-gdbm \
--enable-gd \
--enable-ftp \
--enable-xml \
--enable-pcntl \
--enable-shared \
--enable-sockets \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-mbregex \
--enable-mbstring \
--enable-soap \
--enable-session \
--enable-opcache \
--enable-fpm \
--enable-fast-install \
--enable-calendar \
--enable-exif \
--enable-intl \
--disable-debug \
--disable-rpath \
--disable-fileinfo
编译配置报错?
报错:
Alternatively, you may set the environment variables LIBZIP_CFLAGS and LIBZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.
- 方式一(方便)
yum -y install epel-release
rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum --enablerepo=remi install libzip5-devel
- 方式二(知道咋回事)
编译安装,指定 PKG_CONFIG_PATH
,上面报错中其实有提示信息,让我们考虑调整 PKG_CONFIG_PATH
环境变量。
下面是详细步骤:
# 先卸载已有
yum remove -y libzip libzip-devel
# 然后安装
(备用:https://blog.xiaoqy.com/pub/packages/libzip/libzip-1.2.0.tar.gz)
wget -P '/usr/local/src' https://libzip.org/download/libzip-1.2.0.tar.gz \
&& cd /usr/local/src \
&& tar -zxvf libzip-1.2.0.tar.gz -C '/usr/local/src' \
&& cd libzip-1.2.0
./configure
make && make install
# 装完了之后找一下 /usr/local/lib 下有没有 pkgconfig 目录
# 有的话执行以下命令来指定PKG_CONFIG_PATH。
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"
- 编译并安装
make && make install
编译报错?
报错:
configure: error:Please reinstall the iconv library
原因:未安装
libiconv
(备用:https://blog.xiaoqy.com/pub/packages/libiconv/libiconv-1.16.tar.gz)
wget -P '/usr/local/src' https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz \
&& cd /usr/local/src \
&& tar -zxvf libiconv-1.16.tar.gz -C '/usr/local/src' \
&& cd libiconv-1.16
./configure --prefix=/usr/local/libiconv
make && make install
# 然后编译时可加入选项 --with-iconv-dir=/usr/local/libiconv
配置 PHP
- 添加
PHP
配置文件
# 将 php 源码编译目录下的 php.ini-production 拷贝到 php 安装目录下的 etc 目录下
cp php.ini-production /usr/local/php/etc/php.ini
- 修改
PHP
配置文件
vim /usr/local/php/etc/php.ini
# 修改 PHP 扩展目录所在位置
# 搜索 ;extension_dir = "./" 替换为
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20200930"
# 开启 mysqli 扩展
# 找到 ;extension_dir = "ext" 替换为
extension = mysqli.so
extension = pdo_mysql.so
# 修改服务器所在时区
# PRC 就是英文 People's Republic of China,中华人民共和国
# 找到 ;date.timezone = 替换为
date.timezone = PRC
# 开启 OPcache
# 跳转到末行,输入以下内容
zend_extension = opcache.so;
# 保存并退出
:wq!
- 添加
php-fpm
管理相关的配置文件到系统配置目录/etc/init.d
# 将 php 源码编译目录下的 sapi/fpm/init.d.php-fpm 文件拷贝到系统配置 /etc/init.d 目录下并重命名为 php-fpm
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cd ~
- 添加
php-fpm
配置文件
# 将 php 安装目录下的 /usr/local/php/etc/php-fpm.conf.default 文件拷贝同目录下并重命名为 php-fpm.conf
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
- 添加
www.conf
配置文件
# 将 php 安装目录下的 /usr/local/php/etc/php-fpm.d/www.conf.default 文件拷贝同目录下并重命名为 www.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
- 添加
PHP
安装目录到系统环境变量
# 加入环境变量:
echo -e "export PATH=\$PATH:/usr/local/php/bin:/usr/local/php/sbin" > /etc/profile.d/php.sh
# 使用 source 立即生效刚刚添加的 php 环境变量
source /etc/profile.d/php.sh
- 设置
PHP
日志目录和php-fpm
运行进程的ID
文件目录
php-fpm`运行进程的 ID 文件也就是`php-fpm.sock
其中设置
php-fpm
进程目录的用户和用户组为Nginx
# 创建 php-fpm 日志目录
mkdir -p /var/log/php-fpm/
# 创建 php-fpm 进程的 ID(php-fpm.sock) 文件运行目录
mkdir -p /var/run/php-fpm
# 修改 php-fpm 进程的 ID(php-fpm.sock) 文件运行目录的所属用户和组
chown -R nginx:nginx /var/run/php-fpm/
- 修改
session
的目录配置
# 创建 session 存放目录
mkdir -p /var/lib/php/session
# 修改 session 存放目录的所属用户和组
chown -R nginx:nginx /var/lib/php
# 修改 PHP 配置文件下的 ;session.save_path = "/tmp"
sed -i 's/^;session.save_path\s\+\=\s\+\"\/tmp\"/session.save_path\ \=\ \"\/var\/lib\/php\/session\"/g' /usr/local/php/etc/php.ini
- 设置
PHP
开机启动
# 修改系统配置目录下的 php-fpm 文件可执行权限
chmod +x /etc/init.d/php-fpm
# 将系统配置目录下的 php-fpm 添加到 系统服务
chkconfig --add php-fpm
# 设置 php-fpm 系统服务 为开机启动
chkconfig php-fpm on
- 检测
php-fpm
系统服务是否启动成功
# 用 chkconfig 命令检测一下服务是否运行成功
chkconfig --list | grep php-fpm
> php-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# 可见服务已经在 第 2 到 第 5 运行等级打开
# 同样你也可以禁用 php-fpm 开机启动
chkconfig php-fpm off
# 用 chkconfig 命令检测一下服务是否运行成功
chkconfig --list | grep php-fpm
> php-fpm 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# 可见服务已经在 第 2 到 第 5 运行等级已经关闭
- 测试
PHP
的配置文件是否无误
php-fpm -t
- 启动
PHP
系统服务
# 使用 systemctl start + 服务名 启动系统服务
systemctl start php-fpm.service
- 查看
PHP
系统服务状态
# 使用 systemctl status + 服务名 查看系统服务状态
systemctl status php-fpm.service
- 查看
PHP
版本信息
php -v
- 修改
Nginx
配置文件使之使用Nginx
反向PHP
解释器
修改
Nginx
配置文件使之使用Nginx
反向PHP
解释器, 也就是php-fpm
它其实就是CGI
# 说明一下我在安装的 nginx 是将配置文件放在 /etc/nginx 目录下
# 修改配置文件如下:
server {
listen 80;
server_name www.xiaoqy.com;
#charset koi8-r;
access_log logs/nginx.dev.access.log main;
location / {
root /data/www/html;
index index.php index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data/www/html;
}
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 30d;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www/html/$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}
- 编辑文件
vim /data/www/html/index.php
# 输入内容
<?php
phpinfo();
# 保存退出
:wq!
- 重新加载
nginx
配置
systemctl reload nginx.service
作者:白小七羽
原文链接:https://blog.xiaoqy.com/382.html