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()