如何在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 中。
先决条件
在开始本指南之前,您需要以下内容:
- 按照 Ubuntu 18.04 初始服务器设置指南 设置一台 Ubuntu 18.04 服务器,包括 sudo 非 root 用户和防火墙。
- 按照 如何在 Ubuntu 18.04 上安装 Linux、Apache、MySQL、PHP(LAMP 堆栈)之后在您的服务器上安装 LAMP 堆栈。
第 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-fpm
和 libapache2-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 服务器项目 文档 。