You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian11下Nagios PHP-FPM状态检查插件失效求助

解决Debian 11下Nagios PHP-FPM检测插件失效问题

针对你在Debian 11部署多版本PHP-FPM(7.0/7.1/7.2)后,Shell脚本可正常运行但Nagios插件失效的问题,以下是核心排查方向和修复方案:

核心失效原因

Nagios插件运行时的环境与普通Shell环境存在差异,常见问题包括:

  • 权限不足:Nagios以nagios用户执行脚本,该用户可能无权限读取PHP-FPM pid文件、进程状态或访问status页面
  • 环境变量缺失:Nagios的PATH环境变量范围极窄,脚本中未使用绝对路径的命令(如ps/grep)可能无法找到
  • 退出码/输出格式不符合规范:Nagios依赖严格的退出码(0=OK、1=WARNING、2=CRITICAL、3=UNKNOWN)和状态前缀输出,不达标会被判定为失效
  • AppArmor限制:Debian 11默认启用的AppArmor可能限制nagios用户的进程读取或文件访问操作

排查与修复步骤

1. 验证脚本在nagios用户下的执行情况

直接模拟Nagios的运行环境,切换到nagios用户执行脚本:

su - nagios -s /bin/bash -c "/绝对路径/你的脚本.sh"

若执行报错,根据错误信息针对性修复:

  • 若提示"command not found":将脚本中所有命令替换为绝对路径(例如/bin/ps而非ps,/usr/bin/grep而非grep)
  • 若提示权限不足:将nagios用户加入www-data组(PHP-FPM pid文件通常归该组所有):
    usermod -aG www-data nagios
    
    同时确保pid文件(如/var/run/php/php7.0-fpm.pid)的组权限为可读:
    chmod g+r /var/run/php/*.pid
    

2. 修正脚本的Nagios规范兼容性

确保脚本输出以OK/WARNING/CRITICAL/UNKNOWN开头,并返回对应退出码。以下是适配多版本PHP-FPM的可靠检测脚本示例:

#!/bin/bash

# 定义要检测的PHP版本及对应pid文件路径
PHP_FPM_INSTANCES=(
    "7.0:/var/run/php/php7.0-fpm.pid"
    "7.1:/var/run/php/php7.1-fpm.pid"
    "7.2:/var/run/php/php7.2-fpm.pid"
)

critical_flag=0
status_msg=""

for instance in "${PHP_FPM_INSTANCES[@]}"; do
    php_ver=$(echo "$instance" | cut -d: -f1)
    pid_file=$(echo "$instance" | cut -d: -f2)

    # 检查pid文件是否存在
    if [ ! -f "$pid_file" ]; then
        status_msg="$status_msg PHP-FPM $php_ver: pid文件缺失; "
        critical_flag=1
        continue
    fi

    pid=$(cat "$pid_file")
    # 检查进程是否存活且状态正常(排除dead/killed状态)
    if ! /bin/ps -p "$pid" -o stat= | /usr/bin/grep -qE "^(R|S|D)"; then
        status_msg="$status_msg PHP-FPM $php_ver: 进程已死亡/被终止 (PID: $pid); "
        critical_flag=1
    fi
done

if [ $critical_flag -eq 1 ]; then
    echo "CRITICAL: $status_msg"
    exit 2
else
    echo "OK: 所有PHP-FPM进程运行正常"
    exit 0
fi

给脚本添加执行权限并归属nagios用户:

chmod +x /usr/lib/nagios/plugins/check_phpfpm_multi.sh
chown nagios:nagios /usr/lib/nagios/plugins/check_phpfpm_multi.sh

3. 检查AppArmor限制

若上述步骤无效,检查AppArmor是否限制了nagios的操作:

aa-status | grep nagios

若存在nagios相关的profile,可临时禁用测试:

aa-disable /etc/apparmor.d/usr.sbin.nagios3

确认问题后,修改AppArmor profile允许nagios读取/var/run/php/下的pid文件。

4. 核对Nagios命令配置

确保Nagios的命令定义使用脚本的绝对路径:

define command {
    command_name    check_phpfpm_multi
    command_line    /usr/lib/nagios/plugins/check_phpfpm_multi.sh
}

重启Nagios服务生效:

systemctl restart nagios

内容的提问来源于stack exchange,提问作者Tahina Ramahazomanana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:50:22