您的位置 首页 php

PHP FastCGI进程管理器PHP-FPM简介

php-fpm的全称是PHP fastcgi process manager,即PHP fastcgi进程管理器。要了解php-fpm,首先要看看CGI和fastcgi的关系。

本文测试环境:

 Rocky Linux 8.5
Apache/2.4.37 (rocky)
PHP Version 7.4.19  

从CGI到FastCGI

CGI的英文全称是common gateway interface,是Web服务器调用外部程序时使用的服务器应用规范。在早期的 Web 通信中,只有存储在 Web 服务器硬盘中的数据才能根据客户端的请求进行转发。在这种情况下,客户端每次获取的信息都是相同的内容(即静态请求,如图片、样式文件、HTML文档)。随着网络的发展,可以呈现的内容越来越丰富,与用户的互动也越来越频繁,比如博客、论坛、电商网站、社交网络等,此时只有静态资源不能满足web通信的需要,所以引入CGI,让客户端请求可以触发web通信服务器运行另外一个外部程序,客户端输入的数据也会被转发到外部程序。程序运行后,将生成的 HTML 等数据通过 Web 服务器返回给客户端(即动态请求,如基于 PHP、Python 和 Java 的应用程序)。 CGI可以根据用户的请求,动态地将各种动态信息返回给客户端。

Fastcgi,顾名思义,是 CGI 的升级版。它旨在提高 CGI 的性能。 CGI会为每一个HTTP请求 fork 一个新的进程进行处理(解析配置文件、初始化执行环境、处理请求),然后这个进程的处理结果通过web服务器转发给用户。如果下一个用户请求动态资源,web服务器又会fork 一个新的进程,如此循环往复。而fastcgi则会先 fork 一个master进程,解析配置文件,初始化执行环境,然后fork多个worker进程(类似nginx),当一个HTTP请求过来时,master进程将其传递给一个worker进程,然后就可以立即接受下一个请求,从而避免重复初始化操作,效率自然提高。而当worker进程超时退出后,master进程则根据配置提前启动几个进程worker进程等待;当 idle worker 进程过多时,则会关闭一些,这样既提高了性能,又节省了系统资源。

PHP-FPM

这样,php-fpm就很容易理解了。 Fastcgi 只是一个协议规范,需要各个语言实现。 php-fpm 是 PHP 版 fastcgi 协议的实现。有了它,就实现了PHP脚本和web服务器(一般是nginx)的通信。同时它也是一个PHP SAPI,从而搭建PHP解释器和web server服务器之间的一座桥梁。

php-fpm管理一个进程池来处理来自web服务器的HTTP动态请求,master进程负责与web服务器通信,接收HTTP请求并转发给服务器worker进程,worker进程主要负责PHP代码的动态执行。处理后将处理结果返回给Web服务器,Web服务器再将处理结果发送给客户端。这就是 php-fpm 的工作原理。

php-fpm有自己独立的配置文件php-fpm.conf,对于Rocky Linux 8默认安装的Apache服务器来说,这个配置文件位于:

/etc/httpd/conf.d/php.conf

其中有一段注释:

 #
# mod_php is deprecated as FPM is now used by default with httpd in event mode
# mod_php is only used when explicitly enabled or httpd switch to prefork mode
#
# mod_php options
#  

这段注释说明了两个问题:

  • Apache现在默认工作在 event 模式下,默认启用 FPM
  • 除非切换到 prefork 模式,或者显式启用mod_php时使用

此外还有一个与PHP有关的配置文件:/etc/httpd/conf.modules.d/15-php.conf

用于确保不同时加载 php5 和 php7 模块,不过默认情况下并没有启用php模块。

 #
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#

# Cannot load both php5 and php7 modules
<IfModule !mod_php5.c>
  <IfModule prefork.c>
    LoadModule php7_module modules/libphp7.so
  </IfModule>
</IfModule>
  

如何安装PHP-FPM

PHP在 5.3.3 之后已经把php-fpm并入到php的核心代码中了。 所以php-fpm不需要单独的下载安装。

对于源代码安装,若想php支持php-fpm,只需要在编译php源码的时候带上 –enable-fpm 就可以了。

对于二进制安装,默认已经包含 php-fpm,其 配置文件位于:/etc/php-fpm.conf

虽然默认已经安装了PHP-FPM,但是默认情况下它并没有启动,想要启动它并且在系统重启时自动启动它,请输入下面的命令:

 systemctl enable php-fpm --now  

然后检查是否启动成功。

 # systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-03-28 08:52:58 EDT; 1 weeks 5 days ago
 Main PID: 726 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 20, slow: 0, Traffic: 0req/sec"
    Tasks: 6 (limit: 17860)
   Memory: 12.6M
   CGroup: /system.slice/php-fpm.service
           ├─726 php-fpm: master process (/etc/php-fpm.conf)
           ├─823 php-fpm: pool www
           ├─824 php-fpm: pool www
           ├─829 php-fpm: pool www
           ├─830 php-fpm: pool www
           └─831 php-fpm: pool www
  

PHP-FPM 和 Nginx

Debian/Ubuntu 上的PHP-FPM默认使用 (www-data) 用户,而 AlmaLinux 上的 PHP-FPM 服务默认使用(apache)用户。

如果你使用的是 Nginx 服务器而不是 Apache 服务器,那么还需要进行以下修改

首先,打开以下(www.conf)配置文件:

 sudo nano /etc/php-fpm.d/www.conf  

然后,将 (apache) 用户和组 修改为 (nginx) 用户和组:

然后按 (CTRL+O) 保存,按 (CTRL+X)退出。

最后,您还需要重新启动 PHP-FPM 服务:

 sudo systemctl restart php-fpm  

参考

  • How to Install PHP 8.0 on Rocky Linux 8 – LinuxCapable()

文章来源:智云一二三科技

文章标题:PHP FastCGI进程管理器PHP-FPM简介

文章地址:https://www.zhihuclub.com/79995.shtml

关于作者: 智云科技

热门文章

网站地图