知用网
霓虹主题四 · 更硬核的阅读氛围

Nagios告警设置教程:手把手教你配置实时监控提醒

发布时间:2026-01-18 06:21:31 阅读:299 次

为什么需要设置Nagios告警

公司服务器突然宕机,没人第一时间发现,等到用户投诉才处理,这种事在运维圈太常见了。Nagios作为老牌监控工具,核心价值不只是发现问题,而是及时通知你。光有监控不设告警,就像装了摄像头却不看回放。

下面以CentOS系统上的Nagios Core为例,一步步配置邮件告警,让你在服务异常时第一时间收到提醒。

确认基础环境和联系人配置

进入Nagios的配置目录,一般位于 /usr/local/nagios/etc/。打开 objects/contacts.cfg 文件,确保有一个可用的联系人定义:

define contact {
contact_name admin
alias 系统管理员
email admin@company.com
}

这个 contact_name 会在后续的服务告警中被引用。email 字段就是接收告警邮件的地址,务必填写正确。

启用邮件通知命令

查看 objects/commands.cfg 文件,确认是否存在名为 notify-by-email 的命令:

define command {
command_name notify-by-email
command_line /bin/mail -s "** $NOTIFICATIONTYPE$ $SERVICEDESC$ on $HOSTALIAS$ **" $CONTACTEMAIL$ << EOF
Host: $HOSTNAME$
State: $SERVICESTATE$
Time: $LONGDATETIME$
Info: $SERVICEOUTPUT$
EOF
}

如果系统没有安装 mailx 工具,需要先用 yum install mailx 安装,并配置SMTP转发,否则邮件发不出去。测试命令:echo "test" | mail -s "test mail" admin@company.com,能收到才算通。

为服务绑定告警规则

编辑你要监控的服务配置文件,比如 objects/localhost.cfg 或自定义的服务文件。在某个服务定义中加入 notification_options 和 contacts 字段:

define service {
use local-service
host_name localhost
service_description CPU Load
check_command check_load!5,4,3!10,8,6
notification_options w,c,r
contacts admin
}

这里的 w 表示警告(warning),c 是严重(critical),r 是恢复(recovery)。只要状态变化符合这些条件,就会触发通知。

调整告警频率和间隔

默认情况下,Nagios可能会频繁发送重复告警。在 contacts.cfg 中可以设置 notification_periodnotification_interval

define contact {
contact_name admin
alias 系统管理员
email admin@company.com
notification_period 24x7
notification_interval 60
}

上面的配置表示全天候接收通知,且故障持续期间每60分钟提醒一次。设为0则只在状态变化时通知一次。

重启Nagios并验证配置

改完配置别急着重启,先检查语法:

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

没有报错再执行重启:

systemctl restart nagios

接着手动模拟一个故障,比如停掉httpd服务,观察是否收到邮件。收到后说明链路打通了。

如果没收到,去 /usr/local/nagios/var/logs/nagios.log 查日志,看是通知没触发,还是邮件命令执行失败。

扩展:微信或钉钉告警怎么接

现在很多团队不用邮件,更喜欢钉钉或企业微信。原理一样——把原来的 mail 命令换成调用 webhook 的脚本。

比如写个 Python 脚本,接收告警信息并通过 requests 发到钉钉机器人。然后在 commands.cfg 里定义新命令:

define command {
command_name notify-by-dingtalk
command_line /usr/local/nagios/libexec/notify_dingtalk.py --text '$HOSTNAME$ - $SERVICEDESC$ is $SERVICESTATE$'
}

脚本权限要给足,测试通了再上线。这类集成在实际工作中特别实用,值班人员手机一震就知道该干活了。