PHP-FPM 性能监控脚本
监控PHP-FPM进程池状态,包括活跃进程数、空闲进程数、慢请求统计和内存占用,超过阈值时发送告警。
监控脚本
#!/bin/bash
# php_fpm_monitor.sh
FPM_CONF="/etc/php-fpm.d/www.conf"
FPM_SOCK="/run/php-fpm/www.sock"
# 获取PHP-FPM状态
get_fpm_status() {
if [ -S "$FPM_SOCK" ]; then
# 通过Unix socket获取status
SCRIPT_NAME=/status \
SCRIPT_FILENAME=/status \
QUERY_STRING="" \
REQUEST_METHOD=GET \
cgi-fcgi -bind -connect "$FPM_SOCK" 2>/dev/null
else
curl -s http://127.0.0.1:8080/status 2>/dev/null
fi
}
# 解析并检查
STATUS=$(get_fpm_status)
if [ -z "$STATUS" ]; then
echo "CRITICAL: 无法获取PHP-FPM状态"
exit 2
fi
# 提取关键指标
ACTIVE=$(echo "$STATUS" | grep "active processes" | awk '{print $NF}')
IDLE=$(echo "$STATUS" | grep "idle processes" | awk '{print $NF}')
TOTAL=$(echo "$STATUS" | grep "total processes" | awk '{print $NF}')
SLOW=$(echo "$STATUS" | grep "slow requests" | awk '{print $NF}')
# 获取最大子进程数
MAX_CHILDREN=$(grep "pm.max_children" "$FPM_CONF" 2>/dev/null | awk -F= '{print $2}' | tr -d ' ')
MAX_CHILDREN=${MAX_CHILDREN:-50}
# 计算使用率
USAGE_PERCENT=$((ACTIVE * 100 / MAX_CHILDREN))
echo "=== PHP-FPM 状态 ==="
echo "活跃进程: $ACTIVE / $MAX_CHILDREN (${USAGE_PERCENT}%)"
echo "空闲进程: $IDLE"
echo "总进程: $TOTAL"
echo "慢请求: $SLOW"
echo ""
# 检查PHP-FPM内存占用
echo "=== PHP-FPM 内存占用 ==="
TOTAL_MEM=$(ps -ylC php-fpm --sort:rss | awk '{sum+=$8} END {printf "%.0f MB\n", sum/1024}')
AVG_MEM=$(ps -ylC php-fpm --sort:rss | awk 'NR>1 {sum+=$8; count++} END {printf "%.0f MB\n", sum/count/1024}')
PROC_COUNT=$(pgrep php-fpm | wc -l)
echo "进程数: $PROC_COUNT"
echo "总内存: $TOTAL_MEM"
echo "平均内存/进程: $AVG_MEM"
echo ""
# 告警判断
ALERT=0
if [ "$USAGE_PERCENT" -gt 80 ]; then
echo "WARNING: PHP-FPM进程使用率 ${USAGE_PERCENT}% > 80%"
ALERT=1
fi
if [ "$SLOW" -gt 10 ]; then
echo "WARNING: 慢请求数 ${SLOW} > 10"
ALERT=1
fi
exit $ALERT
配置PHP-FPM状态页
; 在 /etc/php-fpm.d/www.conf 中添加
pm.status_path = /status
ping.path = /ping