在腾讯云轻量应用服务器(Lighthouse)上配置多个 PHP 版本共存,核心思路是“多实例运行 + 反向X_X分发”。
由于 Linux 系统本身通常只允许一个主进程监听同一个端口(如 9000),要实现共存,必须让不同版本的 PHP-FPM 监听不同的本地端口或 Unix Socket,然后由 Nginx 根据域名或路径将请求转发给对应的 PHP-FPM 进程。
以下是基于主流环境(Nginx + PHP-FPM)的标准实施步骤。假设你使用的是 CentOS 7/8 或 Ubuntu 20.04+。
1. 安装多版本 PHP
不要使用 yum install php 这种默认方式,因为它会覆盖或锁定单一版本。推荐使用 Remi 源(CentOS) 或 PPA(Ubuntu) 来安装特定版本。
以 CentOS 为例(推荐 Remi 源):
# 启用 EPEL 和 Remi 源
yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# 重置模块流,确保能选择版本
yum module list php
yum module enable php-php74 # 例如启用 7.4 版本
yum install -y php php-fpm php-mysqlnd php-gd php-mbstring php-xml php-curl
# 如果需要 PHP 8.1,重复上述步骤并启用对应模块
yum module enable php-php81
yum install -y php81-php php81-php-fpm ...
以 Ubuntu 为例(推荐 Ondřej Surý PPA):
add-apt-repository ppa:ondrej/php
apt update
apt install -y php7.4-fpm php8.1-fpm
2. 配置各版本 PHP-FPM 监听不同端口
每个 PHP 版本需要独立运行其 FPM 服务,并监听不同的内部端口,避免冲突。
- PHP 7.4: 监听
127.0.0.1:9000(默认) - PHP 8.1: 需修改为
127.0.0.1:9001
修改 PHP 8.1 的 FPM 配置:
- 找到配置文件,通常在
/etc/opt/remi/php81/php-fpm.d/www.conf(CentOS) 或/etc/php/8.1/fpm/pool.d/www.conf(Ubuntu)。 - 修改
listen指令:; 原值: listen = /run/php/php8.1-fpm.sock ; 改为 TCP 监听以便 Nginx 直接通过 IP:Port 访问 listen = 127.0.0.1:9001 - 重启 PHP-FPM 服务:
- CentOS:
systemctl restart php-fpm-php81 - Ubuntu:
systemctl restart php8.1-fpm
- CentOS:
注意:确保防火墙(腾讯云轻量服务器的安全组)放行了 Nginx 对外服务的 80/443 端口,但不需要放行 9000/9001 等 PHP 内部端口,因为它们只在 localhost 通信。
3. 配置 Nginx 反向X_X
这是实现“共存”的关键。你需要为不同域名或目录指定不同的 fastcgi_pass。
方案 A:按域名区分(推荐)
假设有两个网站:
site-a.com使用 PHP 7.4site-b.com使用 PHP 8.1
编辑 Nginx 站点配置文件(位于 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/):
site-a.com.conf:
server {
listen 80;
server_name site-a.com;
root /var/www/site-a;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000; # 指向 PHP 7.4
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
site-b.com.conf:
server {
listen 80;
server_name site-b.com;
root /var/www/site-b;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9001; # 指向 PHP 8.1
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
测试并重载 Nginx:
nginx -t
systemctl reload nginx
方案 B:按目录区分(同一域名下)
如果希望 example.com/app1 用 PHP 7.4,example.com/app2 用 PHP 8.1:
server {
listen 80;
server_name example.com;
root /var/www/example;
# app1 目录使用 PHP 7.4
location /app1 {
try_files $uri $uri/ =404;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# app2 目录使用 PHP 8.1
location /app2 {
try_files $uri $uri/ =404;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9001;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# 其他默认使用 PHP 7.4
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
4. 验证与排错
- 检查服务状态:
systemctl status php-fpm systemctl status php-fpm-php81 # 或 php8.1-fpm - 检查端口监听:
netstat -tlnp | grep php # 应看到 9000 和 9001 分别被不同的 php-fpm 进程占用 - 创建测试文件:
在对应目录下创建info.php,内容为<?php phpinfo(); ?>。
访问对应域名/路径,确认显示的 PHP 版本是否符合预期。
5. 重要注意事项
- 扩展差异:不同 PHP 版本的扩展包名可能不同。例如,
redis扩展在 PHP 7.4 中可能是php74-php-redis,而在 PHP 8.1 中是php81-php-redis。务必为每个版本单独安装所需扩展。 - 性能考量:每个 PHP-FPM 进程都会占用内存。轻量服务器资源有限,建议根据实际并发需求调整每个 PHP-FPM 池的
pm.max_children参数,避免 OOM(内存溢出)。 - 安全性:确保
php.ini中的disable_functions设置合理,关闭不必要的函数,尤其是涉及系统命令执行的函数。 - 腾讯云轻量特性:腾讯云轻量应用服务器提供了一键部署模板(如 WordPress、LAMP),但这些模板通常只支持单一 PHP 版本。手动配置多版本时,请避开使用控制台的一键重装功能,以免覆盖自定义配置。建议在初始搭建时就采用上述手动配置方式。
通过以上步骤,你可以在一台腾讯云轻量服务器上稳定运行多个 PHP 版本,满足老旧项目兼容性和新项目新技术的需求。
CLOUD云枢