作者选择了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 应用程序的最佳堆栈之一,尤其是在性能方面。
事实上,将 Apache 与 PHP-FPM 结合使用是托管 PHP 应用程序的最佳堆栈之一,尤其是在性能方面。PHP-FPM 不仅允许您同时运行多个 PHP 版本,它还提供了许多额外的功能,例如自适应进程生成,这对于高负载站点非常有用。
在本教程中,您将在单个实例上设置两个 PHP 站点。每个站点将使用自己的域,每个域将部署自己的 PHP 版本。第一个,site1.your_domain
将部署 PHP 7.2。第二个,site2.your_domain
将部署 PHP 7.3。
先决条件
- 按照 Ubuntu 20.04的初始服务器设置(包括 sudo 非 root 用户和防火墙)设置一台至少具有 1GB RAM 的 Ubuntu 20.04 服务器。
- 按照如何在 Ubuntu 20.04 上安装Apache Web 服务器来设置和配置Apache Web 服务器。
- 配置为指向您的 Ubuntu 20.04 服务器的域名。您可以按照如何从公共域注册商指向 DigitalOcean 域名服务器了解如何将域指向 DigitalOcean Droplets 。出于本教程的目的,我们将使用两个子域,每个子域都
A
在我们的 DNS 设置中指定了一条记录:site1.your_domain
和site2.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.2
,php7.2-fpm
,php7.2-mysql
,libapache2-mod-php7.2
,并libapache2-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 请求的 Fast Process Manager 解释器。php7.2-mysql
将 PHP 连接到 MySQL 数据库。libapache2-mod-php7.2
为 Apache 网络服务器提供 PHP 模块。libapache2-mod-fcgid
包含一个 mod_fcgid,它启动许多 CGI 程序实例来处理并发请求。
现在对 PHP 7.3 版重复此过程。安装php7.3
,php7.3-fpm
,php7.3-mysql
,和libapache2-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_domain
和创建文档根目录site2.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
添加以下行:
<?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 版本与您的设置匹配:
<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 版本与您的唯一信息匹配:
<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
您将看到以下输出:
Output- Syntax 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_domain
http://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 的更高级功能,例如其自适应生成过程或它如何记录sdtout
,stderr
或者,您现在可以保护您的网站。为此,您可以按照我们的教程了解如何使用 Let’s Encrypt 提供的免费 TLS/SSL 证书保护您的网站。