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

Nagios通过Postfix中继SMTP发邮件未读取contacts.cfg配置问题

解决Nagios邮件告警不读取contacts.cfg配置的问题

我之前帮同事排查过几乎一模一样的情况——配置了Postfix中继,也改了commands和contacts配置,但Nagios就是死活不用自定义邮箱,反而默认发件人是<oem>。结合你给出的Postfix日志(uid=1002 from=<oem>),下面是几个最可能的排查和修复方向:

1. 先确认Nagios真的在加载你的contacts.cfg

打开Nagios主配置文件nagios.cfg,检查有没有正确包含contacts.cfg的路径:

vi /usr/local/nagios/etc/nagios.cfg

找cfg_file或cfg_dir配置项,必须有类似这样的行:

# 直接指定文件
cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
# 或者加载整个目录(如果contacts.cfg在这个目录里)
cfg_dir=/usr/local/nagios/etc/objects

如果没找到,手动添加后重启Nagios:

systemctl restart nagios

很多人都会忽略这一步——Nagios不会自动加载所有.cfg文件,必须明确指定。

2. 检查contacts.cfg的语法和配置正确性

Nagios对配置语法的要求极其严格,哪怕一个括号漏写、参数拼错,整个文件都会被忽略。用自带的校验工具扫一遍:

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

如果输出里有contacts.cfg相关的错误,比如Missing closing '}'或者Invalid contact directive,先把这些错误修复。重点检查:

  • 联系人定义里的email参数是否正确:
    define contact {
        contact_name                    nagiosadmin
        use                             generic-contact
        alias                           Nagios Admin
        email                           your-alert-mail@example.com  # 这里必须是你要用来发告警的邮箱
    }
    
  • 对应的主机/服务模板里,有没有把这个联系人加入contact_groups或者contacts配置项,不然告警根本不会触发到这个联系人。

3. 确认commands.cfg里的邮件命令用对了变量

你在commands.cfg里定义的邮件命令,必须正确引用$CONTACTEMAIL$变量,这个变量会自动从contacts.cfg里拉取对应联系人的邮箱。比如标准的邮件告警命令应该是这样:

define command {
    command_name    notify-host-by-email
    command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/bin/mailx -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$
}

如果这里写成了固定邮箱(比如admin@example.com),或者变量名写错(比如少了一个$,写成CONTACTEMAIL),Nagios就会用默认的发件人。

4. 检查Nagios用户的权限和邮件工具可用性

Postfix日志里的uid=1002应该是运行Nagios的用户(一般是nagios),先确认这个用户能读取contacts.cfg:

ls -l /usr/local/nagios/etc/objects/contacts.cfg

确保文件的所有者/组是nagios,权限至少是644。然后切换到nagios用户手动测试发邮件,排除邮件工具的问题:

su - nagios
echo "Test Nagios Alert" | mailx -s "Test Mail" your-alert-mail@example.com

如果测试邮件能正常收到,说明Postfix中继和邮件工具都没问题,问题还是出在Nagios的配置加载上。

5. 查看Nagios自身的日志找线索

除了Postfix日志,一定要看Nagios的运行日志(默认路径是/usr/local/nagios/var/nagios.log),里面会有配置加载失败、联系人未关联的详细错误,比如:

[1521985205] Error: Could not find contact 'nagiosadmin' in host notification list for host 'localhost'!

这类日志能直接定位到问题,比如联系人没被正确绑定到主机或服务的告警规则里。

最后验证

修复完所有问题后,先再跑一遍配置校验:

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

确认没有错误后重启Nagios,然后手动触发一个测试告警(比如把某个服务停掉),再看Postfix日志,应该就能看到from=<your-alert-mail@example.com>,而不是<oem>了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:15:19