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文件通常归该组所有):
同时确保pid文件(如usermod -aG www-data nagios/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
相关产品推荐
相关产品推荐

