作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。
介绍
Apache HTTP网页服务器多年来一直在演变,以在不同的环境中工作并解决不同的需求。 一个重要的问题Apache HTTP必须解决,就像任何网页服务器一样,是如何处理不同的流程来服务HTTP协议请求。 这包括打开一个接口,处理请求,保持连接开放一段时间,处理通过该连接发生的新事件,并返回用特定语言(如PHP,Perl或Python)制作的程序产生的内容。
Apache HTTP 配备了三个不同的 MPM:
- ** Pre-fork**:为到达服务器的每个接入的连接创建了新进程. 每个过程都与其它过程相隔开来,所以它们之间没有共享记忆,即使它们在执行过程中的某个时候执行相同的呼叫. 这是一种安全的方法,可以运行与不支持线程的库相连接的应用程序—— 通常是更古老的应用程序或库.
- Worker:一个父进程负责启动一个儿童进程集合,其中一些进程正在监听新来的连接,另一些进程正在服务所请求的内容. 每个进程被线化(一个单线程可以处理一个连接),因此一个进程可以同时处理几个请求. 这种处理连接的方法鼓励更好地利用资源,同时保持了稳定。 这是可用流程集合的结果,这些流程往往有免费可用的线程准备立即为新连接服务. *Event:基于工人,这个MPM更进一步,通过优化父母流程调度给孩子流程以及与之相关的线程的任务. 连接默认会打开5秒, 如果没有新事件发生则关闭; 这是 keep- alive 指令默认值, 它保留与之相关的线程 。 事件 MPM 使进程能够管理线程,这样一些线程就可以自由处理新接入的连接,而另一些则被绑定在活的连接上. 允许将分配的任务重新分配给线程,将有利于更好的资源利用和性能。
MPM Event模块是一个快速的多处理模块,可在Apache HTTP Web 服务器上使用。
PHP-FPM是PHP的FastCGI流程管理器。FastCGI协议是基于通用网关接口(CGI),该协议位于应用程序和Web服务器之间,如Apache HTTP。这使开发人员能够从Web服务器的行为分开编写应用程序。程序独立运行他们的流程,并通过该协议将他们的产品传递给Web服务器。
通过将Apache HTTP中的MPM事件与PHP FastCGI Process Manager(PHP-FPM)相结合,一个网站可以加载更快,同时使用更少的资源来处理更多的同时连接。
在本教程中,您将通过将默认的多处理模块从预先到事件更改,并使用PHP-FPM流程管理器来处理PHP代码,而不是经典的mod_php
在Apache HTTP。
<$>[注] **注:**截至2022年7月1日,DigitalOcean不再支持通过控制面板或API创建新的FreeBSD Droplets。
前提条件
在您开始本指南之前,您将需要以下内容:
- 一个 FreeBSD 12.0 服务器根据此指南设置(https://andsky.com/tech/tutorials/how-to-get-started-with-freebsd)。
- FAMP 堆栈安装在您的服务器上,根据此教程(https://andsky.com/tech/tutorials/how-to-install-an-apache-mysql-and-php-famp-stack-on-freebsd-12-0)。
- 访问具有 root 特权的用户(或使用 sudo 允许)以进行配置更改
步骤 1 – 更改多处理模块
您将首先在 httpd.conf 文件中寻找预叉指令,这是您可以启用和禁用模块的 Apache HTTP 的主要配置文件,您可以编辑和设置指令,例如 Apache HTTP 将提供内容的倾听端口或该文件中显示的内容的位置。
要进行这些更改,您将使用nl
,数字行,程序,与-ba
标志来计算和数字行,以便在以后的阶段没有任何不匹配。
运行以下命令,以便nl
程序将处理和编号在httpd.conf
中的行,然后,grep
将通过搜索给定的字符串mod_mpm_prefork
来处理输出:
1nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'
作为输出,你会看到类似的东西:
1[secondary_label Output]
267 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
让我们用你的文本编辑器编辑行 67。 在本教程中,你将使用‘vi’,这是FreeBSD上的默认编辑器:
1sudo vi +67 /usr/local/etc/apache24/httpd.conf
在行开始时附上一个#
符号,以便此行评论,如下:
1[label /usr/local/etc/apache24/httpd.conf]
2...
3# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
4...
通过附加#
符号,您已禁用了预叉 MPM 模块。
现在你会在同一个httpd.conf
文件中找到事件指令。
1nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event
您将看到类似于以下的输出:
1[secondary_label Output]
2...
366 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
4...
现在,您将删除第 66 行中的#
符号,以启用事件 MPM:
1sudo vi +66 /usr/local/etc/apache24/httpd.conf
该指令现在将读成如下:
1[label /usr/local/etc/apache24/httpd.conf]
2...
3LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
4...
现在你已经将配置从MPM预先转到事件,你可以删除将PHP处理器连接到Apache HTTP的mod_php73
包,因为它不再是必要的,如果它留在系统上,它会干扰:
1sudo pkg remove -y mod_php73
确保配置是正确的,运行以下命令来测试:
1sudo apachectl configtest
如果您在输出中看到Syntax OK
,您可以重新启动Apache HTTP服务器:
1sudo apachectl restart
<$>[注] 注: 如果您的服务器上有其他正在运行的 HTTP 连接,建议使用 可爱的重新启动而不是正常的重新启动。
1sudo apachectl graceful
美元
您已将MPM从预先转到事件,并删除了mod_php73
模块连接PHP到Apache HTTP。
步骤 2 — 配置 Apache HTTP 使用 FastCGI 流程管理器
FreeBSD 有几个支持的PHP版本,您可以通过包管理器安装。在FreeBSD上,各种可用的版本的不同二进制版本被编译,而不是只使用一种,就像大多数GNU/Linux发行版在其默认存储库中提供一样。
在此步骤中,您将添加PHP-FPM作为运行服务,以便在启动时启动,您还将通过为模块添加专用配置来配置Apache HTTP,并在httpd.conf中启用一些其他模块。
首先,您将附加 'php_fpm_enable=YES' 到
/etc/rc.conf' 文件,以便 PHP-FPM 服务可以启动。
1sudo sysrc php_fpm_enable="YES"
现在,您将将php-fpm
模块添加到Apache模块的目录中,因此它被配置为由Apache HTTP使用。
1sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf
将下列内容添加到 030_php-fpm.conf
中:
1[label /usr/local/etc/apache24/modules.d/030_php-fpm.conf]
2<IfModule proxy_fcgi_module>
3 <IfModule dir_module>
4 DirectoryIndex index.php
5 </IfModule>
6 <FilesMatch "\.(php|phtml|inc)$">
7 SetHandler "proxy:fcgi://127.0.0.1:9000"
8 </FilesMatch>
9</IfModule>
这表明,如果启用了模块 'proxy_fcgi' 和
'dir_module',那么任何匹配插件扩展的处理文件都应该由运行在本地机器上的 FastCGI 流程管理器处理,如同本地机器是一个代理服务器。
要启用代理模块,你首先要在 httpd.conf 文件中搜索它:
1nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so
您将看到类似于以下的输出:
1[secondary_label Output]
2...
3129 #LoadModule proxy_module libexec/apache24/mod_proxy.so
4...
您可以通过删除#
符号来删除该行:
1sudo vi +129 /usr/local/etc/apache24/httpd.conf
该行将看起来如下,一旦编辑:
1[label /usr/local/etc/apache24/httpd.conf]
2...
3LoadModule proxy_module libexec/apache24/mod_proxy.so
4...
现在你可以激活FastCGI模块,用以下命令找到该模块:
1nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so
你会看到类似于以下的东西:
1[secondary_label Output]
2...
3133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so
4...
现在,如同你已经在其他模块中所做的那样,解读第133行:
1sudo vi +133 /usr/local/etc/apache24/httpd.conf
你会留下线条如下:
1[label /usr/local/etc/apache24/httpd.conf]
2...
3LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so
4...
一旦完成,您将启动 PHP-FPM 服务:
1sudo service php-fpm start
您将重新启动Apache,以便加载包含PHP模块的最新配置更改:
1sudo apachectl restart
您已安装了 PHP-FPM 模块,配置了 Apache HTTP 以便与其工作,启用了 FastCGI 协议所需的模块,并启动了相应的服务。
现在,Apache 已启用 Event MPM 模块,并且 PHP-FPM 已经存在并运行,现在是时候检查一切按预期工作了。
步骤3 - 检查您的配置
为了检查配置更改是否已应用,您将运行一些测试. 第一种测试将检查 Apache HTTP 正在使用的多处理模块。
通过运行以下命令检查 Apache HTTP 服务器:
1sudo apachectl -M | grep 'mpm'
您的输出将如下:
1[secondary_label Output]
2mpm_event_module (shared)
您可以对代理模块和 FastCGI 重复:
1sudo apachectl -M | grep 'proxy'
结果将显示:
1[secondary_label Output]
2proxy_module (shared)
3proxy_fcgi_module (shared)
如果你想看到整个模块列表,你可以删除-M
之后的命令的第二部分。
现在是时候检查PHP是否使用FastCGI流程管理器了,这样做你会写一个非常小的PHP脚本,它会给你显示与PHP相关的所有信息。
运行以下命令来写一个名为以下的文件:
1sudo vi /usr/local/www/apache24/data/info.php
将以下内容添加到 info.php 文件中:
1[label info.php]
2<?php phpinfo(); ?>
现在访问您的服务器的URL,并在末尾添加info.php
:http://your_server_IP_address/info.php
。
服务器 API 输入将是 ** FPM/FastCGI**。
请记住在此检查后删除info.php
文件,以便不公开披露有关服务器的信息。
1sudo rm /usr/local/www/apache24/data/info.php
你已经检查了MPM模块的工作状态,处理FastCGI的模块,以及PHP代码的处理。
结论
您已经优化了原始的 FAMP 堆栈,因此创建新的 Apache HTTP 流程的连接数量增加了,PHP-FPM 将更有效地处理 PHP 代码,并提高了整体资源利用率。
请参阅 Apache HTTP 服务器项目 文档 有关不同模块和相关项目的更多信息。