如何在 CentOS 7 上使用 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-mysql-php-lamp-stack-on-centos-7)只能管理一个。将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. SCL (Software Collections) 存储库为 CentOS 7 系统维护了许多版本的 PHP 堆栈。

首先,在您的系统上安装 SCL 存储库:

1sudo yum install centos-release-scl -y

首先,让我们来看看什么版本的 PHP 7 在 SCL 上可用:

1sudo yum list rh-php7[0-9].x86_64

你会看到这样的输出:

1[secondary_label Output]
2Available Packages
3rh-php70.x86_64 2.3-1.el7 centos-sclo-rh
4rh-php71.x86_64 1-1.el7 centos-sclo-rh
5rh-php72.x86_64 1-2.el7 centos-sclo-rh
6rh-php73.x86_64 1-1.el7 centos-sclo-rh

您将注意到最新的版本PHP 7.3也可用,但对于我们的示例,我们将安装版本 7.0 和 7.2。

让我们从更早的版本开始。安装 rh-php70rh-php70-php-fpm:

1sudo yum install rh-php70 rh-php70-php-fpm -y
  • rh-php70 是一个运行 PHP 应用程序的元包
  • rh-php70-php-fpm 提供了快速流程管理器解释器,它作为一个 DAEMON 运行并接收快速/CGI 请求

现在重复 PHP 版本 7.2 的过程。安装 rh-php72rh-php72-php-fpm

1sudo yum install rh-php72 rh-php72-php-fpm -y

接下来,运行以下命令开始使用两个软件集合:

1sudo scl enable rh-php70 bash
2sudo scl enable rh-php72 bash

默认情况下,PHP的两种版本都在听9000端口,但在本教程中,我们希望同时运行两个版本,因此,让我们指定两个新的端口:

要做到这一点,你可以在你最喜欢的文本编辑器中打开/etc/opt/rh/rh-php70/php-fpm.d/www.conf并将每一个外观从9000更改为9002。然后保存并关闭文件并重复对/etc/opt/rh/rh-php72/php-fpm.d/www.conf的过程,现在只能用9003更换9000

1sudo sed -i 's/:9000/:9002/'  /etc/opt/rh/rh-php70/php-fpm.d/www.conf
2sudo sed -i 's/:9000/:9003/'  /etc/opt/rh/rh-php72/php-fpm.d/www.conf

您现在已经为每个PHP服务指定了一个专用端口,但是在这些更改工作之前,您必须将这些端口添加到您的SELinux配置中。

SELinux 是安全增强 Linux 的缩写,在 CentOS 7 上是默认启用的。你必须将你的新端口90029003添加到你的 SELinux 数据库中,并将其分配给你的 httpd 服务,否则你的应用程序将无法运行。

1sudo semanage port -a -t http_port_t -p tcp 9002
2sudo semanage port -a -t http_port_t -p tcp 9003

-a 标志表示您正在将对象添加到数据库中。 -t 标志指明对象的类型,在这种情况下是 http_port_t-p 标志着 tcp 协议. 您可以了解更多关于 SELinux 和 semanage 命令的信息(在本教程中)(https://andsky.com/tech/tutorials/an-introduction-to-selinux-on-centos-7-part-1-basic-concepts),或访问 官方的 SELinux 文档

现在你已经准备好启动你的PHP服务了,开始你的rh-php70-php-fpm服务,并在启动时启动它:

1sudo systemctl start rh-php70-php-fpm
2sudo systemctl enable rh-php70-php-fpm

接下来,检查您的rh-php70-php-fpm服务的状态:

1sudo systemctl status rh-php70-php-fpm

你会看到这样的输出:

 1[secondary_label Output]
 2 rh-php70-php-fpm.service - The PHP FastCGI Process Manager
 3   Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled)
 4   Active: active (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago
 5 Main PID: 1852 (php-fpm)
 6   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
 7   CGroup: /system.slice/rh-php70-php-fpm.service
 8           ├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf)
 9           ├─1853 php-fpm: pool www
10           ├─1854 php-fpm: pool www
11           ├─1855 php-fpm: pool www
12           ├─1856 php-fpm: pool www
13           └─1857 php-fpm: pool www
14
15Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...
16Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.

重复这个过程,启动rh-php72-php-fpm服务,并在启动时启动它:

1sudo systemctl start rh-php72-php-fpm
2sudo systemctl enable rh-php72-php-fpm

接下来,检查您的rh-php72-php-fpm服务的状态:

1sudo systemctl status rh-php72-php-fpm

你会看到另一个像这样的输出:

 1[secondary_label Output]
 2 rh-php72-php-fpm.service - The PHP FastCGI Process Manager
 3   Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled)
 4   Active: active (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago
 5 Main PID: 1876 (php-fpm)
 6   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
 7   CGroup: /system.slice/rh-php72-php-fpm.service
 8           ├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf)
 9           ├─1877 php-fpm: pool www
10           ├─1878 php-fpm: pool www
11           ├─1879 php-fpm: pool www
12           ├─1880 php-fpm: pool www
13           └─1881 php-fpm: pool www
14
15Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...
16Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.

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

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

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

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

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

默认情况下,Apache Web 服务器作为一个apache用户和一个apache组运行,因此/var/www/及其所有文件和子目录也应该由他们拥有。

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使用PHP 7.0来渲染内容:

1sudo vi /etc/httpd/conf.d/site1.your_domain.conf

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

 1[label /etc/httpd/conf.d/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     SetHandler "proxy:fcgi://127.0.0.1:9002
 9     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
10     AddHandler php70-fcgi .php
11     Action php70-fcgi /cgi-bin/php70.fcgi
12     ErrorLog /var/log/httpd/site1.your_domain_error.log
13     CustomLog /var/log/httpd/site1.your_domain_access.log combined
14</VirtualHost>

对于DocumentRoot,你正在指定你的网站根目录的路径。对于ServerAdmin,你正在添加一个电子邮件,而your_domain网站管理员可以访问它。对于ServerName,你正在添加你的第一个子域的URL。对于SetHandler,你正在指定端口9002。剩余的指令也配置你的服务来部署PHP 7.0。

保存并关闭文件。

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

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     SetHandler "proxy:fcgi://127.0.0.1:9003
 8     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
 9     AddHandler php72-fcgi .php
10     Action php72-fcgi /cgi-bin/php72.fcgi
11     ErrorLog /var/log/httpd/site2.your_domain_error.log
12     CustomLog /var/log/httpd/site2.your_domain_access.log combined
13</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. 您将看到两个页面看起来像这样:

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

现在你有一个单一的 CentOS 7 服务器处理两个不同的 PHP 版本的网站。

结论

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

从这里开始,你可能会考虑 探索PHP-FPM的更高级功能,如其适应性发育过程或如何登录sdtoutstderr 或者,你现在可以保护你的网站。

Published At
Categories with 技术
comments powered by Disqus