如何在CentOS8上使用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 还为 stderr
和 stdout
日志记录、紧急重启和自适应进程生成提供了配置选项,这对于重载站点很有用。 事实上,将 Apache 与 PHP-FPM 结合使用是托管 PHP 应用程序的最佳堆栈之一,尤其是在性能方面。
在本教程中,您将在一个实例上设置两个 PHP 站点。 每个站点都将使用自己的域,并且每个域都将部署自己的 PHP 版本。 第一个,site1.your_domain
,将部署 PHP 7.3。 第二个,site2.your_domain
,将部署 PHP 7.4。
先决条件
- 按照 使用 CentOS 8 的初始服务器设置来设置一台具有至少 1GB RAM 的 CentOS 8 服务器,包括
sudo
非 root 用户和防火墙。 - 按照 How to Install the Apache Web Server on CentOS 8 设置和配置 Apache Web 服务器。
- 配置为指向您的 CentOS 8 服务器的域名。 您可以按照 如何从公共域注册商 指向 DigitalOcean 名称服务器,了解如何将域指向 DigitalOcean Droplets。 出于本教程的目的,您将使用两个子域,每个子域在您的 DNS 设置中指定一个
A
记录:site1.your_domain
和site2.your_domain
。
第 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
你会看到这样的输出:
OutputRemi'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
让我们开始安装 php73
和 php73-php-fpm
:
sudo dnf install php73 php73-php-fpm -y
php73
是一个元包,可用于运行 PHP 应用程序。php73-php-fpm
提供作为守护进程运行并接收 Fast/CGI 请求的快速进程管理器解释器。
现在对 PHP 7.4 版重复该过程。 安装 php74
和 php74-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_domain 和 site2.your_domain 创建文档根目录:
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
添加以下行:
/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
的输出:
OutputSyntax OK
最后,重新启动 Apache 服务以实现您的更改:
sudo systemctl restart httpd
现在您已将 Apache 配置为为每个站点提供服务,您将对它们进行测试以确保正确的 PHP 版本正在运行。
第 4 步 — 测试两个网站
至此,您已经配置了两个网站来运行两个不同版本的 PHP。 现在测试结果。
打开您的网络浏览器并访问两个站点 http://site1.your_domain
和 http://site2.your_domain
。 您将看到两个如下所示的页面:
注意标题。 第一个页面表明 site1.your_domain 部署了 PHP 7.3 版本。 第二个表示 site2.your_domain 部署了 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 的更高级功能 ,例如其自适应生成过程或它如何记录 sdtout
和 stderr
。 或者,您现在可以使用 Let's Encrypt 提供的免费 TLS/SSL 证书保护您的网站。