春风得意马蹄疾 记录技术,分享生活
随笔: 34 分类: 15 评论: 1 阅读: 2,167

Ubuntu 20.04 从源码编译安装 PHP 8.3 并配置 WordPress

📅 发表于 2026-06-22 14:47:54 👁 阅读 31 次 💬 评论 0

前言

最近 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.ownerlisten.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 安装复杂一些,但好处是:

  1. 不依赖第三方 PPA,不受发行版本限制
  2. 可以精确控制编译选项,只包含需要的模块
  3. 可以安装任意 PHP 版本,包括最新的 8.3.x
  4. 如果你的服务器也遇到 PHP 版本过旧的警告,不妨试试这个方法。整个过程大约 20 分钟,编译本身在 48 核服务器上只需 2-3 分钟。

📂 分类:服务器维护
评论 (0)
小阿军
技术分享者 · 记录成长的每一步
✨ 特效 ON