在Nginx服务器上运行多个PHP版本是常见的需求,特别是当您需要同时支持不同项目使用不同PHP版本时。以下是详细的安装和配置方法:
以Ubuntu/Debian为例:
# 添加PHP PPA仓库
sudo add-apt-repository ppa:ondrej/php
sudo apt update
# 安装不同PHP版本及其FPM模块
sudo apt install php7.4 php7.4-fpm php7.4-cli php7.4-common php7.4-mysql
sudo apt install php8.0 php8.0-fpm php8.0-cli php8.0-common php8.0-mysql
sudo apt install php8.1 php8.1-fpm php8.1-cli php8.1-common php8.1-mysql
systemctl status php7.4-fpm
systemctl status php8.0-fpm
systemctl status php8.1-fpm
编辑Nginx站点配置文件(通常在/etc/nginx/sites-available/
目录下):
# 对于PHP 7.4
server {
listen 80;
server_name site1.example.com;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
# 对于PHP 8.0
server {
listen 80;
server_name site2.example.com;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
}
}
编辑PHP-FPM配置文件(通常在/etc/php/[version]/fpm/pool.d/www.conf
):
; 对于PHP 7.4
listen = /run/php/php7.4-fpm.sock
; 对于PHP 8.0
listen = /run/php/php8.0-fpm.sock
server {
listen 80;
server_name example.com;
# PHP 7.4处理/php74/目录下的请求
location ~ ^/php74/.*\.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
# PHP 8.0处理其他PHP请求
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
}
}
对于更复杂的多版本需求,可以考虑使用Docker:
# 运行不同PHP版本的容器
docker run -d --name php74 -v /path/to/app1:/var/www/html -p 9074:9000 php:7.4-fpm
docker run -d --name php80 -v /path/to/app2:/var/www/html -p 9080:9000 php:8.0-fpm
然后在Nginx配置中:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9074; # 对于PHP 7.4
# 或
fastcgi_pass 127.0.0.1:9080; # 对于PHP 8.0
}
创建测试文件info.php
:
<?php phpinfo(); ?>
访问不同站点或路径,检查显示的PHP版本是否正确。
502 Bad Gateway错误:
www-data
用户(或其他Nginx运行用户)有权限访问Socket文件权限问题:
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
PHP模块缺失: 为每个PHP版本安装所需模块:
sudo apt install php7.4-[module] php8.0-[module]
通过以上方法,您可以灵活地在同一台服务器上运行多个PHP版本,满足不同项目的需求。