作者选择了 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-centos-8)只能管理一个。将Apache与PHP-FPM相结合,也比每个单独的实例上的托管解决方案更具成本效益。
PHP-FPM还为stderr
和stdout
日志,紧急重新启动和适应性流程生育提供配置选项,这对于负载的网站很有用。
在本教程中,您将在单个实例上设置两个PHP网站,每个网站将使用自己的域名,每个域名将部署自己的PHP版本。第一个,site1.your_domain,将部署PHP 7.3.第二个,site2.your_domain,将部署PHP 7.4.
前提条件
- 一个 CentOS 8 服务器至少具有 1 GB 的 RAM 设置,按照 CentOS 8 上的初始服务器设置,包括一个
sudo
非根用户和防火墙 - 一个 Apache 网络服务器设置和配置如下 How to Install the Apache Web Server on CentOS 8。
- 一个域名配置为指向你的 CentOS 8 服务器。你可以学习如何指向域名到 DigitalOcean Droplets 通过遵循 How To Point to DigitalOcean Nameservers From Common Domain Registrars)。 为本教程的目的,你将使用两个子域,每个域名在你的 DNS 设置中指定一个
A
记录: `site1.
步骤 1 — 使用 PHP-FPM 安装 PHP 版本 7.3 和 7.4
完成了前提条件,您现在将安装 PHP 版本 7.3 和 7.4,以及 PHP-FPM 和几个额外的扩展。为了安装多个版本的 PHP,您将需要在您的系统上安装并启用 Remi 存储库。
您可以使用以下命令将这两个存储库添加到您的系统中:
1sudo dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm
上面的命令还将启用 EPEL 存储库。
首先,让我们来看看Remi上有哪些版本的PHP 7:
1sudo dnf module list php
你会看到这样的输出:
1[secondary_label Output]
2Remi's Modular repository for Enterprise Linux 8 - x86_64
3Name Stream Profiles Summary
4php remi-7.2 common [d], devel, minimal PHP scripting language
5php remi-7.3 common [d], devel, minimal PHP scripting language
6php remi-7.4 common [d], devel, minimal PHP scripting language
接下来,禁用默认的PHP模块,并使用下面的命令启用Remi的PHP7.3模块:
1sudo dnf module reset php
2sudo dnf module enable php:remi-7.3
让我们开始安装php73
和php73-php-fpm
:
1sudo dnf install php73 php73-php-fpm -y
*「php73」是一個可以用來執行PHP應用程式的元包 *「php73-php-fpm」提供快速處理程式管理器的解釋器,它作為一個戴蒙運行,並接收快速/CGI要求
现在重复 PHP 版本 7.4 的过程,安装php74
和php74-php-fpm
。
1sudo dnf module reset php
2sudo dnf module enable php:remi-7.4
3sudo dnf install php74 php74-php-fpm -y
安装了两个PHP版本后,请启动php73-php-fpm
服务,并使用以下命令启动:
1sudo systemctl start php73-php-fpm
2sudo systemctl enable php73-php-fpm
接下来,用以下命令验证php73-php-fpm服务的状态:
1sudo systemctl status php73-php-fpm
您将看到以下输出:
1● php73-php-fpm.service - The PHP FastCGI Process Manager
2 Loaded: loaded (/usr/lib/systemd/system/php73-php-fpm.service; enabled; vendor preset: disabled)
3 Active: active (running) since Wed 2020-04-22 05:14:46 UTC; 52s ago
4 Main PID: 14206 (php-fpm)
5 Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
6 Tasks: 6 (limit: 5059)
7 Memory: 25.9M
8 CGroup: /system.slice/php73-php-fpm.service
9 ├─14206 php-fpm: master process (/etc/opt/remi/php73/php-fpm.conf)
10 ├─14207 php-fpm: pool www
11 ├─14208 php-fpm: pool www
12 ├─14209 php-fpm: pool www
13 ├─14210 php-fpm: pool www
14 └─14211 php-fpm: pool www
15
16Apr 22 05:14:46 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Starting The PHP FastCGI Process Manager...
17Apr 22 05:14:46 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Started The PHP FastCGI Process Manager.
重复这个过程,现在启动php74-php-fpm
服务,并允许它在启动时使用以下命令开始:
1sudo systemctl start php74-php-fpm
2sudo systemctl enable php74-php-fpm
然后通过以下命令检查php74-php-fpm
服务的状态:
1sudo systemctl status php74-php-fpm
您将看到以下输出:
1● php74-php-fpm.service - The PHP FastCGI Process Manager
2 Loaded: loaded (/usr/lib/systemd/system/php74-php-fpm.service; enabled; vendor preset: disabled)
3 Active: active (running) since Wed 2020-04-22 05:16:16 UTC; 23s ago
4 Main PID: 14244 (php-fpm)
5 Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
6 Tasks: 6 (limit: 5059)
7 Memory: 18.8M
8 CGroup: /system.slice/php74-php-fpm.service
9 ├─14244 php-fpm: master process (/etc/opt/remi/php74/php-fpm.conf)
10 ├─14245 php-fpm: pool www
11 ├─14246 php-fpm: pool www
12 ├─14247 php-fpm: pool www
13 ├─14248 php-fpm: pool www
14 └─14249 php-fpm: pool www
15
16Apr 22 05:16:15 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Starting The PHP FastCGI Process Manager...
17Apr 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 创建文档根目录:
1sudo mkdir /var/www/site1.your_domain
2sudo mkdir /var/www/site2.your_domain
默认情况下,Apache Web 服务器作为apache 用户和apache 组运行. 若要确保您拥有正确的网站根目录所有权和权限,请执行以下命令:
1sudo chown -R apache:apache /var/www/site1.your_domain
2sudo chown -R apache:apache /var/www/site2.your_domain
3sudo chmod -R 755 /var/www/site1.your_domain
4sudo chmod -R 755 /var/www/site2.your_domain
chown
命令将您的两个网站目录的所有权变更为apache
用户和apache
组。
接下来,您将创建一个info.php
文件,在每个网站的根目录中。这将显示每个网站的PHP版本信息。
1sudo vi /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/httpd/conf.d/
中创建两个新的虚拟主机配置文件。
首先,为网站 site1.your_domain 创建一个新的虚拟主机配置文件. 在这里,您将指导Apache使用php7.3来渲染内容:
1sudo vi /etc/httpd/conf.d/site1.your_domain.conf
确保网站目录路径、服务器名称和PHP版本匹配您的设置:
1[label /etc/httpd/conf.d/site1.your_domain.conf]
2<VirtualHost *:80>
3 ServerAdmin admin@site1.your_domain
4 ServerName site1.your_domain
5 DocumentRoot /var/www/site1.your_domain
6 DirectoryIndex info.php
7 ErrorLog /var/log/httpd/site1.your_domain-error.log
8 CustomLog /var/log/httpd/site1.your_domain-access.log combined
9
10 <IfModule !mod_php7.c>
11 <FilesMatch \.(php|phar)$>
12 SetHandler "proxy:unix:/var/opt/remi/php73/run/php-fpm/www.sock|fcgi://localhost"
13 </FilesMatch>
14 </IfModule>
15
16</VirtualHost>
对于DocumentRoot
,你正在指定你的网站根目录的路径。对于ServerAdmin
,你正在添加一个电子邮件,而网站管理员可以访问your_domain
。对于ServerName
,你正在添加第一个子域的URL。对于SetHandler,你正在给 php7.3 的 PHP-FPM 接口文件。
保存并关闭文件。
接下来,为网站 site2.your_domain 创建一个新的虚拟主机配置文件. 您将指定这个子域来部署 php7.4
:
1sudo vi /etc/httpd/conf.d/site2.your_domain.conf
再次,请确保网站目录路径、服务器名称和PHP版本匹配您的唯一信息:
1[label /etc/httpd/conf.d/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 ErrorLog /var/log/httpd/site2.your_domain-error.log
8 CustomLog /var/log/httpd/site2.your_domain-access.log combined
9 <IfModule !mod_php7.c>
10 <FilesMatch \.(php|phar)$>
11 SetHandler "proxy:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost"
12 </FilesMatch>
13 </IfModule>
14
15</VirtualHost>
完成后,保存并关闭文件,然后用以下命令检查Apache配置文件,查找任何语法错误:
1sudo apachectl configtest
你会看到一个输出打印Syntax OK
:
1[secondary_label Output]
2Syntax OK
最后,重新启动 Apache 服务以实现更改:
1sudo 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
文件. 因为它们包含关于你的服务器的敏感信息,并可访问未经授权的用户,它们构成一个安全漏洞。
1sudo rm -rf /var/www/site1.your_domain/info.php
2sudo rm -rf /var/www/site2.your_domain/info.php
现在你有一个单一的 CentOS 8 服务器处理两个不同的 PHP 版本的网站。
结论
您现在已经结合了虚拟主机和PHP-FPM,以便在一个服务器上服务多个网站和多个PHP版本. 您的Apache服务可以处理的PHP网站和PHP版本数量的唯一实际限制是您的实例的处理能力。
从这里开始,你可能会考虑探索PHP-FPM的更先进的功能(https://php-fpm.org/about/),例如它的适应性生殖过程或它如何登录sdtout
和stderr
。