如何在Ubuntu18.04上使用MPM事件和PHP-FPM配置ApacheHTTP

来自菜鸟教程
跳转至:导航、​搜索

作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。

介绍

Apache HTTP Web 服务器经过多年的发展,可以在不同的环境中工作并解决不同的需求。 与任何 Web 服务器一样,Apache HTTP 必须解决的一个重要问题是如何处理不同的进程来服务于 http 协议请求。 这包括打开套接字、处理请求、保持连接打开一段时间、处理通过该连接发生的新事件,以及返回由特定语言(如 PHP、Perl 或 Python)制作的程序生成的内容. 这些任务由 多处理模块 (MPM) 执行和控制。

Apache HTTP 带有三种不同的 MPM:

  • Pre-fork:为每个到达服务器的传入连接创建一个新进程。 每个进程都与其他进程隔离,因此它们之间不会共享内存,即使它们在执行过程中的某个时间点执行相同的调用也是如此。 这是运行链接到不支持线程的库(通常是较旧的应用程序或库)的应用程序的安全方式。
  • Worker:父进程负责启动一个子进程池,其中一些正在侦听新的传入连接,而另一些正在为请求的内容提供服务。 每个进程都是线程化的(一个线程可以处理一个连接),因此一个进程可以同时处理多个请求。 这种处理连接的方法鼓励更好的资源利用,同时仍然保持稳定性。 这是可用进程池的结果,其中通常有空闲的可用线程准备好立即为新连接提供服务。
  • Event:基于worker,这个MPM更进一步,优化了父进程如何将任务调度给子进程以及与之关联的线程。 默认情况下,连接保持打开状态 5 秒,如果没有新事件发生则关闭; 这是 keep-alive 指令的默认值,它保留与其关联的线程。 Event MPM 使进程能够管理线程,以便一些线程可以自由处理新的传入连接,而其他线程则保持绑定到活动连接。 允许将分配的任务重新分配给线程将提高资源利用率和性能。

MPM Event 模块是 Apache HTTP Web 服务器上可用的快速多处理模块。

PHP-FPM 是 PHP 的 FastCGI 进程管理器。 FastCGI 协议基于通用网关接口 (CGI),这是一种位于应用程序和 Web 服务器(如 Apache HTTP)之间的协议。 这允许开发人员将应用程序与 Web 服务器的行为分开编写。 程序独立运行它们的进程,并通过该协议将它们的产品传递给 Web 服务器。 每个需要应用程序处理的新连接都将创建一个新进程。

通过将 Apache HTTP 中的 MPM 事件与 PHP FastCGI 进程管理器 (PHP-FPM) 相结合,网站可以更快地加载并处理更多并发连接,同时使用更少的资源。

在本教程中,您将通过将默认的多处理模块从 pre-fork 更改为 event 并使用 PHP-FPM 进程管理器来处理 PHP 代码而不是经典 [ X231X] 在 Apache HTTP 中。

先决条件

在开始本指南之前,您需要以下内容:

第 1 步 — 更改多处理模块

Ubuntu 从其父发行版 Debian 继承脚本来启用或禁用 Apache HTTP 模块。 您将在此步骤中使用此工具集来禁用 Pre-fork 模块并启用 Event 模块。

在此步骤中,您将停止 Apache HTTP,禁用链接到 Pre-fork 模块的 PHP 7.2 模块,然后禁用 Pre-fork 以立即启用 Event 模块。

首先,您将停止 Apache HTTP 服务:

sudo systemctl stop apache2

现在可以禁用 PHP 7.2 模块,该模块与 Pre-fork 模块有关:

sudo a2dismod php7.2

然后禁用 Pre-fork MPM 模块:

sudo a2dismod mpm_prefork

现在启用 Event MPM 模块:

sudo a2enmod mpm_event

您已将 MPM 从 pre-fork 切换到 event 并删除了 PHP 和 Apache HTTP 之间的 PHP 7.2 模块连接。 在下一步中,您将安装 php-fpm 模块,以及相关的库和代理模块。 您将配置 Apache HTTP 以便它也可以与 PHP 通信。

第 2 步 — 配置 Apache HTTP 以使用 FastCGI 进程管理器

在这个阶段,您已经通过从 Pre-fork MPM 移动到 Event 来切换 Apache HTTP 处理连接的方式。 但是,在此过程中,您禁用了将 Apache HTTP 与运行在 PHP 上的任何程序连接起来的 PHP 模块。

在这一步中,您将安装 PHP-FPM 处理器,以便 Apache HTTP 再次能够处理 PHP 程序。 您还将安装依赖库并启用模块,以便两者可以比以前更顺畅、更快地协作。

首先安装php-fpm。 以下命令将安装 PHP-FPM 包,并自动启用与 systemd 集成的 php7.2-fpm 服务,因此该服务在启动时启动:

sudo apt install php-fpm

为了进行通信,Apache HTTP 和 PHP 需要一个支持这种能力的库。 您现在将安装 libapache2-mod-fcgid,它能够充当程序与 Web 服务器之间的接口,并且它特定于 Apache HTTP。 这种通信将通过 UNIX 套接字进行。

安装这个库:

sudo apt install libapache2-mod-fcgid

您已经安装了 php-fpmlibapache2-mod-fcgid,但都没有启用。

首先使用以下命令启用 php-fpm 模块:

sudo a2enconf php7.2-fpm

其次启用 Apache HTTP proxy 模块:

sudo a2enmod proxy

第三,在 Apache HTTP 中启用 FastCGI proxy 模块:

sudo a2enmod proxy_fcgi

注意:你可以通过UNIX套接字读取PHP程序和Apache HTTP交互的配置,如下:

cat /etc/apache2/conf-enabled/php7.2-fpm.conf

现在一切就绪,您可以启动 Apache HTTP。 您将首先进行配置检查:

sudo apachectl configtest
OutputSyntax OK

之后您可以继续重新启动 Apache HTTP,因为它是在安装 FastCGI 库 libapache2-mod-fcgid 时自动启动的:

sudo systemctl restart apache2

您已经安装了 php-fpm 模块,配置了 Apache HTTP 以使用它,启用了 FastCGI 协议工作所需的模块,并启动了相应的服务。

现在 Apache 启用了 Event MPM 模块并且 PHP-FPM 存在并正在运行,是时候检查一切是否按预期工作了。

第 3 步 — 检查您的配置

为了检查配置更改是否已应用,您将运行一些测试。 第一个将检查 Apache HTTP 使用的多处理模块。 第二个将验证 PHP 是否正在使用 FPM 管理器。

通过运行以下命令检查 Apache HTTP 服务器:

sudo apachectl -M | grep 'mpm'

您的输出将如下所示:

Outputmpm_event_module (shared)

您可以对 proxy 模块和 FastCGI 重复相同的操作:

sudo apachectl -M | grep 'proxy'

输出将显示:

Outputproxy_module (shared)
proxy_fcgi_module (shared)

如果您想查看整个模块列表,您可以删除 -M 之后的命令的第二部分。

现在是检查 PHP 是否使用 FastCGI 进程管理器的时候了。 为此,您将编写一个小的 PHP 脚本,它将向您显示与 PHP 相关的所有信息。

运行以下命令写入一个文件,命名如下:

sudo nano /var/www/your_domain/info.php

info.php文件中添加如下内容:

信息.php

<?php phpinfo(); ?>

现在访问您的服务器的 URL 并在末尾附加 info.php,如下所示:http://your_domain/info.php

服务器 API 条目将是 FPM/FastCGI

在此检查后删除 info.php 文件,因此不会公开披露有关服务器的信息:

sudo rm /var/www/yourdomain.com/info.php

您已经检查了 MPM 模块的工作状态、处理 FastCGI 的模块和 PHP 代码的处理。

结论

您已经优化了原始 LAMP 堆栈,因此创建新的 Apache HTTP 进程的连接数量增加了,PHP-FPM 将更有效地处理 PHP 代码,并且整体资源利用率得到了提高。

有关不同模块和相关项目的更多信息,请参阅 Apache HTTP 服务器项目 文档