如何在 CentOS 7 上使用 Apache 和 PHP-FPM 在一台服务器上运行多个 PHP 版本
作者选择了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 应用程序的最佳堆栈之一,尤其是在性能方面。
在本教程中,您将在一个实例上设置两个 PHP 站点。每个站点都将使用自己的域,并且每个域都将部署自己的 PHP 版本。第一个site1.your_domain
将部署 PHP 7.0。第二个,site2.your_domain
,将部署 PHP 7.2。
先决条件
-
按照使用 CentOS 7 的初始服务器设置设置一台具有至少 1GB RAM 的 CentOS 7 服务器,包括 sudo 非 root 用户和防火墙。
-
按照How to Install the Apache Web Server on CentOS 7设置和配置 Apache Web 服务器。
-
配置为指向您的 CentOS 7 服务器的域名。您可以按照How To Point to DigitalOcean Nameservers From Common Domain Registrars了解如何将域指向 DigitalOcean Droplets。出于本教程的目的,我们将使用两个子域,每个子域在我们的 DNS 设置中指定一个
A
记录:site1.your_domain
和site2.your_domain
。
第 1 步 — 使用 PHP-FPM 安装 PHP 版本 7.0 和 7.2
完成先决条件后,您现在将安装 PHP 版本 7.0 和 7.2。 SCL(软件集合)存储库为 CentOS 7 系统维护了多个版本的 PHP 堆栈。如果您需要绝对最新版本的 PHP 并且它在 SCL 上不可用,请检查remi
PPA(个人软件包存档)。
首先将 SCL 存储库安装到您的系统:
sudo yum install centos-release-scl -y
首先让我们看看 SCL 上可用的 PHP 7 版本:
sudo yum list rh-php7[0-9].x86_64
你会看到这样的输出:
OutputAvailable Packages
rh-php70.x86_64 2.3-1.el7 centos-sclo-rh
rh-php71.x86_64 1-1.el7 centos-sclo-rh
rh-php72.x86_64 1-2.el7 centos-sclo-rh
rh-php73.x86_64 1-1.el7 centos-sclo-rh
您会注意到最新版本 PHP 7.3 也可用。但是,对于我们的示例,我们将安装 7.0 和 7.2 版本。
让我们从旧版本开始。安装rh-php70
和rh-php70-php-fpm
:
sudo yum install rh-php70 rh-php70-php-fpm -y
-
rh-php70
是一个运行 PHP 应用程序的元包。 -
rh-php70-php-fpm
提供作为守护进程运行并接收 Fast/CGI 请求的快速进程管理器解释器。
现在对 PHP 7.2 版重复该过程。安装rh-php72
和rh-php72-php-fpm
。
sudo yum install rh-php72 rh-php72-php-fpm -y
接下来,运行以下命令以开始使用这两个软件集合:
sudo scl enable rh-php70 bash
sudo 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
的过程,只是现在将9000
替换为9003
。或者,您可以使用这两个sed
进行替换的命令:
sudo sed -i 's/:9000/:9002/' /etc/opt/rh/rh-php70/php-fpm.d/www.conf
sudo sed -i 's/:9000/:9003/' /etc/opt/rh/rh-php72/php-fpm.d/www.conf
您现在已经为每个 PHP 服务指定了一个专用端口。但是,在这些修改生效之前,您必须将端口添加到您的 SELinux 配置中。
SELinux 是 Security Enhanced Linux 的缩写,在 CentOS 7 上默认启用。您必须将新端口9002
和9003
添加到您的 SELinux 数据库并将它们分配给您的 httpd 服务,否则您的应用程序将无法运行。使用semanage
命令执行此任务:
sudo semanage port -a -t http_port_t -p tcp 9002
sudo semanage port -a -t http_port_t -p tcp 9003
-a
标志指定您正在向数据库添加对象。-t
标志指定对象的类型,在本例中为http_port_t
。-p
标志指定tcp
协议。您可以在本教程](https://www.digitalocean.com/community/tutorials/an-introduction-to-selinux-on-centos-7-part-1-basic-concepts)中了解有关 SELinux 和semanage
命令[的更多信息,或访问官方 SELinux 文档。
现在您已准备好启动并启用您的 PHP 服务。从您的rh-php70-php-fpm
服务开始,并使其在启动时启动:
sudo systemctl start rh-php70-php-fpm
sudo systemctl enable rh-php70-php-fpm
接下来,验证rh-php70-php-fpm
服务的状态:
sudo systemctl status rh-php70-php-fpm
你会看到这样的输出:
Output● rh-php70-php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago
Main PID: 1852 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
CGroup: /system.slice/rh-php70-php-fpm.service
├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf)
├─1853 php-fpm: pool www
├─1854 php-fpm: pool www
├─1855 php-fpm: pool www
├─1856 php-fpm: pool www
└─1857 php-fpm: pool www
Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...
Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.
重复此过程,启动rh-php72-php-fpm
服务并使其在启动时启动:
sudo systemctl start rh-php72-php-fpm
sudo systemctl enable rh-php72-php-fpm
接下来,验证rh-php72-php-fpm
服务的状态:
sudo systemctl status rh-php72-php-fpm
你会看到另一个这样的输出:
Output● rh-php72-php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago
Main PID: 1876 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
CGroup: /system.slice/rh-php72-php-fpm.service
├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf)
├─1877 php-fpm: pool www
├─1878 php-fpm: pool www
├─1879 php-fpm: pool www
├─1880 php-fpm: pool www
└─1881 php-fpm: pool www
Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...
Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-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
组的身份运行。所以/var/www/
及其所有文件和子目录也应该归他们所有。运行以下命令以验证您的网站根目录的正确所有权和权限:
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 使用 PHP 7.0 呈现内容:
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
SetHandler "proxy:fcgi://127.0.0.1:9002
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler php70-fcgi .php
Action php70-fcgi /cgi-bin/php70.fcgi
ErrorLog /var/log/httpd/site1.your_domain_error.log
CustomLog /var/log/httpd/site1.your_domain_access.log combined
</VirtualHost>
对于DocumentRoot
,您正在指定网站根目录的路径。对于ServerAdmin
,您正在添加your_domain
站点管理员可以访问的电子邮件。对于ServerName
,您正在为您的第一个子域添加 url。对于SetHandler
,您指定端口9002
。其余指令还配置您的服务以部署 PHP 7.0。
保存并关闭文件。
接下来,为网站site2.your_domain
创建一个新的虚拟主机配置文件。您将指定此子域来部署 PHP 7.2:
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
SetHandler "proxy:fcgi://127.0.0.1:9003
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler php72-fcgi .php
Action php72-fcgi /cgi-bin/php72.fcgi
ErrorLog /var/log/httpd/site2.your_domain_error.log
CustomLog /var/log/httpd/site2.your_domain_access.log combined
</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.0 版本。第二个表示site2.your_domain
部署了 PHP 7.2 版本。
现在您已经测试了您的网站,请删除info.php
文件。因为它们包含有关您的服务器的敏感信息并且未经授权的用户可以访问,所以它们构成了安全漏洞。删除文件:
sudo rm -rf /var/www/site1.your_domain/info.php
sudo rm -rf /var/www/site2.your_domain/info.php
您现在有一个 CentOS 7 服务器来处理两个具有两个不同 PHP 版本的网站。然而,PHP-FPM 并不局限于这一应用程序。
结论
您现在已经将虚拟主机和 PHP-FPM 结合起来,在单个服务器上为多个网站和多个 PHP 版本提供服务。您的 Apache 服务可以处理的 PHP 站点和 PHP 版本数量的唯一实际限制是您的实例的处理能力。
从这里您可以考虑探索 PHP-FPM 的更高级功能,例如其自适应生成过程或它如何记录sdtout
和stderr
或者,您现在可以保护您的网站。为此,您可以按照我们关于的教程如何使用 Let's Encrypt 提供的免费 TLS/SSL 证书保护您的网站。
更多推荐
所有评论(0)