由于最近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 socket127.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 安装更可控、更干净。
