作为 Write for DOnations 计划的一部分,作者选择了 Open Internet/Free Speech Fund 来接受捐赠。
介绍
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 步 — 更改多处理模块
您将首先在 httpd.conf
文件中查找 pre-fork 指令。 这是 Apache HTTP 的主要配置文件,您可以在其中启用和禁用模块。 您可以编辑和设置指令,例如 Apache HTTP 将提供内容的侦听端口或要在此文件中显示的内容的位置。
要进行这些更改,您将使用 nl
、数字行、程序和 -ba
标志来计算和编号行,以便以后不会出现任何不匹配的情况。 结合 grep
这个命令将首先计算路径中指定的文件中的所有行,一旦完成,它将搜索您要查找的字符串。
运行以下命令,以便 nl
程序对 httpd.conf
中的行进行处理和编号。 然后,grep
将通过搜索给定的字符串 'mod_mpm_prefork'
来处理输出:
nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'
作为输出,您将看到类似于以下内容的内容:
Output67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
让我们用您的文本编辑器编辑行 67。 在本教程中,您将使用 vi
,它是 FreeBSD 上的默认编辑器:
sudo vi +67 /usr/local/etc/apache24/httpd.conf
在该行的开头附加一个 #
符号,以便将此行注释掉,如下所示:
/usr/local/etc/apache24/httpd.conf
... # LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so ...
通过附加 #
符号,您已禁用 pre-fork MPM 模块。
现在您将在同一个 httpd.conf
文件中找到事件指令。
nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event
您将看到类似于以下内容的输出:
Output... 66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so ...
现在您将删除 66 行中的 #
符号以启用事件 MPM:
sudo vi +66 /usr/local/etc/apache24/httpd.conf
该指令现在将如下所示:
/usr/local/etc/apache24/httpd.conf
... LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so ...
现在您已经将配置从 MPM pre-fork 切换到 event,您可以删除将 PHP 处理器连接到 Apache HTTP 的 mod_php73
包,因为它不再需要并且如果它保留在系统:
sudo pkg remove -y mod_php73
通过运行以下命令进行测试,确保配置正确:
sudo apachectl configtest
如果您在输出中看到 Syntax OK
,则可以重新启动 Apache HTTP 服务器:
sudo apachectl restart
注意: 如果您的服务器上还有其他正在运行的 HTTP 连接,建议使用 优雅重启 而不是定期重启。 这将确保用户不会被推出,失去他们的连接:
sudo apachectl graceful
您已将 MPM 从 pre-fork 切换到 event 并删除了 mod_php73
模块连接 PHP 到 Apache HTTP。 在下一步中,您将安装 PHP-FPM 模块并配置 Apache HTTP,以便它可以更快地与 PHP 通信。
第 2 步 — 配置 Apache HTTP 以使用 FastCGI 进程管理器
FreeBSD 有几个受支持的 PHP 版本,您可以通过包管理器安装它们。 在 FreeBSD 上,各种可用版本的不同二进制文件被编译,而不是像大多数 GNU/Linux 发行版在其默认存储库中提供的那样只使用一个。 为了遵循最佳实践,您将使用受支持的版本,您可以在 PHP 的支持版本页面 上查看。
在此步骤中,您将添加 PHP-FPM 作为运行服务以在启动时启动。 您还将通过为模块添加专用配置以及在 httpd.conf
中启用一些其他模块来配置 Apache HTTP 以使用 PHP。
首先,您将 'php_fpm_enable=YES'
附加到 /etc/rc.conf
文件,以便 PHP-FPM 服务可以启动。 您将使用 sysrc
命令来做到这一点:
sudo sysrc php_fpm_enable="YES"
现在您将把 php-fpm
模块添加到 Apache 模块的目录中,因此它被配置为供 Apache HTTP 使用。 为此创建以下文件:
sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf
将以下内容添加到 030_php-fpm.conf
中:
/usr/local/etc/apache24/modules.d/030_php-fpm.conf
<IfModule proxy_fcgi_module> <IfModule dir_module> DirectoryIndex index.php </IfModule> <FilesMatch "\.(php|phtml|inc)$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> </IfModule>
这表明如果启用了模块 'proxy_fcgi'
以及 'dir_module'
,则任何与括号中的扩展名匹配的已处理文件都应由在本地计算机上运行的 FastCGI 进程管理器通过端口 [X232X ]——就好像本地机器是代理服务器一样。 这是 PHP-FPM 模块和 Apache HTTP 互连的地方。 为此,您将在此步骤中激活更多模块。
要启用代理模块,您首先要在 httpd.conf
文件中搜索它:
nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so
您将看到类似于以下内容的输出:
Output... 129 #LoadModule proxy_module libexec/apache24/mod_proxy.so ...
您将通过删除 #
符号取消注释该行:
sudo vi +129 /usr/local/etc/apache24/httpd.conf
编辑后,该行将如下所示:
/usr/local/etc/apache24/httpd.conf
... LoadModule proxy_module libexec/apache24/mod_proxy.so ...
现在您可以激活 FastCGI 模块。 使用以下命令查找模块:
nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so
您将看到类似于以下内容的内容:
Output... 133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so ...
现在取消注释 133 行,就像您已经对其他模块完成的一样:
sudo vi +133 /usr/local/etc/apache24/httpd.conf
您将按如下方式离开该行:
/usr/local/etc/apache24/httpd.conf
... LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so ...
完成后,您将启动 PHP-FPM 服务:
sudo service php-fpm start
您将重新启动 Apache,以便它加载包含 PHP 模块的最新配置更改:
sudo apachectl restart
您已经安装了 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)
您可以对代理模块和 FastCGI 重复相同的操作:
sudo apachectl -M | grep 'proxy'
输出将显示:
Outputproxy_module (shared) proxy_fcgi_module (shared)
如果您想查看整个模块列表,您可以删除 -M
之后的命令的第二部分。
现在是检查 PHP 是否使用 FastCGI 进程管理器的时候了。 为此,您将编写一个非常小的 PHP 脚本,它将向您显示与 PHP 相关的所有信息。
运行以下命令写入一个文件,命名如下:
sudo vi /usr/local/www/apache24/data/info.php
将以下内容添加到 info.php 文件中:
信息.php
<?php phpinfo(); ?>
现在访问您的服务器的 URL 并在末尾附加 info.php
,如下所示:http://your_server_IP_address/info.php
。
服务器 API 条目将为 FPM/FastCGI。
请记住在此检查后删除 info.php
文件,以免公开披露有关服务器的信息。
sudo rm /usr/local/www/apache24/data/info.php
您已经检查了 MPM 模块的工作状态、处理 FastCGI 的模块以及 PHP 代码的处理。
结论
您已经优化了原始 FAMP 堆栈,因此创建新 Apache HTTP 进程的连接数量增加了,PHP-FPM 将更有效地处理 PHP 代码,并且整体资源利用率得到了提高。
有关不同模块和相关项目的更多信息,请参阅 Apache HTTP 服务器项目 文档 。