Nagios在运维圈子流传很久,不少人用久了反而不清楚它最核心的作用。简单来讲,它就是一套持续巡检服务器状态的监控程序。把Nagios部署在一台主机上,录入所有需要看管的服务器IP,程序每隔一段时间发起ping探测,一旦ping不通就推送告警消息。
搭建这套监控环境,至少准备两台设备。一台作为Nagios服务端,专门运行监控程序;另一台作为被监控对象,可以是服务器、路由器或者交换机,只要网络互通即可。系统选择比较灵活,Debian 12、Ubuntu、Rocky Linux 9都有人部署,挑自己熟悉的系统就行。官方软件源没有收录这些新版系统对应的安装包,大部分场景都需要源码编译安装。

编译前要先把依赖包安装齐全。Debian系列系统,apache2、php、libgd-dev、build-essential属于必备组件,一条apt install命令就能一次性装好。下载Nagios Core源码压缩包,解压目录,执行configure配置,再运行make all编译。之后依次执行make install-groups-users创建nagios用户和用户组,make install部署核心程序文件,make install-commandmode开启外部程序调用Nagios命令的权限。最后把apache用户加入nagios用户组,否则Web页面无法读取配置文件。
Web界面部署完成后,使用htpasswd工具为nagiosadmin账号设置登录密码,浏览器访问服务端IP就能打开监控面板。刚装好的时候面板只显示监控服务器自身,想要监控其他主机,还需要继续添加配置。
监控远程主机,Nagios原生方式就是主动ping目标IP。对应的核心指令是check-host-alive,写在commands.cfg文件内,底层调用的插件为check_ping。默认参数:-w 3000.0,80% -c 5000.0,100% -p 5,含义是往返延迟超过3000毫秒或者丢包率达到80%触发警告;延迟超过5000毫秒或者丢包率100%触发严重告警,一共发送5个ping包。这些数值可以根据实际网络调整,内网环境可以收紧阈值,跨机房监控就要放宽。
只有探测命令还不够,需要在配置文件定义host对象,告知Nagios要监控哪一台设备。在/usr/local/nagios/etc/objects/目录新建.cfg配置文件,写入define host配置块,填写host_name、alias、address,check_command指定为check-host-alive。打开nagios.cfg,通过cfg_file引入这个新建配置文件,重启Nagios服务,Web界面就会新增这台主机状态。状态持续显示PENDING属于正常现象,等待片刻完成首次检测即可。
检测间隔和重试次数,直接影响故障告警的灵敏程度。check_interval代表主机正常时的检测周期,默认五分钟一次。retry_interval是检测失败后的重试间隔,默认一分钟。max_check_attempts这个参数很关键,它定义连续多少次检测失败,Nagios才会把主机状态从UP切换成DOWN。常规设置范围3到10次,数值太小容易误告警,网络轻微波动就推送大量消息;数值太大故障发现滞后,设备宕机很久才收到通知。举个例子,正常间隔5分钟,重试间隔1分钟,max_check_attempts设为3,主机掉线到产生告警大概七八分钟,这个节奏适合多数场景。
网络层面有个很常见的坑。Nagios服务端和目标主机中间有路由器或者防火墙时,ICMP报文有可能被拦截,现象就是Nagios标记主机DOWN,但我们本地手动访问目标设备却正常。优先去目标主机核对防火墙是否放行ICMP,也可以在Nagios中将check-host-alive替换成check_tcp,用目标主机开放的端口做存活探测。还有一种情况,主机ping可以通,但上面某个服务停止运行,Nagios会判定主机状态正常,只单独上报服务故障,不会把整台主机标记为故障。
告警接收渠道同样需要配置。Nagios原生依靠邮件推送通知,相关配置在contacts.cfg文件,填写contact_name和邮箱地址,在host配置块引用对应的contact_groups。邮件通知生效前提是服务器具备发信能力,需要安装Postfix或者sendmail。不想搭建邮件服务,也可以对接短信网关或者企业微信Webhook,不过这类方案要额外编写通知脚本,属于进阶操作。
很多新手会混淆Web界面里主机UNREACHABLE和DOWN两种状态。DOWN代表Nagios确认目标主机本身故障;UNREACHABLE意思是通往目标主机的网络链路中断,比如中间路由器宕机。想要区分这两种状态,host配置块需要添加parents参数标注网络拓扑,写明每台设备的上游节点。不配置parents,所有无法连通的主机统一显示DOWN,告警缺少链路判断信息,排查故障会更费时间。