Ubuntu 20.04 从源码编译安装 PHP 8.3 并配置 WordPress
前言
最近 WordPress 后台提示”站点存在关键问题”,主要原因是服务器运行的 PHP 7.4 已经停止安全更新,而 WordPress 官方建议最低使用 PHP 8.3。本文记录了在 Ubuntu 20.04 服务器上从源码编译安装 PHP 8.3 并配置 WordPress 的完整过程。
为什么要升级 PHP?
| 项目 | PHP 7.4 | PHP 8.3 |
|---|---|---|
| 安全更新 | ❌ 已停止 | ✅ 活跃支持 |
| 性能 | 一般 | 提升约 20-30% |
| WordPress 兼容性 | ⚠️ 警告提示 | ✅ 完全兼容 |
| 新特性 | 无 | JIT编译、联合类型、枚举等 |
PHP 7.4 于 2022 年 11 月停止安全更新,继续使用存在安全风险。
为什么需要源码编译?
我的服务器运行的是 Ubuntu 20.04 LTS,虽然添加了 ondrej/php PPA,但该 PPA 已经停止为 focal(20.04)提供 PHP 8.x 的软件包。通过 apt-cache search 搜索不到任何 PHP 8 的包。
可选方案:
- 方案一:升级 Ubuntu 到 22.04 LTS(远程升级有风险)
- 方案二:从源码编译安装 PHP 8.3 ✅(采用此方案)
考虑到服务器有 48 核 CPU 和 30GB 内存,编译速度会很快,最终选择了源码编译。
环境信息
| 项目 | 配置 |
|---|---|
| 操作系统 | Ubuntu 20.04 LTS |
| CPU | 48 核 |
| 内存 | 30GB |
| 原 PHP 版本 | 7.4.3 |
| 目标 PHP 版本 | 8.3.22 |
| Web 服务器 | Nginx 1.18 |
| 数据库 | MySQL 8.0 |
第一步:安装编译依赖
sudo apt-get update
sudo apt-get install -y \
build-essential pkg-config \
libxml2-dev libsqlite3-dev libssl-dev \
libcurl4-openssl-dev libpng-dev libjpeg-dev \
libonig-dev libzip-dev libtidy-dev \
libxslt1-dev libwebp-dev libfreetype6-dev \
libgmp-dev libreadline-dev libxpm-dev \
libldap2-dev libsasl2-dev
这些依赖确保 PHP 能编译出常用的扩展模块,如 GD 图像处理、MySQL 数据库连接、SSL 加密等。
第二步:下载并编译 PHP 8.3
下载源码
cd /tmp
wget https://www.php.net/distributions/php-8.3.22.tar.gz
tar xzf php-8.3.22.tar.gz
cd php-8.3.22
配置编译选项
./configure \
--prefix=/usr/local/php83 \
--with-config-file-path=/etc/php/8.3 \
--with-config-file-scan-dir=/etc/php/8.3/conf.d \
--enable-fpm \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mbstring --enable-bcmath --enable-intl \
--enable-ftp --enable-sockets --enable-soap \
--enable-gd --with-jpeg --with-webp --with-freetype \
--with-zlib --with-zip --with-openssl --with-curl \
--with-tidy --with-xsl --with-gmp --with-readline
关键参数说明:
--prefix=/usr/local/php83:安装到独立目录,不影响系统 PHP--enable-fpm:启用 PHP-FPM(FastCGI 进程管理器)--with-fpm-user=www-data:FPM 以 www-data 用户运行
编译安装(48 核并行编译,约 2-3 分钟)
make -j$(nproc)
sudo make install
编译完成后验证:
/usr/local/php83/bin/php -v
# PHP 8.3.22 (cli) (built: Jun 22 2026 14:21:16) (NTS)
第三步:配置 PHP-FPM 服务
创建配置文件
# 创建配置目录
sudo mkdir -p /etc/php/8.3/conf.d
# 复制生产环境配置
sudo cp /tmp/php-8.3.22/php.ini-production /etc/php/8.3/php.ini
# 复制 FPM 配置
sudo cp /usr/local/php83/etc/php-fpm.conf.default /usr/local/php83/etc/php-fpm.conf
sudo cp /usr/local/php83/etc/php-fpm.d/www.conf.default /usr/local/php83/etc/php-fpm.d/www.conf
优化 php.ini
针对 WordPress 做了以下调整:
upload_max_filesize = 64M # 上传文件大小限制
post_max_size = 64M # POST 数据大小
memory_limit = 256M # 内存限制
max_execution_time = 300 # 最大执行时间(秒)
max_input_time = 300 # 最大输入时间(秒)
配置 FPM Pool
修改 /usr/local/php83/etc/php-fpm.d/www.conf:
listen = /var/run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
创建 systemd 服务
创建 /etc/systemd/system/php8.3-fpm.service:
[Unit]
Description=The PHP 8.3 FastCGI Process Manager
After=network.target
[Service]
Type=simple
PIDFile=/usr/local/php83/var/run/php-fpm.pid
ExecStartPre=/bin/mkdir -p /var/run/php
ExecStart=/usr/local/php83/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php83/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启动服务:
sudo systemctl daemon-reload
sudo systemctl enable php8.3-fpm
sudo systemctl start php8.3-fpm
第四步:配置 Nginx
修改 Nginx 站点配置中的 fastcgi_pass 指向新的 PHP-FPM socket:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
}
重启 Nginx:
sudo nginx -t
sudo systemctl restart nginx
第五步:修复 MySQL Socket 路径
升级后 WordPress 出现”数据库错误”,原因是 PHP 8.3 编译时默认的 MySQL socket 路径与实际不一致。
查看实际 socket 路径:
mysql -u root -e "SHOW VARIABLES LIKE 'socket';"
# socket /var/run/mysqld/mysqld.sock
在 php.ini 中配置正确的路径:
mysqli.default_socket = /var/run/mysqld/mysqld.sock
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock
重启 PHP-FPM 后问题解决:
sudo systemctl restart php8.3-fpm
第六步:清理旧版本
确认一切正常后,禁用旧的 PHP 7.4:
sudo systemctl stop php7.4-fpm
sudo systemctl disable php7.4-fpm
验证结果
| 服务 | 状态 |
|---|---|
| PHP 8.3 FPM | ✅ active |
| PHP 7.4 FPM | ⏹ inactive |
| Nginx | ✅ active |
| MySQL | ✅ active |
| WordPress | ✅ HTTP 200 |
博客访问正常,所有文章数据完好。
踩坑记录
坑一:ondrej PPA 不提供 PHP 8 包
Ubuntu 20.04 (focal) 的 ondrej PPA 已经不再提供 PHP 8.x 的软件包,apt-cache search php8 返回空结果。最终改用源码编译。
坑二:PHP-FPM 启动超时
第一次配置 systemd 时使用了 Type=forking 加 --nodaemonize 参数,导致 systemd 等待进程 fork 超时。正确做法是使用 Type=simple 配合 --nodaemonize。
坑三:Socket 权限问题
FPM 配置文件 www.conf 中的 listen.owner 和 listen.group 默认被注释掉了,导致 socket 文件的所有者是 root,Nginx(www-data 用户)无权访问。需要取消注释并设置为 www-data。
坑四:MySQL Socket 路径不匹配
PHP 8.3 编译时的默认 MySQL socket 路径是 /tmp/mysql.sock,而 Ubuntu 上 MySQL 实际使用的是 /var/run/mysqld/mysqld.sock,需要在 php.ini 中手动指定。
总结
虽然从源码编译 PHP 比直接用 apt 安装复杂一些,但好处是:
- 不依赖第三方 PPA,不受发行版本限制
- 可以精确控制编译选项,只包含需要的模块
- 可以安装任意 PHP 版本,包括最新的 8.3.x
如果你的服务器也遇到 PHP 版本过旧的警告,不妨试试这个方法。整个过程大约 20 分钟,编译本身在 48 核服务器上只需 2-3 分钟。