在同一台搬瓦工 VPS 上同时运行多个网站时,不同网站可能需要不同版本的 PHP——老站点依赖 PHP 7.4,新项目需要 PHP 8.2。通过 Ondřej Surý 的 PPA(Ubuntu)或 sury.org 软件源(Debian),可以在同一系统上安装多个 PHP 版本并行共存,再通过 update-alternatives 或 PHP-FPM 配置切换各网站使用的版本。本文完整演示这一流程。

本文要点

  • 添加 Ondřej PHP 软件源
  • 并行安装多个 PHP 版本
  • 通过 update-alternatives 切换系统默认 CLI 版本
  • 为不同站点配置不同 PHP-FPM 版本
  • Nginx 与 Apache 配置示例

添加软件源

Debian(sury.org 源)

apt install -y lsb-release apt-transport-https ca-certificates wget
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt update

Ubuntu(Ondřej PPA)

apt install -y software-properties-common
add-apt-repository ppa:ondrej/php -y
apt update

安装多个 PHP 版本

# 安装 PHP 8.1 及常用扩展
apt install -y php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip

# 安装 PHP 8.2
apt install -y php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip

# 安装 PHP 7.4(老站点兼容)
apt install -y php7.4-fpm php7.4-mysql php7.4-curl php7.4-gd php7.4-mbstring php7.4-xml php7.4-zip

查看已安装的 PHP 版本:

dpkg -l | grep php | awk '{print $2}' | sort -u

管理 CLI 默认版本

命令行 php 命令的默认版本通过 update-alternatives 管理:

# 查看当前配置
update-alternatives --display php

# 切换默认版本(交互式选择)
update-alternatives --config php

# 或直接指定(以 8.2 为例)
update-alternatives --set php /usr/bin/php8.2
php -v

CLI 版本和 FPM 版本是独立的

update-alternatives 只影响命令行 php 的版本,不影响 PHP-FPM(Web 服务器使用的版本)。两者可以设置为不同版本。

为站点配置不同 PHP-FPM 版本

不同版本的 PHP-FPM 监听不同的 Unix Socket,Nginx/Apache 可分别指向:

PHP 版本FPM Socket 路径
PHP 7.4/run/php/php7.4-fpm.sock
PHP 8.1/run/php/php8.1-fpm.sock
PHP 8.2/run/php/php8.2-fpm.sock

Nginx 虚拟主机配置示例(PHP 8.2)

server {
    listen 80;
    server_name site82.example.com;
    root /var/www/site82;
    index index.php index.html;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }
}

Nginx 虚拟主机配置示例(PHP 7.4)

server {
    listen 80;
    server_name site74.example.com;
    root /var/www/site74;
    index index.php index.html;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
}

Apache + mod_proxy_fcgi(PHP 8.1)

<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>

管理 PHP-FPM 服务

systemctl status php8.2-fpm
systemctl restart php8.1-fpm
systemctl enable php7.4-fpm

验证各站点 PHP 版本

在各站点根目录创建 info.php(内容:<?php echo PHP_VERSION;),通过浏览器访问即可确认该站点实际使用的 PHP 版本。验证完成后删除该文件。

小结

  • 通过 sury.org / Ondřej PPA 可在 Debian/Ubuntu 上并行安装多个 PHP 版本
  • update-alternatives 管理 CLI 默认版本
  • 每个 PHP 版本有独立的 FPM Socket,Nginx/Apache 各自指向即可实现多版本共存
  • CLI 版本和 FPM 版本相互独立,可分别设置

常见问题

能同时运行超过 3 个 PHP 版本吗?

可以,理论上没有数量限制,每个版本都有独立的 FPM 进程和 Socket。版本越多内存占用越大,需要根据 VPS 内存规划。

如何卸载某个不再需要的 PHP 版本?

执行 apt remove --purge php8.1-fpm php8.1-*apt autoremove 清理残余。

PHP-FPM 的 www.conf 配置在哪里?

配置文件位于 /etc/php/版本号/fpm/pool.d/www.conf,可在此调整进程数、Socket 权限等参数。

切换了 update-alternatives 后 php 还是旧版本?

确认 which php 指向的路径是否是 /usr/bin/php;若使用了自定义 PATH 或 nvm 等工具,可能有其他 php 优先级更高。