本文将介绍如何使用 PHP-FPM 和 mod_fcgid 处理程序在单个 Apache Web 服务器上实现两个版本的 PHP。
FPM(FastCGI 进程管理器)是 PHP FastCGI 实现,具有一些添加功能(主要)对高负载站点有用。
使用此处理程序,系统将以拥有域/子域的用户身份运行 PHP 脚本。
每个 FPM 池都可以有独立的设置。
在 RHEL 8 上安装多个 PHP 版本:
我们可以从 Remi yum 存储库轻松安装不同版本的 PHP。
安装 PHP 5.6
[root@apache-01 ~]# dnf install -y php56 php56-php-fpm
安装 PHP 7.4
[root@apache-01 ~]# dnf install -y php74 php74-php-fpm
我们需要创建脚本包装器,以根据用户请求调用所需版本的 PHP。
执行以下命令来创建 PHP 脚本包装器。
[root@apache-01 ~]# cat > /var/www/cgi-bin/php56.fcgi << EOF > #!/bin/bash > exec /bin/php56-cgi > EOF [root@apache-01 ~]# cat > /var/www/cgi-bin/php74.fcgi << EOF > #!/bin/bash > exec /bin/php74-cgi > EOF
添加对这些脚本文件的执行权限。
[root@apache-01 ~]# chmod 755 /var/www/cgi-bin/php*
现在添加 Apache 虚拟主机配置以在不同端口上运行。
为基于 PHP 5.6 的虚拟主机创建配置。
[root@apache-01 ~]# vi /etc/httpd/conf.d/php56.conf
在此文件中添加以下指令。
Listen 81 <VirtualHost *:81> ServerAdmin root@localhost.com ServerName 56.test DocumentRoot /var/www/html DirectoryIndex index.php index.html <FilesMatch "\.php$"> <If "-f %{REQUEST_FILENAME}"> SetHandler "proxy:unix:/var/opt/remi/php56/run/php-fpm/www.sock|fcgi://localhost" </If> </FilesMatch> ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" AddHandler php56-fcgi .php Action php56-fcgi /cgi-bin/php56.fcgi <Directory "/var/www/html"> AllowOverride All </Directory> </VirtualHost>
同样,为 PHP 7.4 基础虚拟主机添加配置。
[root@apache-01 ~]# vi /etc/httpd/conf.d/php74.conf
其中添加以下指令。
Listen 82 <VirtualHost *:82> ServerAdmin root@localhost.com ServerName 74.test DocumentRoot /var/www/html DirectoryIndex index.php index.html <FilesMatch "\.php$"> <If "-f %{REQUEST_FILENAME}"> SetHandler "proxy:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost" </If> </FilesMatch> ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" AddHandler php74-fcgi .php Action php74-fcgi /cgi-bin/php74.fcgi <Directory "/var/www/html"> AllowOverride All </Directory> </VirtualHost>
为网站创建默认索引。
[root@apache-01 ~]# vi /var/www/html/index.php
并在此文件中添加以下 PHP 代码。
<?php phpinfo(); ?>
将两个虚拟主机端口添加到 SELinux http_port_t 端口类型。
因此,Apache Web 服务器可以在这些端口上启动服务。
[root@apache-01 ~]# semanage port -a -t http_port_t -p tcp 81 [root@apache-01 ~]# semanage port -a -t http_port_t -p tcp 82
在 Linux 防火墙中允许这些服务端口。
[root@apache-01 ~]# firewall-cmd --permanent --add-port={81,82}/tcp success [root@apache-01 ~]# firewall-cmd --reload success
启用并启动 Apache 和 PHP-FPM 服务。
[root@apache-01 ~]# systemctl enable --now httpd.service php56-php-fpm.service php74-php-fpm.service Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service -> /usr/lib/systemd/system/httpd.service. Created symlink /etc/systemd/system/multi-user.target.wants/php56-php-fpm.service -> /usr/lib/systemd/system/php56-php-fpm.service. Created symlink /etc/systemd/system/multi-user.target.wants/php74-php-fpm.service -> /usr/lib/systemd/system/php74-php-fpm.service.
在 Web 浏览器中分别打开:
http://apache-01.onitroad.com:81
http://apache-01.onitroad.com:82
将可以看到不同的PHP版本信息。
安装第三方 Yum 存储库:
使用以下命令安装 EPEL(Extra Packages for Enterprise Linux - 企业 Linux 的另外软件包)yum 存储库。
[root@apache-01 ~]# dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
我们需要安装 PHP 5.6 和 PHP 7.4.
这两个版本都可以在 Remi Yum 存储库中找到。
因此,使用 dnf 命令在我们的 RHEL 8 服务器上安装 Remi yum 存储库。
[root@apache-01 ~]# dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
为新安装的 yum 存储库构建 yum 缓存。
[root@apache-01 ~]# dnf makecache Updating Subscription Management repositories. Extra Packages for Enterprise Linux Modular 8 - 2.2 kB/s | 9.5 kB 00:04 Extra Packages for Enterprise Linux 8 - x86_64 1.9 kB/s | 6.0 kB 00:03 Red Hat Enterprise Linux 8 for x86_64 - BaseOS 1.4 kB/s | 4.1 kB 00:02 Red Hat Enterprise Linux 8 for x86_64 - AppStre 2.1 kB/s | 4.5 kB 00:02 Remi's Modular repository for Enterprise Linux 26 kB/s | 740 kB 00:27 Safe Remi's RPM repository for Enterprise Linux 213 kB/s | 1.7 MB 00:07 Metadata cache created.
在 RHEL 8 上安装 Apache Web 服务器:
在基于 Red Hat 的 Linux 发行版中,Apache Web 服务器提供了 httpd 软件包。
[root@apache-01 ~]# dnf install -y httpd