【PHP】获取PHP-FPM的状态信息

文章目录

一、前言

PHP-FPM内置有一个状态页面,通过这个页面可以获取到FPM的一些状态信息(见下图),如果将这些信息输出到监控系统,可以方便地监控FPM的运行情况。

本文介绍如何调用这个页面。

二、环境

Nginx 1.19

PHP 8.2

三、过程

1)修改PHP-FPM配置文件

在FPM的进程池配置文件(通常名为www.conf)中找到;pm.status_path = /status这个配置项,去掉前面的;注释符号,并将值修改为:

php 复制代码
pm.status_path = /fpm-status

这个是状态页面的路径,保持原样不修改也可以,但是我觉得用 fpm-status 这个名字更好,所以修改了一下:)

修改完后,优雅重启FPM:

shell 复制代码
kill -USR2 {FPM master进程pid}

# 或者:
service php8.2-fpm reload

如果你用的是docker,因为镜像一般不会安装ps等等多种命令,可能会导致比较难找到 FPM 的主进程pid,此时可以使用以下命令来优雅重启:

shell 复制代码
docker kill --signal USR2 {容器ID}

2)修改Nginx配置文件

假设PHP-FPM采用的是TCP socket监听方式,所在的服务器IP是10.0.0.2,监听端口是9000,添加以下location配置:

shell 复制代码
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:

shell 复制代码
nginx -s reload

3)访问页面

因为我们配置了IP白名单为127.0.0.1,所以只能在Nginx服务器本地访问状态页面:

shell 复制代码
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

每个字段的含义可以参阅官方文档

还可以通过一些参数来改变输出信息:

shell 复制代码
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:

shell 复制代码
pm.status_listen = 9001

相应的,Nginx的location配置也要变更:

复制代码
fastcgi_pass 10.0.0.2:9001;

这样,就可以通过9001端口访问状态页面了

注:更改端口后,原端口不会失效,仍然可以通过原端口访问状态页面

相关推荐
DK185838322521 小时前
【源码开源部署】电竞代练护航陪玩小程序:全游戏服务平台完整解决方案(附宝塔部署教程)
游戏·微信小程序·uni-app·开源·php
广州灵眸科技有限公司2 小时前
从手动三步到上电即连:4G模组systemd开机自连方案
linux·运维·服务器·开发语言·网络·人工智能·php
aixingpan3 小时前
aixingpan.cn API开发文档:api_docs_trichart_natal_composite_transit2接口指南
前端·php
妙码生花3 小时前
使用git更新ai-go-admin框架
前端·人工智能·git·golang·typescript·php
PHP实战开发录4 小时前
PHP文件上传成功为什么页面却找不到
开发语言·nginx·php·开发
qq_452396234 小时前
第十篇:《eBPF 可观测性:零侵扰的深度内核追踪》
服务器·网络·php
AC赳赳老秦5 小时前
文旅市场公开数据分析:基于 OpenClaw 采集景区客流与门票公示数据,生成区域文旅热度监测报告
java·c语言·python·php·symfony·deepseek·openclaw
SDWAN_Cheap5 小时前
SD-WAN智能选路技术的算法与实现机制
算法·php·sdwan
xiancai_xianyu7 小时前
想把数据模型一次建完美再上AI?会一直卡在建模里
开发语言·人工智能·php·数据模型·语义层·本体建模·企业知识网络
AC赳赳老秦9 小时前
环保监测公开数据应用:OpenClaw 抓取空气与水质公开监测数据,开展区域环境质量趋势分析
大数据·数据库·人工智能·python·php·deepseek·openclaw