如何在 CentOS 8 上使用 Apache 和 PHP-FPM 在一台服务器上运行多个 PHP 版本

作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。

介绍

Apache Web服务器使用虚拟主机上的单个实例管理多个域。同样,PHP-FPM使用守护进程在单个实例上管理多个 PHP 版本。您可以一起使用 Apache 和 PHP-FPM 来托管多个 PHP Web 应用程序,每个应用程序都使用不同版本的 PHP,都在同一服务器上,并且都在同一时间。这很有用,因为不同的应用程序可能需要不同版本的 PHP,但某些服务器堆栈,如定期配置的 LAMP 堆栈,只能管理一个。与将每个应用程序托管在自己的实例上相比,将 Apache 与 PHP-FPM 相结合也是一种更具成本效益的解决方案。

PHP-FPM也提供配置选项,stderr以及stdout日志记录,紧急重新启动和适应过程产卵,这是重载的网站是有用的。事实上,将 Apache 与 PHP-FPM 结合使用是托管 PHP 应用程序的最佳堆栈之一,尤其是在性能方面。

在本教程中,您将在单个实例上设置两个 PHP 站点。每个站点将使用自己的域,每个域将部署自己的 PHP 版本。第一个,site1.your_domain将部署 PHP 7.3。第二个,site2.your_domain将部署 PHP 7.4。

先决条件

步骤 1 — 使用 PHP-FPM 安装 PHP 7.3 和 7.4 版

完成先决条件后,您现在将安装 PHP 版本 7.3 和 7.4,以及 PHP-FPM 和几个附加扩展。为了安装多个版本的 PHP,您需要在系统中安装并启用 Remi 存储库。它还提供了 CentOS 8 系统上最新版本的 PHP 堆栈。

您可以使用以下命令将两个存储库添加到您的系统:

  • sudo dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm

上面的命令还将启用 EPEL 存储库。

首先让我们了解一下 Remi 上可用的 PHP 7 版本:

  • sudo dnf module list php

你会看到这样的输出:

Output
Remi's Modular repository for Enterprise Linux 8 - x86_64 Name Stream Profiles Summary php remi-7.2 common [d], devel, minimal PHP scripting language php remi-7.3 common [d], devel, minimal PHP scripting language php remi-7.4 common [d], devel, minimal PHP scripting language

接下来,使用以下命令禁用默认的 PHP 模块并启用 Remi 的 PHP7.3 模块:

  • sudo dnf module reset php
  • sudo dnf module enable php:remi-7.3

让我们开始安装php73php73-php-fpm

  • sudo dnf install php73 php73-php-fpm -y
  • php73 是一个可用于运行 PHP 应用程序的元包。
  • php73-php-fpm 提供作为守护进程运行并接收 Fast/CGI 请求的 Fast Process Manager 解释器。

现在对 PHP 7.4 版重复此过程。安装php74php74-php-fpm.

  • sudo dnf module reset php
  • sudo dnf module enable php:remi-7.4
  • sudo dnf install php74 php74-php-fpm -y

安装两个 PHP 版本后,php73-php-fpm使用以下命令启动该服务并使其在启动时启动:

  • sudo systemctl start php73-php-fpm
  • sudo systemctl enable php73-php-fpm

接下来,php73-php-fpm使用以下命令验证服务状态

  • sudo systemctl status php73-php-fpm

您将看到以下输出:

  • ● php73-php-fpm.service - The PHP FastCGI Process Manager
  • Loaded: loaded (/usr/lib/systemd/system/php73-php-fpm.service; enabled; vendor preset: disabled)
  • Active: active (running) since Wed 2020-04-22 05:14:46 UTC; 52s ago
  • Main PID: 14206 (php-fpm)
  • Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
  • Tasks: 6 (limit: 5059)
  • Memory: 25.9M
  • CGroup: /system.slice/php73-php-fpm.service
  • ├─14206 php-fpm: master process (/etc/opt/remi/php73/php-fpm.conf)
  • ├─14207 php-fpm: pool www
  • ├─14208 php-fpm: pool www
  • ├─14209 php-fpm: pool www
  • ├─14210 php-fpm: pool www
  • └─14211 php-fpm: pool www
  • Apr 22 05:14:46 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Starting The PHP FastCGI Process Manager...
  • Apr 22 05:14:46 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Started The PHP FastCGI Process Manager.

重复此过程,现在启动php74-php-fpm服务并使用以下命令使其在启动时启动:

  • sudo systemctl start php74-php-fpm
  • sudo systemctl enable php74-php-fpm

然后php74-php-fpm使用以下命令验证服务状态

  • sudo systemctl status php74-php-fpm

您将看到以下输出:

  • ● php74-php-fpm.service - The PHP FastCGI Process Manager
  • Loaded: loaded (/usr/lib/systemd/system/php74-php-fpm.service; enabled; vendor preset: disabled)
  • Active: active (running) since Wed 2020-04-22 05:16:16 UTC; 23s ago
  • Main PID: 14244 (php-fpm)
  • Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
  • Tasks: 6 (limit: 5059)
  • Memory: 18.8M
  • CGroup: /system.slice/php74-php-fpm.service
  • ├─14244 php-fpm: master process (/etc/opt/remi/php74/php-fpm.conf)
  • ├─14245 php-fpm: pool www
  • ├─14246 php-fpm: pool www
  • ├─14247 php-fpm: pool www
  • ├─14248 php-fpm: pool www
  • └─14249 php-fpm: pool www
  • Apr 22 05:16:15 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Starting The PHP FastCGI Process Manager...
  • Apr 22 05:16:16 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Started The PHP FastCGI Process Manager.

此时,您已经在服务器上安装了两个 PHP 版本。接下来,您将为要部署的每个网站创建一个目录结构。

步骤 2 — 为两个网站创建目录结构

在本节中,您将为两个网站中的每一个创建一个文档根目录和一个索引页面。

首先,为site1.your domainsite2.yourdomain创建文档根目录

  • sudo mkdir /var/www/site1.your_domain
  • sudo mkdir /var/www/site2.your_domain

默认情况下,Apache 网络服务器以apache用户和apache组的身份运行为确保您拥有网站根目录的正确所有权和权限,请执行以下命令:

  • sudo chown -R apache:apache /var/www/site1.your_domain
  • sudo chown -R apache:apache /var/www/site2.your_domain
  • sudo chmod -R 755 /var/www/site1.your_domain
  • sudo chmod -R 755 /var/www/site2.your_domain

chown命令将您的两个网站目录的所有权更改为apache用户和apache组。chmod命令会更改与该用户和组以及其他人关联的权限。

接下来,您将info.php在每个网站根目录中创建一个文件。这将显示每个网站的 PHP 版本信息。site1开始

  • sudo vi /var/www/site1.your_domain/info.php

添加以下行:

site1.your_domain/info.php’>/var/www/ site1.your_domain / info.php
<?php phpinfo(); ?>

保存并关闭文件。现在将您创建的 info.php 文件复制到site2

  • sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

您的 Web 服务器现在具有每个站点向访问者提供数据所需的文档根目录。接下来,您将配置 Apache Web 服务器以使用两个不同的 PHP 版本。

第 3 步 – 为两个网站配置 Apache

在本节中,您将创建两个虚拟主机配置文件。这将使您的两个网站能够同时使用两个不同的 PHP 版本。

为了让 Apache 提供这些内容,有必要使用正确的指令创建一个虚拟主机文件。您将在目录中创建两个新的虚拟主机配置文件/etc/httpd/conf.d/

首先为网站site1.your_domain创建一个新的虚拟主机配置文件在这里,您将使用以下命令指示 Apache 呈现内容php7.3

  • sudo vi /etc/httpd/conf.d/site1.your_domain.conf

添加以下内容。确保网站目录路径、服务器名称和 PHP 版本与您的设置匹配:

/etc/httpd/conf.d/site1.your_domain.conf
<VirtualHost *:80>
     ServerAdmin admin@site1.your_domain
     ServerName site1.your_domain
     DocumentRoot /var/www/site1.your_domain
     DirectoryIndex info.php
     ErrorLog /var/log/httpd/site1.your_domain-error.log
     CustomLog /var/log/httpd/site1.your_domain-access.log combined

  <IfModule !mod_php7.c>
    <FilesMatch \.(php|phar)$>
        SetHandler "proxy:unix:/var/opt/remi/php73/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
  </IfModule>

</VirtualHost>

因为DocumentRoot您正在指定网站根目录的路径。因为ServerAdmin您正在添加your_domain站点管理员可以访问的电子邮件因为ServerName您正在为您的第一个子域添加 url。对于SetHandler,您正在php7.3指定 PHP-FPM 套接字文件。

保存并关闭文件。

接下来,为网站site2.your_domain创建一个新的虚拟主机配置文件您将指定此子域进行部署php7.4

  • sudo vi /etc/httpd/conf.d/site2.your_domain.conf

添加以下内容。再次确保网站目录路径、服务器名称和 PHP 版本与您的唯一信息匹配:

/etc/httpd/conf.d/site2.your_domain.conf
<VirtualHost *:80>
     ServerAdmin admin@site2.your_domain
     ServerName site2.your_domain
     DocumentRoot /var/www/site2.your_domain
     DirectoryIndex info.php
     ErrorLog /var/log/httpd/site2.your_domain-error.log
     CustomLog /var/log/httpd/site2.your_domain-access.log combined
  <IfModule !mod_php7.c>
    <FilesMatch \.(php|phar)$>
        SetHandler "proxy:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
  </IfModule>

</VirtualHost>

完成后保存并关闭文件。然后,使用以下命令检查 Apache 配置文件是否有任何语法错误:

  • sudo apachectl configtest

你会看到一个输出打印Syntax OK

Output
  • Syntax OK

最后,重新启动 Apache 服务以实现您的更改:

  • sudo systemctl restart httpd

现在您已经配置了 Apache 来为每个站点提供服务,您将测试它们以确保正确的 PHP 版本正在运行。

第 4 步 – 测试两个网站

此时,您已经配置了两个网站来运行两个不同版本的 PHP。现在测试结果。

打开您的网络浏览器并访问这两个站点. 您将看到如下所示的两个页面:http://site1.your_domainhttp://site2.your_domain

PHP 7.3 信息页面
PHP 7.4 信息页面

注意标题。第一个页面表明site1.your部署了 PHP 7.3 版。第二个表示site2.yourdomain部署了 PHP 7.4 版。

现在您已经测试了您的网站,请删除这些info.php文件。因为它们包含有关您的服务器的敏感信息并且可以被未经授权的用户访问,所以它们构成了安全漏洞。要删除这两个文件,请运行以下命令:

  • sudo rm -rf /var/www/site1.your_domain/info.php
  • sudo rm -rf /var/www/site2.your_domain/info.php

您现在拥有一个 CentOS 8 服务器,可以处理两个具有两个不同 PHP 版本的网站。然而,PHP-FPM 并不限于这一应用程序。

结论

您现在已经将虚拟主机和 PHP-FPM 结合起来,在单个服务器上为多个网站和多个 PHP 版本提供服务。您的 Apache 服务可以处理的 PHP 站点和 PHP 版本数量的唯一实际限制是您的实例的处理能力。

从这里开始,您可能会考虑探索 PHP-FPM 的更高级功能,例如其自适应生成过程或如何记录sdtoutstderr. 或者,您现在可以使用 Let’s Encrypt 提供的免费 TLS/SSL 证书来保护您的网站。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁