Nagios作为老牌开源监控系统,其设计哲学强调灵活性与可扩展性,核心并不在于界面华丽,而在于一套严谨的对象模型与调度机制。要掌握Nagios监控核心概念,首先要明白它并不是一个单一的大程序包办所有事情,而是由主进程、插件、配置文件共同构成的协作体系。主进程只负责读懂配置、按周期发起检查、接收外部结果并触发通知,真正的探测动作全部委托给外部命令完成。

Nagios守护进程与对象配置模型
在Nagios的运转中,nagios守护进程是绝对的中枢。它启动后会解析所有cfg文件,把主机、服务、联系人、时间周期等定义加载进内存,形成一张对象关系图。比如一台交换机在配置里被写成<host>对象,而依附于它的连通性检测则是一个<service>对象,服务必须绑定到具体主机上,这种从属关系决定了检测调度和告警归属。
配置模型里最容易被忽视的是模板继承机制。通过define host利用name和use字段,运维可以抽象出通用属性,再让具体设备继承。这样当某类服务器的检测间隔需要调整时,只需改模板而无需逐个文件修改。下面是一段简化配置,展示主机模板与服务如何关联:
define host{
name linux-server
use generic-host
check_period 24x7
check_interval 5
register 0
}
define host{
use linux-server
host_name web01
address 192.168.0.1
}
define service{
use generic-service
host_name web01
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}
这种声明式配置虽然初看繁琐,但带来了极高可读性。当系统规模扩大,配合cfg_dir自动递归加载,可以有效分离环境配置。不过要注意,对象名全局唯一,重复定义会导致守护进程启动失败,因此团队内部需要约定命名规范。
主动检测、被动检测与check_command机制
主动检测是Nagios最典型的玩法:守护进程按照check_interval定时调用check_command指向的插件,例如check_ping或check_http,插件退出时返回数字状态码和一行文本。0代表正常,1警告,2严重,3未知。这个状态码直接决定服务在WEB界面上的颜色与是否通知。
被动检测则用于无法由中心服务器主动轮询的场景,比如分布式节点通过send_nsca把结果推给Nagios。此时配置里要将active_checks_enabled置为0,passive_checks_enabled置为1。被动模式减轻了中心节点压力,但要求推送端自身可靠,否则会出现静默失效。下面代码演示一个最简单的主动检测插件写法,用shell返回状态:
#!/bin/bash
# 简单检查磁盘使用率
usage=$(df / | awk 'NR==2{print $5}' | sed 's/%//')
if [ $usage -lt 80 ]; then
echo "OK - 磁盘使用 ${usage}%"
exit 0
elif [ $usage -lt 90 ]; then
echo "WARNING - 磁盘使用 ${usage}%"
exit 1
else
echo "CRITICAL - 磁盘使用 ${usage}%"
exit 2
fi
check_command本身在配置中只是字符串,真正执行时Nagios会拼装命令定义里的argv。命令定义与插件路径分离,使得同一插件可复用于不同阈值。例如check_ping!100.0,20%!500.0,60%中感叹号分隔参数,分别对应RTA和丢包率的警告与严重阈值。理解这种传参方式,是排查误报的关键。
状态流转、通知逻辑与依赖抑制
当一次检测返回非0状态,Nagios不会立刻发邮件,而是先经过soft state与hard state的多次确认。默认max_check_attempts为3,连续三次同样异常才升级为硬状态并触发通知。这能有效过滤瞬断造成的骚扰。状态变化还会写入retention文件,重启后保持已知状态。
通知逻辑由contact、contactgroup以及notification_period控制。可以针对数据库主机只在工作时间通知DBA,夜间交给值班手机。更进一步的抑制靠hostdependency与servicedependency实现,比如核心路由宕机时,其下所有服务器ping失败不应各自报警,而只报上层故障。配置依赖的片段如下:
define servicedependency{
dependent_host_name web01
dependent_service_description PING
host_name core-router
service_description PING
execution_failure_criteria n
notification_failure_criteria w,u,c
}
除了上述机制,Nagios的事件处理程序(event_handler)也属核心概念,它允许在状态变更时自动跑脚本尝试重启服务。综合来看,Nagios的核心是一套以对象为中心、以状态机为驱动、以插件为触手的监控哲学。吃透这些概念,才能在复杂环境中写出既灵敏又安静的告警规则。
Nagios监控架构check_command修改时间:2026-08-14 15:24:27