
前言在现代Web应用架构中Nginx与PHP-FPM的组合是极为常见的动态网站部署方案。对PHP-FPM进程池状态的监控直接关系到PHP应用的性能表现和稳定性。PHP-FPM内置了状态页功能可以输出丰富的运行指标结合Zabbix的监控模板我们能够实时掌握PHP应用服务器的运行状况。本文将详细介绍如何在NginxPHP-FPM环境中开启状态页功能配置Nginx访问路由并利用Zabbix模板实现对PHP-FPM的全面监控。一、实验环境说明组件配置应用服务器AlmaLinux 9.1IP: 192.168.38.28Zabbix Server192.168.38.30Nginxyum安装默认配置PHP-FPMyum安装版本7.x/8.xPHP-FPM状态页路径/statusPHP-FPM健康检查路径/ping前提条件Nginx PHP-FPM 服务已正常部署并运行Zabbix Agent 2 已安装配置完成。二、启用PHP-FPM状态功能2.1 安装Nginx与PHP-FPM若尚未安装 Nginx 和 PHP-FPM可通过以下命令快速部署[roottomcat1 ~]# yum install -y nginx php php-fpm php-mysqlnd本文假设您已完成上述基础服务的安装与部署后续将重点聚焦于状态页的开启与监控配置。2.2 修改PHP-FPM配置文件PHP-FPM的状态页功能默认是关闭的需要手动开启。配置文件位于/etc/php-fpm.d/www.conf。开启状态页和健康检查页[roottomcat1 ~]# vi /etc/php-fpm.d/www.conf找到并修改以下两个配置项去掉前导分号;以取消注释; 状态页路径配置 pm.status_path /status ; 健康检查路径配置 ping.path /ping查看配置是否已生效[roottomcat1 ~]# cat /etc/php-fpm.d/www.conf | grep -E status_path|ping.path pm.status_path /status ping.path /ping配置说明pm.status_path指定状态页的访问路径默认为/status可根据需要自定义ping.path指定健康检查路径用于简单探测PHP-FPM是否存活如果不需要修改默认路径只需去掉注释即可2.3 修改后重启PHP-FPM服务配置修改完成后重启PHP-FPM使配置生效[roottomcat1 ~]# systemctl restart php-fpm三、配置Nginx访问PHP-FPM状态页PHP-FPM本身监听在9000端口但通常不直接对外暴露。我们需要通过Nginx反向代理的方式将状态页请求转发给PHP-FPM处理。3.1 修改Nginx配置文件编辑Nginx配置文件/etc/nginx/nginx.conf在需要访问的server段中添加以下location配置server { listen 80; listen [::]:80; server_name _; root /usr/share/nginx/html; # PHP动态请求转发 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; include fastcgi_params; } # PHP-FPM状态页和健康检查页配置新增部分 location ~ ^/(status|ping)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; include fastcgi_params; } }配置要点location ~ ^/(status|ping)$正则匹配/status和/ping路径fastcgi_pass指定PHP-FPM监听地址默认是127.0.0.1:9000SCRIPT_FILENAME需要指定到正确的网站根目录确保PHP-FPM能找到处理脚本3.2 重启Nginx服务检查配置正确后重启Nginx[roottomcat1 ~]# nginx -t nginx: configuration file /etc/nginx/nginx.conf test is successful [roottomcat1 ~]# systemctl restart nginx 或使用平滑重载 [roottomcat1 ~]# killall -HUP nginx四、PHP-FPM状态页指标详解4.1 访问状态页状态页支持多种输出格式默认纯文本、XML、JSON、HTML。默认纯文本格式[roottomcat1 ~]# curl http://127.0.0.1/status pool: www process manager: dynamic start time: 07/May/2023:16:32:36 0800 start since: 166 accepted conn: 12 listen queue: 0 max listen queue: 0 listen queue len: 511 idle processes: 4 active processes: 1 total processes: 5 max active processes: 1 max children reached: 0 slow requests: 0XML格式[roottomcat1 ~]# curl http://127.0.0.1/status?xml ?xml version1.0 ? status poolwww/pool process-managerdynamic/process-manager start-time1683448356/start-time start-since240/start-since accepted-conn14/accepted-conn listen-queue0/listen-queue max-listen-queue0/max-listen-queue listen-queue-len511/listen-queue-len idle-processes4/idle-processes active-processes1/active-processes total-processes5/total-processes max-active-processes1/max-active-processes max-children-reached0/max-children-reached slow-requests0/slow-requests /statusHTML格式[roottomcat1 ~]# curl http://127.0.0.1/status?html !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd html xmlnshttp://www.w3.org/1999/xhtml xml:langen langen headtitlePHP-FPM Status Page/title/head body table trthpool/thtdwww/td/tr trthprocess manager/thtddynamic/td/tr trthstart time/thtd07/May/2023:16:32:36 0800/td/tr trthstart since/thtd298/td/tr trthaccepted conn/thtd15/td/tr trthlisten queue/thtd0/td/tr trthmax listen queue/thtd0/td/tr trthlisten queue len/thtd511/td/tr trthidle processes/thtd4/td/tr trthactive processes/thtd1/td/tr trthtotal processes/thtd5/td/tr trthmax active processes/thtd1/td/tr trthmax children reached/thtd0/td/tr trthslow requests/thtd0/td/tr /table4.2 监控项指标详解指标类型说明监控意义pool静态FPM池子名称通常为www用于标识不同的进程池process manager静态进程管理方式static/dynamic/ondemand标识当前进程管理策略start time静态PHP-FPM启动时间服务重启后该值更新用于审计start since动态自启动以来的运行秒数监控服务运行时长accepted conn累计当前池子累计接受的请求数反映总请求量listen queue动态当前等待队列长度⚠️核心告警指标持续0说明进程不足max listen queue历史峰值等待队列历史最高值反映历史拥堵峰值listen queue len静态socket监听队列最大长度系统级排队容量上限idle processes动态空闲进程数反映剩余处理能力active processes动态活跃进程数正在处理请求反映当前并发处理中的请求数total processes动态总进程数 idle active当前进程池总规模max active processes历史峰值历史最大活跃进程数用于评估是否需要调整进程上限max children reached累计达到最大子进程数的次数⚠️核心告警指标0说明需调高进程上限slow requests累计慢请求累计数量⚠️ 反映PHP代码性能问题4.3 关键告警阈值建议监控项建议告警条件说明listen queue连续3次 0进程池已满请求开始排队max children reached最近5分钟内 0进程数上限不足需调整pm.max_childrenidle processes 2空闲进程即将耗尽slow requests1分钟内增量 10PHP脚本执行缓慢需排查代码active processes / total processes 80%进程池负载过高五、Zabbix模板配置与链接5.1 前提修改宏变量Zabbix官方提供了PHP-FPM by HTTP模板使用HTTP协议通过Zabbix Agent访问PHP-FPM状态页进行数据采集。操作步骤登录Zabbix Web管理界面进入数据采集Data collection→模板Templates搜索找到PHP-FPM by HTTP模板点击模板名称进入详情页切换到宏Macros选项卡如下图所示宏变量调整宏变量原值修改后说明{$PHP_FPM.HOST}localhost删除此宏删除后模板将使用主机接口地址{$PHP_FPM.PORT}8080Nginx端口保持不变{$PHP_FPM.SCHEME}httphttp协议类型保持不变{$PHP_FPM.STATUS.PATH}/status/status状态页路径保持不变为什么删除{$PHP_FPM.HOST}宏删除该宏后模板中的监控项将自动使用主机配置的接口IP地址使得该模板可以灵活复用到多台不同IP的服务器上无需为每台主机单独调整模板。5.2 修改监控项配置删除{$PHP_FPM.HOST}宏变量后模板中有两个监控项需要同步调整监控项一PHP-FPM: Get status page进入模板的监控项Items选项卡找到该监控项并修改如下图所示配置项修改内容键值Key从php-fpm.status[{$PHP_FPM.HOST},{$PHP_FPM.PORT},{$PHP_FPM.SCHEME},{$PHP_FPM.STATUS.PATH}]修改为php-fpm.status[{$PHP_FPM.PORT},{$PHP_FPM.SCHEME},{$PHP_FPM.STATUS.PATH}]或使用直接使用不带主机参数的格式依赖主机接口自动填充监控项二PHP-FPM: Get ping page同样在监控项列表中找到该监控项并修改如下图所示配置项修改内容键值Key移除{$PHP_FPM.HOST}参数修改后示例php-fpm.ping[{$PHP_FPM.PORT},{$PHP_FPM.SCHEME},/ping]修改效果经过上述调整后模板不再绑定特定主机IP任何应用该模板的主机只需配置好NginxPHP-FPM状态页Zabbix Agent即可通过主机接口IP自动获取状态数据实现模板的通用化复用。5.3 链接模板到主机完成宏变量和监控项调整后将模板链接到目标主机进入数据采集Data collection→主机Hosts选择目标主机192.168.38.28切换到模板Templates选项卡点击链接新模板Link new templates搜索并选择PHP-FPM by HTTP点击更新Update保存配置如下图所示5.4 验证监控数据模板链接完成后稍等片刻约1-2个采集周期验证数据是否正常进入监控Monitoring→最新数据Latest data筛选主机 192.168.38.28查看是否有PHP-FPM前缀的监控项数据或者使用Zabbix Server命令行快速测试# 获取PHP-FPM状态页内容 zabbix_get -s 192.168.38.28 -k php-fpm.status[80,http,/status] 获取PHP-FPM健康检查状态 zabbix_get -s 192.168.38.28 -k php-fpm.ping[80,http,/ping]六、常见问题排查6.1 状态页无法访问问题现象排查步骤访问/status返回404检查Nginx配置中location是否匹配确认配置已生效nginx -t systemctl reload nginx访问/status返回502 Bad Gateway检查PHP-FPM服务状态systemctl status php-fpm确认9000端口监听netstat -tlnp | grep 9000访问/status返回403或空白检查SELinux策略setsebool -P httpd_can_network_connect 1检查防火墙firewall-cmd --add-port80/tcp6.2 Zabbix模板无数据问题现象排查方向模板链接后无数据检查Zabbix Agent 2是否运行端口10050是否连通监控项显示不支持确认宏变量配置是否正确特别是端口号是否匹配Nginx监听端口数据采集超时检查网络延迟考虑调整Zabbix Agent超时时间6.3 常见配置错误对照# 检查PHP-FPM配置是否正确 grep -E pm.status_path|ping.path /etc/php-fpm.d/www.conf 检查Nginx配置是否正确 nginx -T 21 | grep -A5 status|ping 检查PHP-FPM服务状态 systemctl status php-fpm --no-pager 手动测试状态页在服务器本地 curl -s http://127.0.0.1/status | head -20七、PHP-FPM性能调优建议基于监控数据可以对PHP-FPM进行针对性的参数调优7.1 进程管理方式选择管理方式适用场景特点static高并发、流量稳定的生产环境固定进程数避免动态创建开销dynamic流量波动较大的通用场景推荐动态调整进程数灵活性好ondemand低流量、资源敏感环境按需创建最大限度节省内存7.2 核心参数调整建议# /etc/php-fpm.d/www.conf 常用优化参数 进程管理方式 pm dynamic 最大子进程数根据内存调整约20MB/进程 pm.max_children 50 起始进程数 pm.start_servers 10 最小空闲进程数 pm.min_spare_servers 5 最大空闲进程数 pm.max_spare_servers 20 最大请求数防止内存泄漏 pm.max_requests 500内存估算公式max_children ≈ (服务器总内存 - 系统预留内存) / 单个PHP进程平均内存占用结语通过本文的详细讲解我们完成了从PHP-FPM状态页开启、Nginx路由配置到Zabbix模板调整和主机链接的完整监控部署流程。核心要点回顾状态页是监控基础PHP-FPM内置状态页提供了丰富的进程池运行指标listen queue是关键告警该值持续大于0是进程池容量不足的直接信号max children reached是容量信号该值增长说明需要调高pm.max_children模板通用化改造删除主机宏变量可使模板在多主机间灵活复用在实际生产环境中建议将PHP-FPM监控与Nginx监控、应用性能监控APM结合形成完整的LAMP/LEMP应用可观测性体系。相关文章推荐《Zabbix监控Apache与Nginx应用实践》《Zabbix利用SNMP协议监控群晖NAS》如果文章对您有帮助欢迎点赞收藏如有疑问请在评论区留言交流。原创文章转载请注明出处。