本文目录导读:

为PHP项目配置服务器资源阈值告警,需要从硬件资源(CPU、内存、磁盘、网络)和应用层(PHP-FPM、数据库、慢查询、进程数)两个层面入手。
以下是一套标准化的配置方案,适用于Prometheus + Grafana、Zabbix 或 云厂商自带的监控服务。
核心资源告警阈值标准配置
CPU 使用率
- Warning(警告)阈值: 连续 5 分钟 > 75%
- Critical(严重)阈值: 连续 5 分钟 > 90%
- 备注: 对于高并发PHP应用(如使用Laravel/Symfony),CPU通常是一个主要瓶颈,需注意区分 用户态CPU(php-fpm执行业务逻辑)和 IOWait(等待磁盘读写)。
- 告警动作: 检查是否发生CC攻击、是否有慢代码、是否需要升级CPU规格或增加分布式部署。
内存使用率
- Warning: > 80%
- Critical: > 90%
- 重要指标(PHP特有): 监控 OOM Killer 事件,如果内存用尽导致系统杀死PHP-FPM进程,需立即告警。
- 告警动作: 检查
php-fpm.conf中的pm.max_children是否设置过大,或者是否存在内存泄漏(需配合memory_get_peak_usage日志)。
磁盘使用率
- Warning(数据盘): > 80%
- Critical(数据盘): > 90%
- 系统盘: > 85%(系统盘通常存放日志和PHP会话文件,一旦写满会导致服务完全停摆)
- 关键路径:
/var/log/(日志文件)/tmp/(PHP Session文件、临时上传文件)session.save_path配置的目录
- Inode 告警: 很多小文件(如Session、缓存碎片)会先耗尽Inode,阈值设置为 < 5% 可用。
- 告警动作: 清理日志(logrotate)、清理Session文件、检查是否有死循环写入文件。
网络带宽(出入流量)
- Warning: 使用率 > 70% (持续10分钟)
- Critical: 使用率 > 90%
- 告警动作: 检查是否被恶意流量攻击、是否正在进行大型文件传输/数据备份。
平均负载(Load Average)
- Warning: CPU核心数 * 0.7 (例如4核CPU,负载 > 2.8)
- Critical: CPU核心数 * 1.0 (4核 > 4.0)
- 备注: 负载高不一定直接等于CPU高,也可能是I/O瓶颈(大量磁盘读写导致进程无限等待)。
PHP 应用层关键告警(最重要)
这些是直接反映服务健康度的指标,比纯硬件阈值更关键。
PHP-FPM 状态监控(/status)
- 指标:
active processes(活跃进程数) 与max_children之比。- Warning: 活跃进程数 > 80% 的
max_children - Critical: 活跃进程数 > 95% 的
max_children(意味着新请求需排队等待)
- Warning: 活跃进程数 > 80% 的
- 指标:
listen queue(监听队列长度),如果该值长期不为0,表示服务器无法处理全部请求。- Critical: 队列长度 > 10
- 指标:
slow requests(慢请求数量),一旦出现,立即告警,代表有代码执行超时。
Nginx/Apache 错误率
- 指标: HTTP 5xx 错误率
- Warning: 过去5分钟内,5xx请求占比 > 1%
- Critical: 过去5分钟内,5xx请求占比 > 5%
- 指标: HTTP 4xx 错误率(主要关注404暴涨,可能代表扫描攻击)
PHP 慢日志阈值
- 配置: 在
php.ini中设置request_slowlog_timeout = 2s - 告警: 监控慢日志文件的行数变化速率,如果某分钟新增慢日志行数 > 阈值(如5行/分钟),立即告警。
- 原因: 这是定位PHP性能瓶颈最直接的手段,比如某个接口调用了耗时3秒的外网API。
MySQL / Redis 连接数
- PHP-FPM 与 数据库的连接: 如果PHP执行完毕未及时释放连接(导致连接池被占满),会导致新请求502/503。
- Warning: 当前连接数 > 80% 的
max_connections(MySQL)或maxclients(Redis) - Critical: 连接数 > 95%
Opcache 缓存命中率
- 指标:
cache_hits/ (cache_hits+cache_misses) - Warning: 命中率 < 95%
- Critical: 命中率 < 85%
- 原因: 命中率低意味着PHP缓存空间(
opcache.memory_consumption)不够,或PHP文件频繁变动导致缓存失效,导致大量重复编译,CPU飙升。
监控工具与配置示例
使用云厂商监控(阿里云/腾讯云/AWS)
- 设置方法: 在控制台找到“云监控” -> “报警规则管理”。
- 建议: 直接勾选预置模版(如“基础监控告警”),然后手动补充:
- 进程监控: 检查
php-fpm进程数量是否小于预期,如果进程数为0,触发紧急告警。 - 自定义脚本: 编写shell脚本,定期模拟
curl -I http://localhost/health_check,检查返回状态码是否为200,如果不为200,触发告警。
- 进程监控: 检查
使用 Prometheus + Grafana(开源方案,推荐中大型项目)
- 组件:
node_exporter(系统指标) +php-fpm_exporter(PHP-FPM指标) +nginx_prometheus_exporter/mysqld_exporter - 告警规则示例(PromQL):
# 核心告警:CPU使用率 > 80% - alert: HighCPUUsage expr: (100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80 for: 5m # PHP-FPM 队列深度过大 - alert: PHPFPMQueueOverflow expr: php_fpm_listen_queue > 10 for: 1m # 磁盘占用告警 - alert: DiskSpaceLow expr: (node_filesystem_avail_bytes{fstype!="tmpfs",mountpoint="/"} / node_filesystem_size_bytes{fstype!="tmpfs",mountpoint="/"} * 100) < 20
使用 Zabbix(传统监控)
- 模板: 导入官方
Template OS Linux by Zabbix agent和Template App PHP-FPM by Zabbix agent。 - 修改:
- 将触发器的阈值从上文中推荐的数字修改(例如修改CPU触发器的值)。
- 开启 PHP-FPM status page(修改
php-fpm.conf: pm.status_path = /status并配置Nginx允许访问)。
特殊情况与避坑指南
-
避免毛刺: 不要因为CPU瞬间冲到100%就告警(例如PHP代码中有一个1秒的
file_get_contents请求)。设置告警持续时间(例如连续3次采样都超标才告警),Prometheus 使用for: 5m来解决,Zabbix 可以在触发器设置N次。 -
连接数注意区分类型: PHP-FPM 在处理完一个请求后,不会主动断开 MySQL 连接(如果使用了持久连接
pconnect或连接池)。process.max设置为200,每个进程都持有一个MySQL连接,MySQL 连接数可能暴涨到 200 * N(多个服务器),告警阈值要结合实际情况调整。 -
Opcache 内存不足: 如果发现 CPU 一直较高,且 Opcache 缓存命中率低,不要只告警 CPU。应优先配置
opcache.memory_consumption(建议配置为 128M-512M 或更多),并设置opcache.revalidate_freq = 60来减少文件改变时的冲击。 -
日志磁盘告警的精细化管理:
- 不要只看 (根分区),要分别监控
/var/log、/tmp和 PHP日志目录。 - 限制日志文件大小(使用
logrotate配置size 100M,保留30天)。
- 不要只看 (根分区),要分别监控
总结配置清单
| 监控项 | 警告阈值 | 严重阈值 | 推荐实现方式 |
|---|---|---|---|
| CPU 使用率 | 75% (5min) | 90% (5min) | node_exporter / 云监控 |
| 内存使用率 | 80% | 90% | node_exporter |
| 磁盘 (/) 使用率 | 80% | 90% | node_exporter |
| 磁盘 (/var/log) 使用率 | 70% | 80% | node_exporter |
| 磁盘 Inode 使用率 | 95% | 98% | node_exporter |
| Load Average | 核心数 * 0.7 | 核心数 * 1.0 | node_exporter |
| PHP-FPM 活跃进程 | max_children * 0.8 | max_children * 0.95 | php-fpm_exporter |
| PHP-FPM 监听队列 | > 0 (持续1分钟) | > 10 | php-fpm_exporter |
| 慢日志新增行数 | > 5行/分钟 | > 20行/分钟 | 自定义脚本 (tail + wc) |
| HTTP 5xx 错误率 | > 1% (5min) | > 5% (5min) | nginx_exporter |
| Opcache 命中率 | < 95% | < 85% | php-fpm_exporter |
| 服务存活 (healthcheck) | 503/失败 | 503/失败 | 外部探针 (Blackbox Exporter) |
建议: 优先配置 服务存活(监控进程是否存在)、磁盘空间(最容易导致服务完全停摆)和 PHP-FPM 慢日志(最能指导开发者优化性能)。