本文目录导读:

监控线上PHP项目的运行状态,是运维和开发的核心工作,一个完善的监控体系通常包含应用层、系统层和业务层三个维度。
以下是一套从入门到进阶的监控方案,按推荐程度和实用性排序:
核心监控指标(知道要监控什么)
在搭建工具之前,先明确需要关注哪些数据:
- 错误率 (Error Rate):HTTP 500错误、PHP Fatal Error、Exception抛出频率。
- 响应时间 (Latency):P99、P95、P50的请求响应时长。
- 吞吐量 (Throughput):QPS(每秒查询数)或RPS(每秒请求数)。
- 资源消耗:
- CPU使用率
- 内存使用率(特别是内存泄漏)
- PHP-FPM进程数(是否达到
pm.max_children) - 磁盘IO(特别是日志写入)
- 慢查询:数据库慢SQL(通常由PHP调用产生)。
- 外部依赖:调用Redis、MySQL、第三方API的成功率和延迟。
主流监控方案
方案1:使用「应用性能监控」工具(最推荐,全链路)
这是目前最成熟的做法,能自动发现代码级别的性能瓶颈。
- SkyWalking(开源,Apache顶级项目):
- 原理:通过PHP扩展(SkyAPM)自动注入探针,无需修改代码。
- 能力:自动追踪每个请求的调用链(Nginx -> PHP -> MySQL/Redis),展示每个函数的耗时、数据库语句、HTTP请求参数。
- 适用场景:中等以上规模、复杂的微服务架构。
- OpenTelemetry + Jaeger/Zipkin:
- 原理:行业标准协议,配合PHP SDK(如
open-telemetry/opentelemetry-php)。 - 能力:高度可定制,数据可导出到多种后端,适合对数据主权要求高的团队。
- 原理:行业标准协议,配合PHP SDK(如
- 商业SaaS(DataDog、New Relic、听云、OneAPM):
- 优势:开箱即用,UI美观,报警规则完善。
- 劣势:费用较高,敏感业务可能需要考虑数据外泄风险。
方案2:经典组合(Prometheus + Grafana)
对于愿意投入一定运维成本、追求高度自定义的团队,这是标准答案。
- 数据采集:
- php-fpm_exporter:专门采集PHP-FPM状态(活跃进程数、空闲进程数、请求等待队列等)。
- Nginx Exporter:采集Nginx状态(连接数、请求速率)。
- Node Exporter:采集服务器CPU、内存、磁盘、网络。
- 自定义Exporter:使用
prometheus/client-php库,在代码中埋点,上报业务指标(如:下单成功率、注册用户数)。
- 数据存储与展示:Prometheus(存储+告警)+ Grafana(可视化)。
- 优点:完全免费、数据精确、可扩展性强。
- 缺点:需要手动配置和理解PromQL语法。
方案3:轻量级/传统方案
适合小团队、单机部署、或者不想引入太重的基础设施。
- PHP-FPM 内置状态页:
- 在Nginx配置中,允许访问
/status路径。 - 可以获取:
accepted connections、active processes、idle processes、max children reached(重要,表示进程数不够)。
- 在Nginx配置中,允许访问
- 日志监控(ELK/EFK):
- 将所有PHP错误日志、访问日志统一收集到Elasticsearch。
- 在Kibana中设置报警(某个错误类型5分钟内出现超过100次)。
- 工具:Filebeat(客户端)+ Logstash(加工)+ Elasticsearch(搜索)+ Kibana(图表)。
- 运维监控工具:
- Zabbix:老牌监控,通过Agent采集系统指标,并支持自定义脚本检查PHP-FPM进程或端口。
- 心跳检测:写一个简单的健康检查脚本,定期访问一个指定URL(如
health.php),返回200+简单内容,被外部监控系统(如UptimeRobot、阿里云云监控)轮询。
实战配置步骤(以 Prometheus + Grafana 为例)
假设你已经有一台运行PHP的服务器。
-
启用 PHP-FPM 状态页: 修改
www.conf或php-fpm.d/下的配置:pm.status_path = /status
重启PHP-FPM,然后在Nginx中配置别名,仅允许内网访问:
location ~ ^/(status|ping)$ { fastcgi_pass unix:/run/php/php8.1-fpm.sock; include fastcgi_params; allow 127.0.0.1; deny all; }测试:
curl http://127.0.0.1/status应返回数据。 -
搭建 Prometheus + Grafana(可参考官方文档,较简单)。
-
部署 php-fpm_exporter: 下载二进制文件,运行:
./php-fpm_exporter --fpm.endpoint=http://127.0.0.1/status
它会在
9253端口暴露Prometheus指标。 -
配置 Prometheus: 在
prometheus.yml中添加Job:- job_name: 'php-fpm' static_configs: - targets: ['你的服务器IP:9253'] -
可视化: 在Grafana中导入面板ID 3909(一个知名的PHP-FPM仪表盘),即可看到实时进程数、请求速率、慢连接数等。
重要且易忽视的监控点
- Swoole/Workerman 常驻进程:
- 不能只监控FPM,要监控Worker进程的内存增长(
memory_get_usage()持续增大是内存泄漏),以及进程是否意外退出(Supervisor重启次数报警)。
- 不能只监控FPM,要监控Worker进程的内存增长(
- Opcache 状态:
- PHP脚本是纯解释型,Opcache命中率直接影响性能。
- 监控
opcache_get_status(false)['opcache_statistics']中的misses、hits、memory_usage。 misses突然升高,说明Opcache文件被清空或未生效,QPS可能瞬降。
- 会话 (Session) 存储:
- 如果Session存储在文件且使用了NFS挂载,务必监控NFS的IO延迟。
- 如果存储在Redis,要监控Redis的连接数,防止PHP进程过多导致Redis连接耗尽。
总结与建议
| 你的团队/项目规模 | 建议方案 |
|---|---|
| 初创/小项目(<10台服务器) | 日志监控(ELK) + PHP-FPM状态页 + 外部健康检查,简单、低成本。 |
| 中型项目(10-100台服务器) | Prometheus + Grafana + php-fpm_exporter + 自定义业务指标,标准、可靠。 |
| 大型/复杂/微服务项目 | SkyWalking + ELK,追求全链路追踪,快速定位跨服务问题。 |
| 不想自己运维基础设施 | 购买商业APM服务(DataDog/听云),用钱换时间,适合聚焦业务的团队。 |
最后一步:告警 无论你选择了哪个方案,都要设置告警,核心告警规则:
- 错误率 > 1%(5分钟内)。
- PHP-FPM active processes > 80%
pm.max_children。 - 任意接口P99响应时间 > 2秒。
- 服务器磁盘使用率 > 90%。