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

作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。

介绍

Apache Web Server使用虚拟主机在一个实例上管理多个域。类似地, PHP-FPM使用一个 DAEMON来管理多个PHP版本在一个实例上。一起,你可以使用Apache和PHP-FPM来托管多个PHP Web应用程序,每一个使用不同的PHP版本,都在同一个服务器上,同时所有。这是有用的,因为不同的应用程序可能需要不同的PHP版本,但某些服务器堆栈(如一个常规配置的LAMP堆栈)(https://andsky.com/tech/tutorials/how-to-install-linux-apache-mariadb-php-lamp-stack-on-debian-10)只能管理一个。将Apache与PHP-FPM相结合,也比每个单独的实例上的托管解决方案更具成本效益。

PHP-FPM还为stderrstdout日志,紧急重新启动和适应性流程生育提供配置选项,这对于负载的网站很有用。

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

前提条件

步骤 1 — 使用 PHP-FPM 安装 PHP 版本 7.0 和 7.2

完成了前提条件,您现在将安装 PHP 版本 7.0 和 7.2,以及 PHP-FPM 和几个额外的扩展,但要做到这一点,您首先需要在您的系统中添加sury php 存储库。

首先安装几个必要的包,包括curl,wgetgnupg2:

1sudo apt-get install curl wget gnupg2 ca-certificates lsb-release apt-transport-https -y

以上的包将允许您访问sury php存储库,并安全地这样做。sury php是一个第三方存储库或PPA(个人包存库)。它为 Debian 操作系统提供 PHP 7.4, 7.3, 7.2, 7.1 和 7.0。它还提供比官方的 Debian 10 存储库更新的 PHP 版本,并允许您在同一系统上安装多个版本的 PHP。

接下来,输入包的密钥:

1wget https://packages.sury.org/php/apt.gpg
2sudo apt-key add apt.gpg

现在将sury php存储库添加到您的系统:

1echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php7.list

更新存储库:

1sudo apt-get update -y

接下来,安装php7.0,php7.0-fpm,php7.0-mysql,libapache2-mod-php7.0libapache2-mod-fcgid以下命令:

1sudo apt-get install php7.0 php7.0-fpm php7.0-mysql libapache2-mod-php7.0 libapache2-mod-fcgid -y
  • php7.0 是可以用来运行 PHP 应用程序的元包
  • php7.0-fpm 提供了快速流程管理器的解释器,它作为一个大象运行并接收快速/CGI 请求
  • php7.0-mysql 连接 PHP 到 MySQL 数据库
  • libapahce2-mod-php7.0 提供了 Apache Web 服务器的 PHP 模块
  • libapache2-mod-fcgid 包含一个 mod_fcgid 来启动一些 CGI 程序实例来处理并发请求

现在重复 PHP 版本 7.2 的过程,安装 php7.2, php7.2-fpm, php7.2-mysqllibapache2-mod-php7.2

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

安裝兩個PHP版本後,請啟動「php7.0-fpm」服務:

1sudo systemctl start php7.0-fpm

接下来,检查php7.0-fpm服务的状态:

1sudo systemctl status php7.0-fpm

您将看到以下输出:

 1[secondary_label Output]
 2 php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager
 3   Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)
 4   Active: active (running) since Sat 2020-04-04 08:51:47 UTC; 1min 17s ago
 5     Docs: man:php-fpm7.0(8)
 6 Main PID: 13016 (php-fpm7.0)
 7   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
 8    Tasks: 3 (limit: 1149)
 9   Memory: 19.1M
10   CGroup: /system.slice/php7.0-fpm.service
11           ├─13016 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
12           ├─13017 php-fpm: pool www
13           └─13018 php-fpm: pool www
14
15Apr 04 08:51:47 debian10 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager...
16Apr 04 08:51:47 debian10 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.

重复这个过程,现在开始php7.2-fpm服务:

1sudo systemctl start php7.2-fpm

然后检查php7.2-fpm服务的状态:

1sudo systemctl status php7.2-fpm

您将看到以下输出:

 1[secondary_label Output]
 2 php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager
 3   Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
 4   Active: active (running) since Sat 2020-04-04 08:52:52 UTC; 1min 32s ago
 5     Docs: man:php-fpm7.2(8)
 6  Process: 22207 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.2/fpm/pool.d/www.conf 72 (code=exite
 7 Main PID: 22204 (php-fpm7.2)
 8   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
 9    Tasks: 3 (limit: 1149)
10   Memory: 12.0M
11   CGroup: /system.slice/php7.2-fpm.service
12           ├─22204 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
13           ├─22205 php-fpm: pool www
14           └─22206 php-fpm: pool www
15
16Apr 04 08:52:52 debian10 systemd[1]: Starting The PHP 7.2 FastCGI Process Manager...
17Apr 04 08:52:52 debian10 systemd[1]: Started The PHP 7.2 FastCGI Process Manager.

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

1sudo a2enmod actions fcgid alias proxy_fcgi
  • `actions' 用于基于媒体类型或请求方法执行 CGI 脚本
  • fcgid' 是对 mod_cgi' 的高性能替代品,它启动了 CGI 程序的足够数量的实例来处理并发请求
  • `alias' 用于在文档树中绘制主机文件系统的不同部分,以及 URL 重定向
  • `proxy_fcgi' 允许 Apache 将请求转发到 PHP-FPM

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

1sudo systemctl restart apache2

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

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

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

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

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

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

1sudo chown -R www-data:www-data /var/www/site1.your_domain
2sudo chown -R www-data:www-data /var/www/site2.your_domain
3sudo chmod -R 755 /var/www/site1.your_domain
4sudo chmod -R 755 /var/www/site2.your_domain

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

1sudo nano /var/www/site1.your_domain/info.php

添加下列行:

1[label /var/www/site1.your_domain/info.php]
2<?php phpinfo(); ?>

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

1sudo 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.0来渲染内容:

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

确保网站目录路径、服务器名称和PHP版本匹配您的设置:

 1[label /etc/apache2/sites-available/site1.your_domain.conf]
 2
 3<VirtualHost *:80>
 4     ServerAdmin admin@site1.your_domain
 5     ServerName site1.your_domain
 6     DocumentRoot /var/www/site1.your_domain
 7     DirectoryIndex info.php
 8
 9     <Directory /var/www/site1.your_domain>
10        Options Indexes FollowSymLinks MultiViews
11        AllowOverride All
12        Order allow,deny
13        allow from all
14     </Directory>
15
16    <FilesMatch \.php$>
17      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
18      SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
19    </FilesMatch>
20
21     ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log
22     CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined
23</VirtualHost>

在这个文件中,你更新了DocumentRoot到你的新目录和ServerAdmin到一个电子邮件,而your_domain网站管理员可以访问它,你还更新了ServerName,它为这个虚拟主机配置建立了基础域,你还添加了一个SetHandler指令来运行PHP作为一个快速CGI流程服务器。

保存并关闭文件。

接下来,为网站创建一个新的虚拟主机配置文件 site2.your_domain. 你会指定这个子域来部署 php7.2:

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

再次,请确保网站目录路径、服务器名称和PHP版本匹配您的唯一信息:

 1[label /etc/apache2/sites-available/site2.your_domain.conf]
 2<VirtualHost *:80>
 3     ServerAdmin admin@site2.your_domain
 4     ServerName site2.your_domain
 5     DocumentRoot /var/www/site2.your_domain
 6     DirectoryIndex info.php  
 7
 8     <Directory /var/www/site2.your_domain>
 9        Options Indexes FollowSymLinks MultiViews
10        AllowOverride All
11        Order allow,deny
12        allow from all
13     </Directory>
14
15    <FilesMatch \.php$>
16      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
17      SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
18    </FilesMatch>
19
20     ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log
21     CustomLog ${APACHE_LOG_DIR}/site2.your_domain_access.log combined
22</VirtualHost>

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

1sudo apachectl configtest

您将看到以下输出:

1[secondary_label Output]
2Syntax OK

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

1sudo a2ensite site1.your_domain
2sudo a2ensite site2.your_domain

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

1sudo a2dissite 000-default.conf

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

1sudo systemctl restart apache2

现在你已经配置了Apache来服务每个网站,你会测试它们,以确保正确的PHP版本正在运行。

步骤4:测试两个网站

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

打开您的网页浏览器并访问两个网站:http://site1.your_domain和http://site2.your_domain. 您将看到两个页面看起来像这样:

PHP 7.0 info page PHP 7.2 info page

请注意标题. 第一页表示「site1.your_domain」部署了 PHP 版本 7.0. 第二页表示「site2.your_domain」部署了 PHP 版本 7.2。

现在你已经测试了你的网站,删除info.php文件. 因为它们包含关于你的服务器的敏感信息,并可访问未经授权的用户,它们构成安全威胁。

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

现在你有一个Debian 10服务器处理两个不同的PHP版本的网站,但PHP-FPM并不局限于这个应用程序。

结论

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

从这里开始,你可能会考虑探索PHP-FPM的更高级功能(https://php-fpm.org/about/),例如它的适应性生长过程或它如何登录sdtoutstderr

Published At
Categories with 技术
comments powered by Disqus