作者选择了 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-mysql-php-lamp-stack-on-ubuntu-20-04)只能管理一个。将Apache与PHP-FPM相结合,也比每个单独的实例上的托管解决方案更具成本效益。
PHP-FPM还为stderr
和stdout
日志,紧急重新启动和适应性流程生育提供配置选项,这对于负载的网站很有用。
事实上,使用Apache与PHP-FPM是托管PHP应用程序的最佳堆栈之一,特别是在性能方面。PHP-FPM不仅允许您同时运行多个PHP版本,还提供许多额外的功能,如适应性流程生育,这对负载的网站是有用的。
在本教程中,您将在单个实例上设置两个PHP网站,每个网站将使用自己的域名,每个域名将部署自己的PHP版本。第一个,site1.your_domain,将部署PHP 7.2.第二个,site2.your_domain,将部署PHP 7.3.
前提条件
- 一个 Ubuntu 20.04 服务器至少具有 1 GB 的 RAM 设置,按照 Ubuntu 20.04 初始服务器设置,包括一个 sudo 非根用户和防火墙
- 一个 Apache 网页服务器设置和配置如下 如何在 Ubuntu 20.04 上安装 Apache 网页服务器。
- 一个域名配置以指向您的 Ubuntu 20.04 服务器。您可以学习如何将域名指向 DigitalOcean Droplets 通过遵循 How To Point to DigitalOcean Nameservers From Common Domain Registrars )。 为本教程的目的,我们将使用两个子域名,每个域名在我们的 DNS 设置中指定为
A
步骤 1 — 使用 PHP-FPM 安装 PHP 版本 7.2 和 7.3
完成前提后,您现在将安装 PHP 版本 7.2 和 7.3,以及 PHP-FPM 和一些额外的扩展,但要做到这一点,您首先需要在您的系统中添加Ondrej PHP
存储库。
运行apt-get
命令来安装software-properties-common
:
1sudo apt-get install software-properties-common -y
software-properties-common
包提供apt-add-repository
命令行实用程序,您将使用它来添加ondrej/php
PPA(个人包存档案)库。
现在将ondrej/php
PPA添加到您的系统中,它将比官方的Ubuntu存储库拥有更多的最新版本的PHP,并允许您在同一系统中安装多个版本的PHP:
1sudo add-apt-repository ppa:ondrej/php
更新存储库:
1sudo apt-get update -y
接下来,安装php7.2
,php7.2-fpm
,php7.2-mysql
,libapache2-mod-php7.2
和libapache2-mod-fcgid
以下命令:
1sudo 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
提供了快速流程管理器的解释器,它作为一个大象运行并接收快速/CGI 请求php7.2-mysql
连接 PHP 到 MySQL 数据库libapache2-mod-php7.2
提供了 Apache Web 服务器的 PHP 模块libapache2-mod-fcgid
包含一个 mod_fcgid 启动了一些 CGI 程序实例来处理并发请求
现在重复 PHP 版本 7.3 的过程,安装 php7.3
, php7.3-fpm
, php7.3-mysql
和 libapache2-mod-php7.3
。
1sudo apt-get install php7.3 php7.3-fpm php7.3-mysql libapache2-mod-php7.3 -y
安裝兩個PHP版本後,請啟動「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 Fri 2020-06-05 11:25:07 UTC; 1min 38s ago
5 Docs: man:php-fpm7.2(8)
6 Main PID: 13703 (php-fpm7.2)
7 Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
8 Tasks: 3 (limit: 2353)
9 Memory: 6.2M
10 CGroup: /system.slice/php7.2-fpm.service
11 ├─13703 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
12 ├─13719 php-fpm: pool www
13 └─13720 php-fpm: pool www
14
15Jun 05 11:25:07 ubuntu systemd[1]: Starting The PHP 7.2 FastCGI Process Manager...
16Jun 05 11:25:07 ubuntu systemd[1]: Started The PHP 7.2 FastCGI Process Manager.
重复这个过程,现在开始php7.3-fpm
服务:
1sudo systemctl start php7.3-fpm
接下来,检查php7.3-fpm
服务的状态:
1sudo systemctl status php7.3-fpm
您将看到以下输出:
1[secondary_label Output]
2● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
3 Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
4 Active: active (running) since Fri 2020-06-05 11:26:33 UTC; 56s ago
5 Docs: man:php-fpm7.3(8)
6 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>
7 Main PID: 23452 (php-fpm7.3)
8 Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
9 Tasks: 3 (limit: 2353)
10 Memory: 7.1M
11 CGroup: /system.slice/php7.3-fpm.service
12 ├─23452 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
13 ├─23468 php-fpm: pool www
14 └─23469 php-fpm: pool www
15
16Jun 05 11:26:33 ubuntu systemd[1]: Starting The PHP 7.3 FastCGI Process Manager...
17Jun 05 11:26:33 ubuntu systemd[1]: Started The PHP 7.3 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_domain
和site2.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.2来渲染内容:
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 # From the Apache version 2.4.10 and above, use the SetHandler to run PHP as a fastCGI process server
18 SetHandler "proxy:unix:/run/php/php7.2-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 到您的_域网站管理员可以访问的电子邮件,您还更新了 ServerName,它为此虚拟主机配置建立了基域,并添加了 SetHandler 指令来运行 PHP 作为一个 fastCGI 流程服务器。
保存并关闭文件。
接下来,为网站 site2.your_domain 创建一个新的虚拟主机配置文件. 您将指定这个子域来部署 php7.3
:
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 # 2.4.10+ can proxy to unix socket
17 SetHandler "proxy:unix:/run/php/php7.3-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
. 您将看到两个页面看起来像这样:
请注意标题. 第一页表示 site1.your_domain
部署了 PHP 版本 7.2。 第二页表示 site2.your_domain
部署了 PHP 版本 7.3。
现在你已经测试了你的网站,删除info.php
文件. 因为它们包含关于你的服务器的敏感信息,并可访问未经授权的用户,它们构成一个安全漏洞。
1sudo rm -rf /var/www/site1.your_domain/info.php
2sudo 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
或者,你现在可以保护你的网站。