系统极客一直在努力
专注操作系统及软件使用技能

什么是 PHP-FPM?一份深入浅出的指南

php-fpm

PHP 是目前最流行的服务器端脚本语言之一,支撑着互联网上大量丰富多彩的内容。随着网站变得越来越复杂、流量越来越大,如何让 PHP 跑得更快、更稳就成了一个关键的问题。

PHP-FPM(FastCGI 进程管理器)正是为了提升 PHP 性能而设计的一个重要工具。接下来,我们就一起来了解 PHP-FPM 到底是什么,它是如何工作的,以及为什么它是现代 Web 应用中不可或缺的一个组件。

01. 深入了解 PHP-FPM

PHP-FPM 是一种高性能的 PHP FastCGI 替代实现,专为高性能应用量身打造。你可以把它看作是 PHP 脚本的「管家」,帮助 Web 服务器更高效地执行 PHP 代码。

  • 在过去,PHP 是作为 Web 服务器的「模块」来运行的。
  • 而 PHP-FPM 则是独立运行,它会创建一个「工作进程池」来处理 PHP 脚本,并通过 FastCGI 协议与 Web 服务器进行通信,大大提升了效率。
php-fpm 工作进程池
php-fpm 工作进程池

1.1 PHP-FPM 的核心特性

  • 进程管理:可以管理多个工作进程,确保 PHP 脚本高效执行,同时避免服务器过载。
  • 性能优化:通过维护一个预生成的进程池,大幅减少了请求过程中反复启动和终止进程的开销。
  • 高可伸缩性:提供了高度可定制的配置选项,能够轻松适应从低流量网站到高需求的企业级应用。
  • 高可靠性:通过请求超时和进程限制等功能,PHP-FPM 能够有效防止因代码问题或流量高峰导致的服务崩溃。

1.2 PHP-FPM 的工作原理

PHP-FPM 通过优化与 NGINX、Apache 或 Lighttpd 等 Web 服务器的交互,显著提升了 PHP 应用的性能。它使用 FastCGI 协议处理并分发请求,将这些请求高效地分配到工作进程池之中。

下面我们来详细了解 PHP-FPM 的工作机制:

1.2.1 FastCGI 协议

PHP-FPM 通过 FastCGI 协议与 Web 服务器(如 NGINX、Apache 或 Lighttpd)进行通信,并在其中扮演着「桥梁」的角色,FastCGI 是一种二进制协议,比传统的 CGI 协议更高效:

  • 将 Web 服务器的请求传递给 PHP-FPM。
  • 再将 PHP 脚本的执行结果返回给客户端。
1.2.2 进程池管理

当请求到达时,PHP-FPM 会将它分配给工作进程池中的一个可用进程。根据不同的需求,进程池可以设置为以下三种模式:

  1. 静态模式(Static) :始终保持固定数量的工作进程,适合流量稳定且性能要求高的情况。
  2. 动态模式(Dynamic) :根据流量动态调整工作进程的数量,适合流量波动较大的场景。
  3. 按需模式(OnDemand) :仅在有请求时创建工作进程,并在请求处理完成后销毁,最大限度节省系统资源,适用于负载较轻的应用。

比如「系统极客」网站的 PHP-FPM 就跑在Dynamic模式下,而我本地的测试环境使用的是OnDemand配置。

02. PHP-FPM 的优势

  • 性能提升:通过预先生成工作进程,大大减少了每次请求都要新建进程的系统开销,从而降低响应延迟。这对于高流量网站尤其重要,能显著提升处理能力。
  • 精细的资源管理:开发者和运维人员可以精确控制资源使用,确保服务器性能的稳定。提供了诸如以下配置选项:
  • 精细的资源管理:开发者或运维人员可以精确控制资源的使用,确保服务器的性能稳定。提供了诸如以下配置选项:
    • pm.max_children:最大工作进程数。
    • pm.max_requests:单个进程能处理的最大请求数。
  • 更强的容错能力:可以主动终止超出限制(如执行时间或内存用量)的进程,避免单一请求拖慢整个服务器,保证应用的持续平稳运行。
  • 与 Web 服务器深度集成:与主流的 NGINX、Apache 等 Web 服务器无缝配合,优化了负载均衡和缓存功能,满足现代 Web 应用的复杂部署需求。
  • 安全的多租户支持:支持以不同用户身份来运行工作进程,实现了应用程序之间的隔离。在共享主机环境中,能极大提升系统的安全性。

03. PHP-FPM 新手入门

3.1 安装 PHP-FPM

大多数 Linux 发行版的官方软件源都提供了 PHP-FPM 的安装包。以 Ubuntu 系统为例,你可以使用以下命令来安装(通常与 PHP 一同安装):

sudo apt install php-fpm
在 Ubuntu 上安装 php-fpm
在 Ubuntu 上安装 php-fpm

3.2 配置文件

PHP-FPM 的配置十分灵活,主要通过以下配置文件进行调整:

  • /etc/php/8.x/fpm/php-fpm.conf:全局配置文件。
  • /etc/php/8.x/fpm/pool.d/*.conf:针对不同进程池的配置文件。

以下是一些关键配置参数:

  • pm:进程管理模式,可选值包括静态static、动态dynamic和按需ondemand
  • pm.max_children:最大工作进程数,决定了 PHP-FPM 可以同时处理多少请求。
  • request_terminate_timeout:设置脚本的最大执行时间,防止长时间运行的脚本消耗过多系统资源。

3.3 与 NGINX 服务器集成

1.在 NGINX 中,通过配置fastcgi_pass指令来连接 PHP-FPM。以下是一个简单的配置示例:

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;  # 指定 PHP-FPM 的地址和端口
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
在 NGINX 中配置 fastcgi_pass 指令来连接 PHP-FPM
在 NGINX 中配置 fastcgi_pass 指令来连接 PHP-FPM

2.完成配置后,需要重启 Web 服务器和 PHP-FPM 让更改生效:

sudo systemctl restart php-fpm
sudo systemctl restart nginx

通过以上步骤,你就可以让 NGINX 与 PHP-FPM 无缝协作,为 PHP 应用(如 WordPress)提供高效的运行环境。

04. PHP-FPM 常见配置及作用

下面列出了在实际使用时的一些常见配置项,并概述了它们的功能及对性能和资源管理的影响:

PHP-FPM 常见配置
PHP-FPM 常见配置

4.1 进程管理器

pm指令用于控制 PHP-FPM 工作进程的生成和销毁策略,定义了进程管理模式。

选项描述使用场景
static创建固定数量的子进程,并始终保持运行状态。如果网站是高流量且请求量稳定(如大型电商平台),能确保资源分配一致,避免动态调整的开销。
dynamic根据实时流量动态调整工作进程的数量。如果网站访问量波动较大,能在资源和性能之间提供较好的平衡。
ondemand仅在有请求时创建进程,并在空闲一段时间后自动回收。对于低流量或资源有限的服务器(如测试环境或小型博客),可以最大程度节省系统资源。

当使用dynamic模式时,以下参数用于灵活调整工作进程,以应对流量波动:

参数描述功能
pm.start_servers启动时创建的初始子进程数量。指定启动时创建的子进程数。
pm.min_spare_servers保持的最小空闲进程数。确保始终有一定数量的空闲进程,来快速响应突然增加的请求。
pm.max_spare_servers允许的最大空闲进程数。限制空闲进程的最大数量,防止在低流量时占用过多系统资源。

4.1.1 最大子进程数

pm.max_children定义了 PHP-FPM 可以创建的最大工作进程数,用于处理并发请求。该设置会直接影响服务器能够处理的并发量,而且:

  • 设置过高可能导致服务器内存耗尽。
  • 设置过低则可能引发请求延迟。

4.1.2 最佳实践

你可以根据服务器的物理内存大小,来初略估算出pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers的值:

参数小于3000MB3000到4500MB4500到6500MB6500到8500MB大于8500MB
说明根据内存计算采用固定值采用固定值采用固定值采用固定值
pm.max_childrenRAM 大小÷3÷2050607080
pm.start_serversRAM 大小÷3÷3030405060
pm.min_spare_serversRAM 大小÷3÷4020304050
pm.max_spare_serversRAM 大小÷3÷2050607080

4.2 每进程最大处理请求数

pm.max_requests参数定义了单个工作进程在被重新生成之前可以处理的请求数。通过定期重启进程,可以有效防止由于代码问题或第三方库引起的内存泄漏,而导致系统资源过度消耗。

大多数 PHP-FPM 的pm.max_requests默认值是0或没有设置,表示永不重启。这意表示,只要进程不死,就会一直处理请求。但是:

  • 不建议使用0,特别是对于生产环境。
  • 对于大多数 Web 应用,10005000范围可以提供较好的性能和稳定性,同时避免内存泄漏。

4.3 请求终止超时时间

request_terminate_timeout参数用于设置单个请求的最长执行时间。如果超出限制,PHP-FPM 将终止对应进程,避免长时间运行的脚本过度占用系统资源。

  • 在大多数 PHP-FPM 的默认配置中,request_terminate_timeout的默认值通常是0。这意味着,不会强制终止长时间运行的请求,允许请求一直执行下去,直到完成或发生错误。
  • 建议手动设置一个合理的超时时间(通常在 5-30 秒之间),以防止请求阻塞和资源消耗。

4.4 侦听地址

listen参数指定了 PHP-FPM 用来接收 FastCGI 请求的监听地址,可以设置为 UNIX 套接字IP 地址+端口的组合。

listen = 127.0.0.1:9000
listen = /var/run/php/php8.3-fpm.sock

使用 UNIX 套接字(如.sock文件)可以避免网络通信带来的开销,通常能够带来更好的请求性能。

4.5 用户和用户组

usergroup参数用来指定 PHP-FPM 工作进程的运行用户和用户组。以不同用户身份来运行工作进程,可以有效隔离不同应用之间的资源,减少冲突,并提升服务器的整体安全性。

4.7 日志机制

  • access.log:记录 PHP-FPM 处理的所有请求,有助于监控应用性能和分析请求模式。
  • slowlog:记录执行时间过长的慢速请求,帮助发现性能瓶颈或需要优化的脚本。

这些日志是排查问题和优化性能的重要工具,建议在生产环境中妥善配置并定期分析。

赞(0) 赞赏

评论 抢沙发

微信赞赏