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

来自菜鸟教程
跳转至:导航、​搜索

作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。

介绍

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

PHP-FPM 还为 stderrstdout 日志记录、紧急重启和自适应进程生成提供了配置选项,这对于重载站点很有用。 事实上,将 Apache 与 PHP-FPM 结合使用是托管 PHP 应用程序的最佳堆栈之一,尤其是在性能方面。

事实上,将 Apache 与 PHP-FPM 结合使用是托管 PHP 应用程序的最佳堆栈之一,尤其是在性能方面。 PHP-FPM 不仅允许您同时运行多个 PHP 版本,它还提供了许多额外的功能,例如自适应进程生成,这对于重载站点很有用。

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

先决条件

  • 按照 使用 Ubuntu 20.04 的初始服务器设置来设置一台至少具有 1GB RAM 的 Ubuntu 20.04 服务器,包括 sudo 非 root 用户和防火墙。
  • 按照 How to Install the Apache Web Server on Ubuntu 20.04 设置和配置 Apache Web 服务器。
  • 配置为指向您的 Ubuntu 20.04 服务器的域名。 您可以按照 如何从公共域注册商 指向 DigitalOcean 名称服务器,了解如何将域指向 DigitalOcean Droplets。 出于本教程的目的,我们将使用两个子域,每个子域在我们的 DNS 设置中指定一个 A 记录:site1.your_domainsite2.your_domain

第 1 步 — 使用 PHP-FPM 安装 PHP 版本 7.2 和 7.3

完成先决条件后,您现在将安装 PHP 版本 7.2 和 7.3,以及 PHP-FPM 和几个附加扩展。 但要做到这一点,您首先需要将 Ondrej PHP 存储库添加到您的系统。

执行apt-get命令安装software-properties-common

sudo apt-get install software-properties-common -y

software-properties-common 包提供 apt-add-repository 命令行实用程序,您将使用它来添加 ondrej/php PPA(个人包存档)存储库。

现在将 ondrej/php 存储库添加到您的系统。 ondrej/php PPA 将拥有比官方 Ubuntu 存储库更多最新版本的 PHP,它还允许您在同一系统中安装多个版本的 PHP:

sudo add-apt-repository ppa:ondrej/php

更新存储库:

sudo apt-get update -y

接下来,使用以下命令安装 php7.2php7.2-fpmphp7.2-mysqllibapache2-mod-php7.2libapache2-mod-fcgid

sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 libapache2-mod-fcgid -y
  • php7.2 是一个用于运行 PHP 应用程序的元包。
  • php7.2-fpm 提供作为守护进程运行并接收 Fast/CGI 请求的快速进程管理器解释器。
  • php7.2-mysql 将 PHP 连接到 MySQL 数据库。
  • libapache2-mod-php7.2 为 Apache 网络服务器提供 PHP 模块。
  • libapache2-mod-fcgid 包含一个 mod_fcgid,它启动许多 CGI 程序实例来处理并发请求。

现在对 PHP 7.3 版重复该过程。 安装 php7.3php7.3-fpmphp7.3-mysqllibapache2-mod-php7.3

sudo apt-get install php7.3 php7.3-fpm php7.3-mysql libapache2-mod-php7.3 -y

安装好两个PHP版本后,启动php7.2-fpm服务:

sudo systemctl start php7.2-fpm

接下来,验证 php7.2-fpm 服务的状态:

sudo systemctl status php7.2-fpm

您将看到以下输出:

Output● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2020-06-05 11:25:07 UTC; 1min 38s ago
       Docs: man:php-fpm7.2(8)
   Main PID: 13703 (php-fpm7.2)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
      Tasks: 3 (limit: 2353)
     Memory: 6.2M
     CGroup: /system.slice/php7.2-fpm.service
             ├─13703 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
             ├─13719 php-fpm: pool www
             └─13720 php-fpm: pool www

Jun 05 11:25:07 ubuntu systemd[1]: Starting The PHP 7.2 FastCGI Process Manager...
Jun 05 11:25:07 ubuntu systemd[1]: Started The PHP 7.2 FastCGI Process Manager.

重复这个过程,现在启动 php7.3-fpm 服务:

sudo systemctl start php7.3-fpm

接下来,验证 php7.3-fpm 服务的状态:

sudo systemctl status php7.3-fpm

您将看到以下输出:

Output● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2020-06-05 11:26:33 UTC; 56s ago
       Docs: man:php-fpm7.3(8)
    Process: 23470 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.3/fpm/pool.d/www.conf 73 (code=ex>
   Main PID: 23452 (php-fpm7.3)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
      Tasks: 3 (limit: 2353)
     Memory: 7.1M
     CGroup: /system.slice/php7.3-fpm.service
             ├─23452 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
             ├─23468 php-fpm: pool www
             └─23469 php-fpm: pool www

Jun 05 11:26:33 ubuntu systemd[1]: Starting The PHP 7.3 FastCGI Process Manager...
Jun 05 11:26:33 ubuntu systemd[1]: Started The PHP 7.3 FastCGI Process Manager.

最后,您必须启用多个模块,以便您的 Apache2 服务可以使用多个 PHP 版本:

sudo a2enmod actions fcgid alias proxy_fcgi
  • actions 用于根据媒体类型或请求方法执行 CGI 脚本。
  • fcgid 是 mod_cgi 的高性能替代方案,它启动足够数量的 CGI 程序实例来处理并发请求。
  • alias 提供文件树中主机文件系统不同部分的映射,以及 URL 重定向。
  • proxy_fcgi 允许 Apache 将请求转发到 PHP-FPM。

现在重新启动 Apache 服务以应用您的更改:

sudo systemctl restart apache2

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

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

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

首先,为 site1.your_domainsite2.your_domain 创建文档根目录:

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

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

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

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

sudo nano /var/www/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/apache2/sites-available/000-default.conf 的默认配置文件,而是在目录 /etc/apache2/sites-available/ 中创建两个新配置文件。

首先为网站 site1.your_domain 创建一个新的虚拟主机配置文件。 在这里,您将指导 Apache 使用 php7.2 呈现内容:

sudo nano /etc/apache2/sites-available/site1.your_domain.conf

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

/etc/apache2/sites-available/site1.your_domain.conf

<VirtualHost *:80>
     ServerAdmin admin@site1.your_domain
     ServerName site1.your_domain
     DocumentRoot /var/www/site1.your_domain
     DirectoryIndex info.php

     <Directory /var/www/site1.your_domain>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    <FilesMatch \.php$>
        # From the Apache version 2.4.10 and above, use the SetHandler to run PHP as a fastCGI process server
         SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
    </FilesMatch>

     ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log
     CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined
</VirtualHost>

在此文件中,您将 DocumentRoot 更新为新目录,并将 ServerAdmin 更新为 your_domain 站点管理员可以访问的电子邮件。 您还更新了 ServerName,它为此虚拟主机配置建立了基本域,并且您添加了 SetHandler 指令来将 PHP 作为 fastCGI 进程服务器运行。

保存并关闭文件。

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

sudo nano /etc/apache2/sites-available/site2.your_domain.conf

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

/etc/apache2/sites-available/site2.your_domain.conf

<VirtualHost *:80>
     ServerAdmin admin@site2.your_domain
     ServerName site2.your_domain
     DocumentRoot /var/www/site2.your_domain
     DirectoryIndex info.php

     <Directory /var/www/site2.your_domain>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    <FilesMatch \.php$>
        # 2.4.10+ can proxy to unix socket
         SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
    </FilesMatch>

     ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log
     CustomLog ${APACHE_LOG_DIR}/site2.your_domain_access.log combined
</VirtualHost>

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

sudo apachectl configtest

您将看到以下输出:

OutputSyntax OK

接下来,使用以下命令启用两个虚拟主机配置文件:

sudo a2ensite site1.your_domain
sudo a2ensite site2.your_domain

现在禁用默认站点,因为您不需要它。:

sudo a2dissite 000-default.conf

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

sudo systemctl restart apache2

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

第 4 步 — 测试两个网站

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

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

注意标题。 第一个页面显示 site1.your_domain 部署了 PHP 7.2 版本。 第二个表示 site2.your_domain 部署了 PHP 7.3 版本。

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

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

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

结论

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

从这里您可能会考虑 探索 PHP-FPM 的更高级功能 ,例如其自适应生成过程或它如何记录 sdtoutstderr 或者,您现在可以保护您的网站. 为此,您可以按照我们关于 如何使用 Let's Encrypt 提供的免费 TLS/SSL 证书保护您的网站的教程进行操作。