由于最近wordpress后台一直有PHP版本太低的告警,今天刚好有点时间,就给他升级了一下。

PHP 8.3 源码编译,到 Apache + PHP-FPM 联调,再到 WordPress 运行问题排查,最后完成 systemd 管理与安全加固


一、升级PHP 8.3 新版本

首先安装依赖和下载PHP 8.3的安装包

yum install gcc gcc-c++ libxml2 libxml2-devel -y
wget http://cn2.php.net/get/php-8.3.30.tar.gz/from/this/mirror -O php.tar.gz
tar -zxvf php.tar.gz && cd php-8.3.30

然后编译与安装

./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-zlib \
--with-curl \
--enable-mbstring \
--enable-opcache

下面这个是一开始安装的命令,这个安装没成功,缺少mysql组件,会导致wordpress运行不了

/configure --prefix=/usr/local/php --enable-fpm
make && make install

安装完成后,需要把之前老版本的php-fpm停止掉,然后启动新版本的php-fpm,因为我老版本是php74-fpm,所以用下面命令停止他

systemctl stop php74-php-fpm
systemctl disable php74-php-fpm

然后开始配置新版本的php-fpm

1、生成配置文件

cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
cp php-fpm.d/www.conf.default php-fpm.d/www.conf

2、编辑www.conf

vim /usr/local/php/etc/php-fpm.d/www.conf

重点检查 / 修改这几项:

user = apache
group = apache

listen = 127.0.0.1:9000

listen.owner = apache
listen.group = apache
listen.mode = 0660

系统参考:

CentOS / Rocky:apache

Ubuntu:www-data

3、启动 php-fpm

/usr/local/php/sbin/php-fpm

到这里就完成了,但是我打开首页,发现出问题了,访问首页变成下载index.php文件!!!

注意:在解决问题之前,如果服务器允许公网访问,建议先把服务关掉,可以放一个维护页面到nginx,避免有些敏感信息被黑客爬取了。


二、问题:index.php 被浏览器下载

Apache 已正常启动,访问站点首页时却出现:

浏览器直接下载 index.php 文件,而不是显示页面

原因分析

这是 Apache 没有把 PHP 请求交给 PHP-FPM 处理 的典型表现:

  • PHP 已安装(能 php -v
  • 但 Apache ↔ PHP-FPM 没有正确联动

找出 Apache 实际加载的配置目录

httpd -V | grep SERVER_CONFIG_FILE

你会看到类似:

-D SERVER_CONFIG_FILE="/etc/httpd/conf/httpd.conf"

再看 include:

grep -R "conf.d" /etc/httpd/conf/httpd.conf

必须看到类似:

IncludeOptional conf.d/*.conf

然后查看php-fpm.conf是否存在

ls -l /etc/httpd/conf.d/php-fpm.conf

如果不存在,需要新建配置文件(我遇到的问题就是这个不存在,也不知道之前老版本为啥能运行???)

vim /etc/httpd/conf.d/zzz-php83.conf

内容一字不改粘进去:

# PHP 8.3 via PHP-FPM (TCP)
<FilesMatch "\.php$">
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

DirectoryIndex index.php index.html

重启 Apache(必须 restart)

systemctl restart httpd

到这一步,访问首页已经不再是下载文件了,可以打开首页了。

但是首页内容不对,出现了一个报错:

您的 PHP 似乎没有安装运行 WordPress 所必需的 MySQL 扩展。
请检查 PHP 扩展 mysqli 已安装并启用。

这是因为之前安装的时候,没有安装mysql扩展,所以会有报错,如果在上面用正确的命令安装了,那应该不会出现这个问题。


三、问题:访问首页显示需要mysql扩展

PHP新版本编译的时候命令缺少一些参数,需要加上mysql扩展相关的东西

cd php-8.3.30

./configure \
--prefix=/usr/local/php \
--enable-fpm \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-curl \
--with-zlib \
--with-zip \
--with-gd \
--enable-mbstring \
--enable-opcache

编译 & 安装

make -j$(nproc)
make install

重启 PHP-FPM + Apache

pkill php-fpm
/usr/local/php/sbin/php-fpm
systemctl restart httpd

但是在执行configure命令的时候,报了一个错误:

checking for libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0... no configure: error: Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met:
No package 'libzip' found 
No package 'libzip' found 
No package 'libzip' found 
Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. 

这是libzip依赖没有安装导致的,需要安装一下,但我一直只能安装到0.10的版本,不满足版本>=0.11的要求。(这个其实也可以手动下载libzip的新版本来自己编译安装,后面有补充)

解决方案:给当前 PHP 8.3.30 补编译 mysqli(推荐 mysqlnd)

安装 MySQL 客户端开发库(必须)

yum install -y mysql-devel

如果你用的是 MariaDB(CentOS 7 默认):

yum install -y mariadb-devel

重新配置(关键一步)

./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-zlib \
--with-curl \
--enable-mbstring \
--enable-opcache

💡 mysqlnd 是 官方内置驱动,不依赖 MySQL 版本,最稳

编译并安装

make -j$(nproc)
make install

重启 PHP-FPM

pkill php-fpm
/usr/local/php/sbin/php-fpm

或者(如果你有 systemd):

systemctl restart php-fpm

然后验证一下,应该就可以访问首页了。

但是我打开文章出现报错:

建立数据库连接时出错

补充手动安装libzip方法:

1、安装依赖

yum install -y \
  cmake \
  zlib-devel \
  openssl-devel

2、下载并编译 libzip

cd /usr/local/src
wget https://libzip.org/download/libzip-1.9.2.tar.gz
tar xf libzip-1.9.2.tar.gz
cd libzip-1.9.2

mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/libzip
make -j$(nproc)
make install

3、让 pkg-config 能找到新 libzip(关键一步)

cat << 'EOF' > /etc/profile.d/libzip.sh
export PKG_CONFIG_PATH=/usr/local/libzip/lib64/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/usr/local/libzip/lib64:$LD_LIBRARY_PATH
EOF

source /etc/profile

验证:

pkg-config --modversion libzip

👉 应该输出:

1.9.2

4、回到 PHP 源码,重新 configure,应该不再报错了。


四、问题:打开文章出现建立数据库连接时出错

我是wp-config.php 数据库配置问题

vim /usr/share/nginx/html/wp-config.php

⚠️ 注意这几个坑

1️⃣ DB_HOST=localhost ≠ 127.0.0.1

  • localhost走 MySQL socket
  • 127.0.0.1走 TCP

而你的 MySQL 极可能只监听 TCP 或 socket 不一致

👉 直接改成:

define('DB_HOST', '127.0.0.1');

至此:

全都正常了!!!

后面讲一下一些优化,安全防护什么的。


五、让php-fpm变成systemd,自动启动

service 文件

[Unit]
Description=The PHP FastCGI Process Manager
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGQUIT $MAINPID

[Install]
WantedBy=multi-user.target

启用

systemctl daemon-reload
systemctl start php-fpm
systemctl enable php-fpm

六、PHP 安全加固(生产必做)

1️⃣ 隐藏 PHP 版本

expose_php = Off

2️⃣ 隐藏 Apache 版本

ServerTokens Prod
ServerSignature Off

3️⃣ 禁用高危函数

disable_functions = exec,passthru,shell_exec,system

4️⃣ 关闭错误显示

display_errors = Off
log_errors = On

5️⃣ WordPress 专属

remove_action('wp_head', 'wp_generator');

禁用 XML-RPC:

<Files xmlrpc.php>
  Require all denied
</Files>

七、最终效果

  • PHP 8.3 源码编译
  • Apache + PHP-FPM 正确联动
  • php-fpm systemd 托管 + 开机自启
  • WordPress 稳定运行
  • 关键安全信息不再暴露

八、总结

源码编译 PHP 并不难,难的是:

  • 多版本共存的清理
  • php.ini / php-fpm.conf 的加载路径
  • Apache / PHP-FPM / MySQL 三方一致性

只要理解了这些,源码 PHP 反而比 yum 安装更可控、更干净

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注