一、前言
PHP-FPM内置有一个状态页面,通过这个页面可以获取到FPM的一些状态信息(见下图),如果将这些信息输出到监控系统,可以方便地监控FPM的运行情况。
本文介绍如何调用这个页面。
二、环境
Nginx 1.19
PHP 8.2
三、过程
1)修改PHP-FPM配置文件
在FPM的进程池配置文件(通常名为www.conf
)中找到;pm.status_path = /status
这个配置项,去掉前面的;
注释符号,并将值修改为:
pm.status_path = /fpm-status
这个是状态页面的路径,保持原样不修改也可以,但是我觉得用 fpm-status 这个名字更好,所以修改了一下:)
修改完后,优雅重启FPM:
kill -USR2 {FPM master进程pid}
# 或者:
service php8.2-fpm reload
如果你用的是docker,因为镜像一般不会安装ps
等等多种命令,可能会导致比较难找到 FPM 的主进程pid,此时可以使用以下命令来优雅重启:
docker kill --signal USR2 {容器ID}
2)修改Nginx配置文件
假设PHP-FPM采用的是TCP socket监听方式,所在的服务器IP是10.0.0.2,监听端口是9000,添加以下location
配置:
location = /fpm-status {
access_log off;
allow 127.0.0.1;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass 10.0.0.2:9000;
}
因为上面pm.status_path
的值为fpm-status,因此Nginx中的路径也须为fpm-status;
强烈建议用allow
指令配置IP白名单,否则所有的IP都可以访问状态页面,泄露敏感信息;
修改完后,优雅重启Nginx:
nginx -s reload
3)访问页面
因为我们配置了IP白名单为127.0.0.1,所以只能在Nginx服务器本地访问状态页面:
curl "http://localhost/fpm-status"
如果没问题,会显示以下信息:
pool: www
process manager: dynamic
start time: 15/Mar/2025:21:10:22 +0800
start since: 2609
accepted conn: 3
listen queue: 0
max listen queue: 0
listen queue len: 4096
idle processes: 2
active processes: 0
total processes: 2
max active processes: 1
max children reached: 0
slow requests: 0
每个字段的含义可以参阅官方文档
还可以通过一些参数来改变输出信息:
http://localhost/fpm-status # 以文本方式输出基础信息
http://localhost/fpm-status?full # 以文本方式输出基础信息 + 每个进程的信息
http://localhost/fpm-status?html # 以HTML格式输出基础信息
http://localhost/fpm-status?openmetrics # 以openmetrics格式输出基础信息(PHP 8.1新增)
http://localhost/fpm-status?json # 以JSON格式输出基础信息
http://localhost/fpm-status?json&full # 以JSON格式输出基础信息 + 每个进程的信息
4)修改状态页面端口
在旧版本的PHP中,状态页面的端口就是PHP-FPM的监听端口,在本文中是9000。
这样会有一个问题,如果所有worker进程都在处理耗时的用户请求,因为阻塞的原因,FPM就无法处理状态页面的请求了,可能会影响到监控系统的工作。
于是PHP 8.0给FPM新增了pm.status_listen
配置项,将状态页面的端口单独隔离出来,例如将端口改为9001:
pm.status_listen = 9001
相应的,Nginx的location
配置也要变更:
fastcgi_pass 10.0.0.2:9001;
这样,就可以通过9001端口访问状态页面了
注:更改端口后,原端口不会失效,仍然可以通过原端口访问状态页面