作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。
介绍
在Apache的HTTP Web服务器已经通过几年来在不同的环境下正常工作发展和解决不同的需求。与任何 Web 服务器一样,Apache HTTP 必须解决的一个重要问题是如何处理不同的进程来为 http 协议请求提供服务。这包括打开套接字、处理请求、保持连接打开一段时间、处理通过该连接发生的新事件,以及返回由特定语言(如 PHP、Perl 或 Python)编写的程序生成的内容. 这些任务由多处理模块(MPM)执行和控制。
Apache HTTP 带有三种不同的 MPM:
- Pre-fork:为每个到达服务器的传入连接创建一个新进程。每个进程都相互隔离,因此它们之间不会共享内存,即使它们在执行过程中的某个时刻执行相同的调用。这是运行链接到不支持线程的库的应用程序(通常是较旧的应用程序或库)的安全方式。
- Worker:父进程负责启动子进程池,其中一些正在侦听新的传入连接,而另一些正在为请求的内容提供服务。每个进程都是线程化的(一个线程可以处理一个连接),因此一个进程可以同时处理多个请求。这种处理连接的方法鼓励更好的资源利用,同时仍然保持稳定性。这是可用进程池的结果,其中通常有空闲可用线程准备好立即为新连接提供服务。
- 事件:基于工作线程,此 MPM 通过优化父进程如何将任务调度到子进程以及与其关联的线程,更进一步。连接默认保持打开状态 5 秒,如果没有新事件发生则关闭;这是 keep-alive 指令的默认值,它保留与其关联的线程。事件 MPM 使进程能够管理线程,以便一些线程可以自由地处理新的传入连接,而其他线程则保持绑定到实时连接。允许将分配的任务重新分配给线程将有助于提高资源利用率和性能。
该MPM事件模块可在Apache HTTP Web服务器上的快速多处理模块。
PHP-FPM是PHP的 FastCGI 进程管理器。FastCGI 协议基于通用网关接口 (CGI),这是一种位于应用程序和 Web 服务器(如 Apache HTTP)之间的协议。这允许开发人员独立于 Web 服务器的行为编写应用程序。程序独立运行它们的进程,并通过这个协议将它们的产品传递给网络服务器。应用程序需要处理的每个新连接都将创建一个新进程。
通过将 Apache HTTP 中的 MPM 事件与 PHP FastCGI 进程管理器 (PHP-FPM) 相结合,网站可以更快地加载并处理更多并发连接,同时使用更少的资源。
在本教程中,您将通过将默认的多处理模块从 pre-fork 更改为 event 并使用 PHP-FPM 流程管理器来处理 PHP 代码而不是Apache HTTP中的经典代码来提高LAMP 堆栈的性能mod_php
。
先决条件
在开始本指南之前,您需要具备以下条件:
- 按照Ubuntu 18.04 初始服务器设置指南设置一台 Ubuntu 18.04 服务器,包括一个 sudo 非 root 用户和一个防火墙。
- 安装在服务器上的 LAMP 堆栈遵循如何在 Ubuntu 18.04 上安装 Linux、Apache、MySQL、PHP(LAMP 堆栈)。
步骤 1 — 更改多处理模块
Ubuntu 从其父发行版 Debian 继承脚本以启用或禁用 Apache HTTP 模块。您将在此步骤中使用此工具集禁用 Pre-fork 模块并启用 Event 模块。
在此步骤中,您将停止 Apache HTTP,禁用PHP 7.2
链接到 Pre-fork 模块的模块,然后禁用 Pre-fork 以立即启用事件模块。
首先,您将停止 Apache HTTP 服务:
- sudo systemctl stop apache2
现在可以禁用该PHP 7.2
模块,该模块与 Pre-fork 模块相关:
- sudo a2dismod php7.2
然后禁用 Pre-fork MPM 模块:
- sudo a2dismod mpm_prefork
现在启用事件 MPM 模块:
- sudo a2enmod mpm_event
您已经将 MPM 从 pre-fork 切换到 event 并删除了PHP 7.2
PHP 和 Apache HTTP 之间的模块连接。在下一步中,您将安装该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 包,它会自动启用php7.2-fpm
与systemd集成的服务,因此该服务在启动时启动:
- 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 HTTPproxy
模块:
- sudo a2enmod proxy
第三次proxy
在 Apache HTTP 中启用 FastCGI模块:
- 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 phpinfo(); ?>
现在访问你的服务器的网址,并将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 服务器项目文档。