如何结合 Prometheus 监控 PHP-FPM 进程池状态指标?

文章导读
通过启用 php-fpm 的 pm.status_path 接口(默认/ status),配合 php-fpm-exporter v0.6.1 版本将指标暴露到 9190 端口,Prometheus 以 15s 抓取间隔可实现对进程池状态的实时监控。
📋 目录
  1. A 原因分析
  2. B 解决方案
  3. C 注意事项
  4. D 参考来源
A A

如何结合 Prometheus 监控 PHP-FPM 进程池状态指标?

核心结论:通过启用 php-fpm 的 pm.status_path 接口(默认/ status),配合 php-fpm-exporter v0.6.1 版本将指标暴露到 9190 端口,Prometheus 以 15s 抓取间隔可实现对进程池状态的实时监控。

原因分析

PHP-FPM 采用多进程模型,线上通常配置 static 静态进程数,很容易因为 I/O 慢导致进程全部占满,造成拒绝服务。根据鱼儿的博客(2021 年 4 月 3 日)说明,需要关注活跃进程的比例来反馈进程数是否够用。php-fpm 内建状态页可拉取 json 格式的状态信息,包含 accepted conn、listen queue、idle processes、active processes、total processes、max children reached、slow requests 等关键指标。

解决方案

第一步:启用 PHP-FPM 状态接口

在 php-fpm 配置文件中启用 status 接口。根据 2024 年 6 月 1 日的搜索结果,编辑配置文件(路径因系统而异):

vim /usr/local/php/etc/php-fpm.conf/etc/php-fpm.d/www.conf

添加或取消注释以下配置:

pm.status_path = /status

ping.path = /ping

根据 2019 年 11 月 21 日的资料,默认情况下为pm.status_path = /status,也可以改成其他路径如/pmstatus/phpfpm_status。配置完成后重启服务:systemctl restart php-fpm(CentOS 7.5 环境,2019 年 3 月 27 日)或sudo systemctl restart php{version}-fpm(Ubuntu,2025 年 12 月 30 日)。

第二步:配置 Nginx 转发状态接口

由于无法直接用 fcgi 协议访问 php-fpm,需要配置 nginx 转发。根据 2022 年 6 月 7 日的搜索结果,nginx 配置示例:

server {

listen 9010;

allow 127.0.0.1;

deny all;

location ~ ^/(status|ping)$ {

如何结合 Prometheus 监控 PHP-FPM 进程池状态指标?

fastcgi_pass 127.0.0.1:9000;

include fastcgi_params;

}

}

注意:若 fpm 配置文件中使用 socket 方式(如listen = unix:/var/run/php-fpm/php-fpm.sock),则 nginx 中应配置fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;(2024 年 6 月 1 日)。

第三步:部署 php-fpm-exporter

下载并启动 php-fpm-exporter v0.6.1 版本(多个搜索结果均使用此版本):

wget https://github.com/bakins/php-fpm-exporter/releases/download/v0.6.1/php-fpm-exporter.linux.amd64

mkdir -p /usr/local/exporter/php-fpm/

mv php-fpm-exporter.linux.amd64 /usr/local/exporter/php-fpm/php-fpm-exporter

nohup /usr/local/exporter/php-fpm/php-fpm-exporter --addr 0.0.0.0:9190 --endpoint http://127.0.0.1:9010/status &

exporter 将 php-fpm 状态页的 json 数据转换为 Prometheus 可采集的/metrics 格式,监听 9190 端口。

第四步:配置 Prometheus 抓取

在 Prometheus 配置文件中添加 job:

如何结合 Prometheus 监控 PHP-FPM 进程池状态指标?

- job_name: 'php-fpm'

static_configs:

- targets: ['localhost:9190']

根据 2025 年 12 月 10 日的建议,Prometheus 抓取间隔建议 15s。

第五步:Grafana 可视化

在 Grafana 中添加 Prometheus 数据源,导入 PHP-FPM 监控面板。根据 2025 年 12 月 10 日的建议,Grafana 使用 5-15s 刷新频率。可监控的关键指标包括:active processes(活跃进程)、idle processes(空闲进程)、max children reached(最大子进程达到次数)、slow requests(慢请求数)。

注意事项

1. 端口配置一致性:若 php-fpm 配置listen = 127.0.0.1:9000,则 nginx 中必须配置fastcgi_pass 127.0.0.1:9000;,否则会报错connect() failed (111: Connection refused) while connecting to upstream导致 502 错误(2024 年 6 月 1 日)。

2. 访问权限控制:nginx 配置中应使用allow 127.0.0.1; deny all;限制 status 接口仅本地访问,避免监控接口暴露给公网(多个搜索结果均强调此配置)。

3. 进程池配置参考:根据 2019 年 11 月 21 日的配置示例,合理设置pm.max_children=300pm.start_servers=20pm.min_spare_servers=5pm.max_spare_servers=35pm.max_requests=10240,结合监控数据调整。

4. 状态验证:配置完成后使用curl http://127.0.0.1:9010/status检查,正常返回应包含pool: wwwprocess manager: dynamic/staticaccepted connlisten queue: 0等字段(2022 年 6 月 7 日、2024 年 6 月 1 日均有验证示例)。

参考来源

来源:GitHub - bakins/php-fpm-exporter v0.6.1 版本发布页

来源:鱼儿的博客 - kubernetes prometheus 监控 php-fpm 状态(2021 年 4 月 3 日)

来源:CSDN - Prometheus 监控 PHP-FPM 配置教程(2022 年 6 月 7 日、2024 年 6 月 1 日)

来源:腾讯云开发者社区 - 如何监控缓慢的 PHP 进程(2011 年 12 月 19 日、2021 年 10 月 6 日)