Nagios安装、配置、问题记录

本文描述了我在使用Nagios的过程中遇到的一些问题、解决办法以及总结的注意事项。文章很长,请使用Ctrl+F5定位到你需要的部分。

Nagios是一套强大的监控报警系统,但是你不花一些时间,是绝对不可能很好地配置它的。除非你只需要监控主机的alive等简单的情况(例如ping),否则请放弃幻想,以极大的耐心去研究它吧。


(1)默认安装情况下,Nagios的主配置文件为:/usr/local/nagios/etc/nagios.cfg

打开这个文件,可以清楚地看到它指定了其他的配置文件:

cfg_file=/usr/local/nagios/etc/objects/commands.cfg

cfg_file=/usr/local/nagios/etc/objects/contacts.cfg

cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg

cfg_file=/usr/local/nagios/etc/objects/templates.cfg

所以你要注意了,不要以为“objects”目录下的只是示例文件而已,它们默认被当作了 实际上使用的配置文件,你不需要麻烦地拷贝一份出来到 /usr/local/nagios/etc/ 目录下再修改,直接修改这些配置文件就好了。

文章来源:http://www.codelast.com/

(2)“Map”、“Trends”功能无法使用,错误提示为:

The requested URL /nagios/cgi-bin/statusmap.cgi was not found on this server.

The requested URL /nagios/cgi-bin/trends.cgi was not found on this server.

是因为编译Nagios的时候没有编译出相应的CGI文件(默认安装时,在 /usr/local/nagios/sbin/ 目录下)。编译依赖项:

libgd

libgd-devel

libpng

libpng-devel

libjpeg

libjpeg-devel

zlib

zlib-devel

查询安装情况:

rpm -qa | grep zlib

其中gd的两个包名分别类似于:

gd-2.0.33-9.4.el5_1.1.x86_64.rpm

gd-devel-2.0.33-9.4.el5_1.1.x86_64.rpm

安装相应的RPM包后,重新编译安装Nagios:

./configure –with-gd-lib=/usr/lib –with-gd-inc=/usr/include

make all

make install

文章来源:http://www.codelast.com/

(3)重新编译安装Nagios(configure、make all、make install)不用担心配置文件会丢失,因为make install只会把Nagios主程序、CGI、HTML给安装上。


(4)如果你在define service的时候,使用了一个模板,例如:

use    local-service         ; Name of service template to use

那么你可以在这个service中覆盖模板里的配置。例如,模板里设置了:

notifications_enabled           1

你却可以在这个service中设置:

notifications_enabled           0

这样,对这个service来说,触发条件时也不会报警的。


(5)报警邮件通过sendmail发不出去?请查看邮件日志文件(/var/log/maillog)的内容查找原因。当然,最好用mail试一下:

mail -v yourmail@abc.com

然后依次输入邮件的标题、正文以及抄送地址,回车发送!然后再去邮件日志文件里看日志,是成功了还是失败了,分析原因。


(6)如果配置了短信发送报警信息,但是却收不到短信,我要提醒你的是:

①在define command的地方,command_line里写的发送报警短信的命令行中,用于发送报警短信的程序要写全路径,例如/usr/local/bin/sendsms,不要以为写一个“sendsms”就可以了,尽管你在Linux命令行下可以找到这个命令(因为它在/usr/local/bin/目录下),但是对Nagios来说,它却找不到,所以要写全路径。这个规律我是试验发现的,至于是不是普遍现象,或者是不是所有版本的Nagios都是这样,我不知道,我只是通过试验知道这样能解决问题。

②短信接口的70个字符限制,有时候超过了是发不出短信的!请确认你的短信接口允许的单条短信字符数限制。

文章来源:http://www.codelast.com/

(7)在montoring server上执行命令:

/usr/local/nagios/libexec/check_nrpe -H 192.168.17.2 -c check_disk

提示错误:NRPE: Command 'check_disk' not defined

这是因为没有配置好两端的NRPE和Nagios,使得monitoring server不能远程执行check_disk命令。

被监控服务器端,需要修改nrpe.cfg文件:

dont_blame_nrpe=1

这将允许命令带参数执行。

另外,在nrpe.cfg文件的最后,原来有几行注释掉的内容:

#command[check_users]=/usr/local/nagios/libexec/check_users -w $ARG1$ -c $ARG2$

#command[check_load]=/usr/local/nagios/libexec/check_load -w $ARG1$ -c $ARG2$

#command[check_disk]=/usr/local/nagios/libexec/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$

#command[check_procs]=/usr/local/nagios/libexec/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$

把它们取消注释。处于注释状态的话,NRPE当然找不到这些命令了。

修改完之后,需要重启服务:

service xinetd restart


(8)错误“CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages.”的解决:

这篇文章详细地讲解了解决办法:Nagios: How to Enable check_nrpe Command Line Arguments

看完之后你可能很后悔你没有早看到这篇文章吧?没错,和我一样,要重新编译安装NRPE,不过配置Nagios、NRPE的过程就是这样,折腾来折腾去,不费点劲是解决不了问题的。


(9)在Nagios中,你会看到类似于“RTA = 455.04 ms”的数据,RTA是什么呢?引用网上的话作答:Round Trip Average. The average time it took to receive a response to your ping packets.


(10)在Nagios中,检测时间周期默认是以分钟为单位的,例如“normal_check_interval”的值为5时,代表正常检测周期为5分钟。假设你想以5秒钟检测一次,怎么办?这时候你需要修改配置文件nagios.cfg中的“interval_length”参数的值,默认值为60,代表基数是60秒,你改成1,代表基数是1秒,这时,“normal_check_interval”的值为5就表示正常检测周期为5秒了。请注意,把“interval_length”的值修改以后,所有其他和周期有关的地方你都要检查一遍,保证都被更改为了正确的数值,否则到时就全乱套了。


(11)在Nagios中使用自定义变量:

很简单:无论是在host,service还是contact定义中,要添加一个自定义的变量,只需要以下划线开头就可以了,例如:_my_custom_var为一个在host定义中的自定义变量,则在其他地方,要使用这个变量的话,其宏名为_HOSTMY_CUSTOM_VAR,也就是说,Nagios在不仅将你的变量名转换成了大写,而且在前面加了一个“_HOST”。如果是service或contact中的自定义变量的话,则Nagios会分别添加“_SERVICE”或“_CONTACT”到宏名前。

文章来源:http://www.codelast.com/

(12)如果你在用 /usr/local/nagios/bin/nagios -v nagios.cfg 命令检测你所编写的Nagios配置文件的正确性的时候,得到了以下警告提示:

Warning: Service 'XXX' on host 'XXX'  has a notification interval less than its check interval!  Notifications are only re-sent after checks are made, so the effective notification interval will be that of the check interval.

那么很明显,就是你设置的某项service中的 notification_interval 值比 normal_check_interval 值大导致的了。normal_check_interval 是正常的检测周期,例如10分钟检测一次,20分钟检测一次这样的周期,而 notification_interval 看网上的很多文章,说它是发生故障之后的报警周期,例如该值设置成30分钟就表示发生故障之后每30分钟会报一次警。但是 notification_interval 为什么不能比 normal_check_interval 值要小呢?我完全可以让某个service一小时才检测一次,但是发生故障之后每1分钟报一次警啊!反正我是没想明白,或者是我对它们的含义理解有误,还需要进一步斟酌。


(13)在被监控的服务器上安装NRPE后,在配置文件 /etc/xinetd.d/nrpe 中,可以设置允许哪些IP地址访问NRPE daemon,例如:

only_from       = 127.0.0.1

表示只有本机可以访问。为了能让多台远程Nagios可以监控此台服务器的状况,可以在此处添加多个IP地址,中间以空格隔开,例如

only_from       = 192.168.1.188 58.30.200.199

表示允许192.168.1.188和58.30.200.199这两个IP访问本机上的NRPE daemon。

保存之后,要重启服务:

service xinetd restart

另外再说一句,在NRPE的配置文件 /usr/local/nagios/etc/nrpe.cfg 中,有一个“allowed_hosts=”的选项,可以设置允许哪些IP地址访问,但是要注意了,文件里面的注释写得清清楚楚:

NOTE: This option is ignored if NRPE is running under either inetd or xinetd

也就是说,如果NRPE是运行在在 inetd 或 xinetd 下运行的话,这个选项就被忽略了!所以,我个人觉得最好是在 /etc/xinetd.d/nrpe 中设置允许访问的IP。

文章来源:http://www.codelast.com/

(14)如果你通过NRPE检测一个远程服务,可以先在Nagios主机上通过以下命令执行一下:

/usr/local/nagios/libexec/check_nrpe -H 远程主机IP -c 远程检测命令 -a 命令行参数

如果返回的结果是这样的:

Received 0 bytes from daemon. Check the remote server logs for error messages.

那么你就要按这个提示,到被监控的主机上查看日志,看看是出了什么错:

tail -20 /var/log/messages

然后根据错误记录来解决问题。


(15)“performance data”有两个,一个是$HOSTPERFDATA$,另一个是$SERVICEPERFDATA$,当你在报警邮件中要带上performance data信息时,千万不要漏了,要不然可能看不到你想要的信息。


(16)如果你在Nagios监控系统的web界面中点进去一个service,然后点击“Disable notifications for this service”,这就可以直接禁用该对服务的报警,不过,在web界面中禁用某服务的报警,并不会对配置文件造成影响,也就是说,你在配置文件中设置了某服务的“notifications_enabled”值为1,那么就算你在web界面中禁用了其报警,配置文件中仍然会是1。不仅如此,就算你重启了Nagios服务(service nagios restart),在web界面中禁用的报警仍然会是禁用状态,也就是说Nagios把你在web界面上的操作记录在某个地方了(不是配置文件中)。这一点要特别注意,有时候收不到报警信息,而配置文件中的报警全都打开了,这时你就要去web界面里查看各项设置了。


(17)在commnads.cfg中定义的一个远程执行的命令(通过NRPE来执行),如果用 -t 参数指定了命令执行的超时时间(例如-t 500指定了超时时间为500秒),但是还是经常会收到错误报警:NRPE: Command timed out after 60 seconds。

这是怎么回事呢?在NRPE的文档中写得很清楚:

The check_nrpe plugin returns "NRPE: Command timed out after x seconds"

This error indicates that the command that was run by the NRPE daemon did not finish executing within the specified time.  You can increase the timeout for commands by editing the NRPE configuration file and changing the value of the command_timeout variable.  If you're running the NRPE daemon as a standalone daemon (and not under inetd or xinetd), you'll need to restart it in order for the new timeout to be recognized.

可见,要修改这个超时时间,在Nagios命令定义文件commands.cfg中通过 -t 参数指定是无效的,因为 -t 参数指定的是连接的超时时间,而不是NRPE的命令执行超时时间。必须要修改NRPE的配置文件nrpe.cfg中的“command_timeout”参数值(默认值为60秒)才有用,如果你要修改为5分钟,应该这样改:

command_timeout=300

文章来源:http://www.codelast.com/

(18)如果要监控Widows的服务器,需要在Windows服务器上安装NSClient++这个软件,详细的设置可看这个链接。在这里我简要地描述一下:安装NSClient++的过程中,需要设置允许访问的IP地址,这个地址就是Nagios监控服务器的地址;然后还需要设置一个密码,这个密码就是Nagios监控服务器访问这台Windows上的NSClient时要提供的密码(如果没有密码就能取数据,那太不安全了)。安装好之后,启动NSClient的服务,并且在服务属性设置中勾上“Allow service to interact with desktop”的选项,然后Windows上的设置就算完成了,然后就到设置Nagios服务器了:

在commands.cfg文件中,定义检测Windows服务器的命令:

define command{

        command_name    check_nt

        command_line    $USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -s $ARG1$ -v $ARG2$ $ARG3$

        }

注意,-s 参数表示指定访问NSClient的密码,就是上面所说的、在NSClient安装过程中设置的那个密码。

然后在定义service的时候,像这样写:

define service{

        use                             local-service

        host_name                       myWindowsServer

        service_description             Windows Disk Space 

        check_command                   check_nt!myPasswd!USEDDISKSPACE!-l c -w 80 -c 90 

        }

其中,“myPasswd”是上面所说的那个密码,你需要写你设置的密码;USEDDISKSPACE表示检测的是磁盘空间;另外,看到上面的check_command中提供的最后一个参数了吗:-l c -w 80 -c 90 

其中第一个c表示检测的是C盘,-w表示的是warning值,-c表示的是critical值。


(19)假设你自己编写了被监控服务器上的一个插件,然后你要在Nagios服务器上通过NRPE调用它,那么你可以向它传入参数,但是在默认情况下,如果你传的参数中含有以下“非法”字符(illegal metachars),则会出错:

| ` & > < ' " \ [ ] { }

禁止在参数中使用这些字符是为了防止恶意的客户利用它们来做“坏事”。这些字符的定义在NRPE的实现文件nrpe.c中,你可以找到:

#define NASTY_METACHARS         "|`&><'\"\\[]{}"

以及出错提示的代码:

/* make sure request doesn't contain nasties */

if(contains_nasty_metachars(pkt->buffer)==TRUE)

{

syslog(LOG_ERR,"Error: Request contained illegal metachars!");

return ERROR;

}

显然,通过修改NRPE的源代码,重新编译并安装它,可以绕开这个限制。但是这可能并不是一个好主意,我们还是尽量通过修改我们自己编写的监测插件,不要在输入参数中使用那些字符为好。

文章来源:http://www.codelast.com/

(20)修改Nagios的 历史记录/事件记录/日志 的保留时间:

在Nagios的web界面中,可以通过查看“Event Log”来得知历史事件的情况,但Nagios默认只保留当天的记录(历史记录都被存档保存到其他地方了),怎么修改这个值呢?例如我想改成保留当月的记录,那么就要修改Nagios安装目录下的 etc目录下的nagios.cfg文件,将 log_rotation_method 参数值改为m(默认为d),这表示Nagios在每个月最后一天的零点会进行日志文件的“转换”(rotate)工作,将旧的文件存档保存起来,新文件从空的开始重新记录。


(21)错误:Warning: The check of host 'XXX' looks like it was orphaned (results never came back). I'm scheduling an immediate check of the host…

在Nagios的web界面的“Event Log”中看到无数条这种类型的记录,产生原因未知,但是看到进程中有相当多与Nagios相关的进程,于是编写以下的脚本,将它们全部杀掉:

#!/bin/bash

for PID in `ps -ef | grep -v grep | grep nagios | awk '{print $2}'`

do

  echo "PID : $PID"

  kill -9 $PID

done

然后再重启Nagios服务:

service nagios restart

就不再看到产生那些错误提示了。


(22)“CHECK_NRPE: Error – Could not complete SSL handshake” 错误:

此问题大概有两个原因:

A)/etc/xinetd.d/nrpe 文件中要添加允许访问的服务器的IP地址,你没有添加。在“only_from = ”这一行添加,多个IP地址用空格隔开,例如:

only_from       = 192.168.56.200 192.168.6.8

然后重启服务:

service xinetd restart

如果此时你在Nagios服务器端试验:

./check_nrpe -H 192.168.77.2

返回:

NRPE v2.12

则说明成功了。

B)客户端安装的OpenSSL库与Nagios服务器端不匹配,导致此错误。我遇到的不是此错误,所以也无法给出更详细的说明,但是在NRPE的文档中看到是会有这种情况的。

文章来源:http://www.codelast.com/

(23)安装Nagios后,有3个检查时间同步的插件,根据不同的检测目标,使用不同的插件:

check_ntp:已过时,最好不要再使用;

check_ntp_peer:用于检查ntp服务器的健康状况。

check_ntp_time:用于检查指定的服务器与ntp服务器之间的时间差。


(24)如何监测LVS的状态:

如果要监测LVS(Linux Virtual Server)服务的状态是否正常,有这样一个插件可用:Nagios-Plugin-LVS。先说说下载这个插件:你需要先安装git软件,然后用git来检出Nagios-Plugin-LVS的源代码,检出源码之后再以源码方式安装它。git可以到这个链接去下载。安装好git之后,用git来获取Nagios-Plugin-LVS的源码:

git clone https://github.com/sukria/Nagios-Plugin-LVS

然后得到了一个名为 Nagios-Plugin-LVS 的目录。进入该目录,看不到常见的configure等可执行程序,也没有Makefile文件(只有一个Makefile.PL)文件,原因是:该插件是以perl语言编写的,我们要想生成Makefile文件,需要以perl来执行它:

perl Makefile.PL

然后就会生成Makefile文件了。就这么容易?其实不然,一般人都没有这么幸运的。执行上面这条命令时,一般来说,你会看到下面的错误输出:

Warning: prerequisite Nagios::Plugin 0 not found.

Writing Makefile for Nagios::Plugin::LVS

这是因为你在安装Nagios Plugin的时候,没有编译安装Nagios::Plugin这个perl模块造成的。

那么,如何编译此perl模块呢?在对Nagios Plugin进行configure的时候,加上参数:

./configure –enable-perl-modules

然后make,make install即可。

这样,你应该就可以成功地生成 Nagios-Plugin-LVS 插件的Makefile文件了。然后make,make install。你会在Nagios-Plugin-LVS目录下看到生成了一个名为 blib 的目录。在 blib/script/ 目录下,可以看到一个 check_lvs 可执行程序(其实它就是perl脚本)。这个程序就是我们需要放置在被监控服务器上的脚本了——由于我们要监控的是LVS服务,因此,此处的“被监控服务器”指的就是安装了LVS服务的机器(在其上,是有ipvsadm命令的,如果没有,则无法用check_lvs脚本来检测LVS状态)。

这就完了?没有。一般人都没有这么幸运。你执行一下check_lvs,会发现输出一堆错误,类似于(不尽相同,但是大概都差不多):

Can't locate Nagios/Plugin.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.7/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.6/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.7/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.6/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/lib/perl5/site_perl/5.8.8/Nagios/Plugin/LVS.pm line 10.

BEGIN failed–compilation aborted at /usr/lib/perl5/site_perl/5.8.8/Nagios/Plugin/LVS.pm line 10.

Compilation failed in require at ./check_lvs line 8.

BEGIN failed–compilation aborted at ./check_lvs line 8.

这些是啥玩意?由于check_lvs是perl程序,因此,它找不到上面所提示的一堆的perl库时,会报错。我们就按错误提示中的一堆的pm文件,按相同的目录结构放置到 /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi 目录下。这些pm文件从哪来?如果你的Nagios Plugin是以默认安装路径安装的话,就是在 /usr/local/nagios/perl/lib/ 目录下。去里面找到需要的东西吧!

把文件都补齐后,再运行check_lvs程序,直到它可以成功输出结果了,就说明你的插件安装成功了。输出形如:

LVS OK – LVS is running (conn: 456778 active, 54786210 inactive)

这就结束了?还没完!由于check_lvs是要调用ipvsadm命令来获取LVS状态的,而ipvsadm命令是只能以root用户来运行的,因此,nagios用户运行不了这个命令(在客户端,插件是以nagios用户来运行的),一运行就报错:

Can't initialize ipvs: Permission denied (you must be root)

Are you sure that IP Virtual Server is built in the kernel or as module?

真折腾,怎么解决?经试验,把nagios用户加入root组也无济于事,问题依旧。

办法是:将nagios用户设置成可以无需密码直接su成root,这样就能以nagios用户运行命令sudo /usr/local/nagios/libexec/check_lvs 了,有了这个基础,我们就可以自己编写一个名为check_lvs_nagios脚本,然后在里面只写上一句话:

sudo /usr/local/nagios/libexec/check_lvs

此时,你切换到nagios用户(su nagios),再运行check_lvs_nagios,应该就可以输出正确的结果了

这就完了吗?还是没完!!千万别砸我,事情就要说清楚前因后果。你在Nagios监控服务器端通过NRPE运行check_lvs_nagios命令,你会发现根本无法读取输出:

/usr/local/nagios/libexec/check_nrpe -H 192.168.XXX.XXX -c check_lvs_nagios

输出结果为:

NRPE: Unable to read output

而这个check_lvs_nagios命令,确信是在被监控服务器上的NRPE配置文件(/usr/local/nagios/etc/nrpe.cfg)中添加过了的(并且还重启了xinetd服务 service xinetd restart):

command[check_lvs_nagios]=/usr/local/nagios/libexec/check_lvs_nagios

文章来源:http://www.codelast.com/

于是,我不得不说,使用这个插件的成本太高,不仅需要安装的东西多,配置麻烦,而且到最后还是无法在只进行少量配置修改的情况下使之运行起来,因此,我转而自己写一个插件check_lvs(用shell写的),比它简单多了。请试验运行下面这段简单的shell:

#!/bin/bash

ACT_COUNT=0

for NUM in `sudo ipvsadm | grep http | grep Route | awk '{print $5}'`

do

     ACT_COUNT=$(($ACT_COUNT+ $NUM))

done

echo $ACT_COUNT

这段shell统计了LVS服务统计信息中的“ActiveConn”的值,通过这个值,你就可以判断出LVS服务是否正常了。当然,上面的shell代码段并不是一个Nagios插件(因为其并没有按Nagios系统的要求返回正确的值),但是你只要自己根据阈值来判断是否正常、并返回相应的值就可以将它改造成一个插件了。

另外请注意:

这段shell中有用sudo来运行ipvsadm命令,因此你还是需要像上面的内容中所说的一样,为nagios用户添加可以无密码su到root的权限(方法请看这个链接的第25条内容)。然后你就可以用nagios用户来运行这个脚本了。

sudo命令默认不能在后台运行,要开放这个权限,同样请看这个链接的第25条内容。

 

(25)被动监测的实现——NSCA

本文环境:RHEL 5.3 x64

 

 

 

 

被动监测,就是指由被监测的服务器主动上传数据到Nagios监控系统中。这种监测方式提高了实时性(出现问题的时候,被监测的服务器可以及时上传数据通知Nagios,从而使管理员可以尽快作出处理,而不用像主动监测中一样,非要等到下一个监测周期才能获知被监测服务器的状态)。NSCA就是可以实现Nagios被动监测的一个程序。

现在(2011年),NSCA的最新版本已经是4年前了的——2007年的,不要觉得奇怪,就是这么“过时”。

这里去下载NSCA,得到压缩包 nsca-2.7.2.tar.gz ,解压出来,先configure,再make all

安装NSCA需要系统中已经安装libmcrypt库,否则不能使用加密数据传输功能,configure的时候会提示:

*** Could not run libmcrypt test program, checking why…

*** The test program failed to compile or link. See the file config.log for the

*** exact error that occured. This usually means LIBMCRYPT was incorrectly installed

*** or that you have moved LIBMCRYPT since it was installed. In the latter case, you

*** may want to edit the libmcrypt-config script: no

可以到这个网址去查看关于该库的更详细的信息,到这里去下载。如果你不需要加密传输,则可以忽略这个问题,照样能编译安装。如果你一直装不上这个东西,我建议你不要纠结于这个问题,不理会它即可。

文章来源:http://www.codelast.com/

然后,你需要把编译出来的一些文件拷贝到与Nagios相关的几个目录下。

注意:下面的描述中所涉及的路径,都是相对于默认安装的Nagios来说的,如果你在安装Nagios的时候自定义了安装目录,那么你也要做相应的更改。

进入NSCA的编译目录:

cd nsca-2.7.2/

将NSCA的可执行程序拷贝到Nagios的bin目录下:

cp src/nsca /usr/local/nagios/bin/

将NSCA的示例配置文件拷贝到Nagios的etc目录下:

cp sample-config/nsca.cfg /usr/local/nagios/etc/

修改NSCA的配置文件 /usr/local/nagios/etc/nsca.cfg,要修改的地方一般来说只有这几处:

server_address=XXX.XXX.XXX.XXX

这里改成你的IP地址。如果有多块网卡,那么这里就填写你想让NSCA监控的那块网卡的IP地址(当然,客户端向NSCA发送被动监测数据时,也要保证数据是从这块网卡上过的,否则NSCA将接不到数据)。

password=XXX

这里改成你设置的密码,即客户端向NSCA发送被动监测数据时,需要提供这个密码,否则将无法成功发送。

如果你没有特殊需求,其余参数不用修改。

然后修改NSCA配置文件的权限:

chown nagios.nagcmd /usr/local/nagios/etc/nsca.cfg

chmod g+r /usr/local/nagios/etc/nsca.cfg

文章来源:http://www.codelast.com/

其实这样就算安装好了NSCA,可以启动它了,但是,这并不是一个好办法,最好是在xinetd下(xinetd是一大堆服务的管理程序),以服务的形式来运行NSCA,方法如下:

(1)编辑文件 /etc/services,在最开头添加一行:

nsca            5667/tcp                        # NSCA

将编译NSCA得到的xinetd配置文件拷贝到它应该在的目录下(并同时重命名,必须的):

cp sample-config/nsca.xinetd /etc/xinetd.d/nsca

重启服务:

service xinetd restart

再查看端口是否被监听了:

netstat -an | grep 5667

输出应类似于:

tcp        0      0 0.0.0.0:5667                0.0.0.0:*                   LISTEN 

表明已被监听了——NSCA服务运行起来了。

(2)那么,NSCA如何与Nagios整合来呢?现在,就是配置Nagios的时刻了:

在service的模板文件中(如果你没有自定义的话,是/usr/local/nagios/etc/objects/templates.cfg 文件),添加一个服务模板定义:

define service{

 

 

        name                            passive_service

        use                             generic-service

        max_check_attempts              1

        active_checks_enabled           0

        passive_checks_enabled          1

        normal_check_interval           5

        retry_check_interval            1

        notification_interval           10

        notification_options            w,u,c,r,f,s

        }

然后就可以在你平常定义服务的文件里定义一个服务了,这里我们定义一个测试用的服务:

define service{

 

 

        use                             passive_service

        host_name                       localhost

        service_description             CheckDummy

        check_command                   check_dummy!0

        notifications_enabled           1

        }

这里使用了check_dummy命令,在Nagios默认安装情况下,是找不到这个命令定义的,我们手工添加上去:编辑 /usr/local/nagios/etc/objects/commands.cfg 文件,添加一个命令定义:

define command{

        command_name    check_dummy

        command_line    /usr/local/nagios/libexec/check_dummy $ARG1$

        }

OK,现在检查一下Nagios配置文件的合法性:

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

如果没有错误的话,就可以重启Nagios服务了:

service nagios restart

文章来源:http://www.codelast.com/

(3)

一个被动监测服务已经定义好,我们该如何向它发送数据呢?怎么测试?下面,就是测试到来的时刻:

编写一个测试文件,假设为 /root/pasv.txt ,内容只有一行:

127.0.0.1[TAB分隔符]CheckDummy[TAB分隔符]0[TAB分隔符]Here we done!

其中,127.0.0.1是NSCA监听的IP地址,CheckDummy是你在Nagios中定义的被动监测服务的名字,0表示告诉NSCA服务正常(1为WARNING,2为CRITICAL,其他值均为UNKNOWN),最后的“Here we done!”是你要向服务器发送的附加信息。

然后,到编译NSCA的目录下,找到程序send_nsca,以及配置文件send_nsca.cfg,执行以下命令:

./send_nsca localhost -c ../sample-config/send_nsca.cfg < /root/pasv.txt

这里要注意

send_nsca和

 

send_nsca.cfg的路径。

如果输出为:

1 data packet(s) sent to host successfully.1 data packet(s) sent to host successfully.

则表明成功!

照这样的方法,你就可以让任意服务器来主动发送监测数据给Nagios了。但别忘了,如果要授权一台服务器上传数据给NSCA的话,需要修改 /etc/xinetd.d/nsca 文件的“only_from = XXX.XXX.XXX.XXX”字段,来添加更多的IP地址(同时要重启xinetd服务)——各个IP地址之间用空格隔开。

本文描述了我在使用Nagios的过程中遇到的一些问题、解决办法以及总结的注意事项。文章很长,请使用Ctrl+F5定位到你需要的部分。

Nagios是一套强大的监控报警系统,但是你不花一些时间,是绝对不可能很好地配置它的。除非你只需要监控主机的alive等简单的情况(例如ping),否则请放弃幻想,以极大的耐心去研究它吧。

 



5个使用check_http插件检测 http / https 服务的例子:

  

5 Nagios check_http Plugin Examples for HTTP / HTTPS



What is check_http?

check_http plugin is used to verify the status of HTTP server (or HTTPS) that is running on a remote host. If you’ve installed Nagios from source, check_httpd command will be located in the /usr/local/nagios/libexec directory.

5 check_http Command Examples

1. Check HTTP

Check whether Apache HTTP is running on a remote server using check_http.

$ check_http -H 192.168.1.50
HTTP OK HTTP/1.1 200 OK - 332 bytes in 0.004 seconds |time=0.004144s;;;0.000000 size=332B;;;0

2. Check HTTPS

Check whether Apache HTTPS is running on a remote server using check_http.

$ check_http -H 192.168.1.50 -S
HTTP OK HTTP/1.1 200 OK - 332 bytes in 0.004 seconds |time=0.004144s;;;0.000000 size=332B;;;0

If the remote server runs only HTTP and not HTTPS, you’ll get “HTTP CRITICAL – Unable to open TCP socket” message as shown below.

$ check_http -H 192.168.1.50 -S
Connection refused
HTTP CRITICAL - Unable to open TCP socket

3. Check HTTP (or HTTPS) on different port

You can check tomcat server, or apache server, or glassfish, or any server that is running on a different port by speficying the port number as shown below.

$ check_http -H 192.168.1.50 -p 8080
HTTP OK HTTP/1.1 200 OK - 332 bytes in 0.004 seconds |time=0.004144s;;;0.000000 size=332B;;;0

For HTTPS running on a different port, do the following.

$ check_http -H 192.168.1.50 -S -p 8443
HTTP OK HTTP/1.1 200 OK - 332 bytes in 0.004 seconds |time=0.004144s;;;0.000000 size=332B;;;0

4. Check Specific URL

To check whether a specific webpage is available, use the -u option as shown below.

$ check_http -H 101hacks.com -u http://linux.101hacks.com/toc

5. Check SSL Certificate Expiry

You can check whether a SSL certificate of the website expires within the next X number of days as shown below. In the following example, we are checking whether the website certificate expires in the next 365 days. The output indicates that it expires in 300 days.

$ check_http -H 101hacks.com -C 365
WARNING - Certificate expires in 300 day(s) (01/01/2011 10:10).

Syntax and Options

check_http -H hostname (or) -I ip-address {optional options}

Short Option Long Option Option Description
-H –hostname host name of the server where HTTP (or HTTPS) daemon is running
-I –IP-address ip address of the HTTP (or HTTPS) server
-p –port Port number where HTTP server runs. Default is 80
-4 –use-ipv4 This will use IPv4 connection
-6 –use-ipv6 This will use IPv6 connection
-S –ssl This will use HTTPS using default 443 port
-C –certificate Minimum number of days a SSL certiface must be valid.
-e –expect Expected response string. Default is HTTP/1
-s –string Expected content string.
-u –url URL to check
-P –post URL encoded http POST data
-N –no-body Do not wait for whole document body to download. Stop once the headers are downloaded.
-M –max-age Check whether a document is older than x seconds. Use 5 for 5 seconds, 5m for 5 minutes, 5h for 5 hours, 5d for 5 days.
-T –content-type Indicate content type in header for POST request
-l –linespan Regular expression can span to new line (Use this with -r or -R option)
-r –regex, –ereg Use this regular expression to search for string in the HTTP page
-R –eregi Same as above, but with ignore case.
-a –authorization If the site user basic authentication send uid, pwd in the format uid:pwd
-A –useragent Pass the specified string as “User Agent” in HTTP header.
-k –header Add additional tags that should be sent in the HTTP header.
-L –link The output is wrapped as HTML link
-f –onredirect When a URL is redirected, use this to either follow the URL, or send ok, warning, or critical notification
-m –pagesize Specify the minimum and maximum page size expected in bytes. Format is minimum:maximum
-w –warning Response time in seconds for warning state
-m –pagesize Specify the minimum and maximum page size expected in bytes. Format is minimum:maximum
-w –warning Response time in seconds for warning state
-c –critical Response time in seconds for critical state
-t –timeout Number of seconds to wait before connection times out. Default is 10 seconds


(3)监测交换机的端口流量/速率

我们无法在交换机上自己安装软件,所以不能像监测一台Linux服务器一样,写一个监测插件来放到被监测的机器上。但是,交换机一般都支持SNMP协议(不支持的很少),因此,可以通过SNMP协议来获取到交换机的各数数据。

通过SNMP来取交换机的数据也有好几种方法,可以通过snmpwalk命令来取数据,自己分析数据中的结果,也可以利用Nagios中现成的插件来完成。这里说的是利用Nagios的check_snmp插件来实现的方法。

首先你要保证你的Nagios Plugin在编译的时候已经把 check_snmp 插件编译出来了(在Nagios安装目录下的 libexec 子目录下,会有一个名为 check_snmp 的程序);如果没有,那么就说明你的Linux服务器环境少了点东西:net-snmp-utils 软件包。如果你的系统中已经安装过这个软件包,编译Nagios Plugin的时候,就会自动把 check_snmp给编译出来(不需要你自己指定编译参数);如果没有,当然就会少掉 check_snmp,但也不会报错。

有了check_snmp这个插件之后,如何使用?还需要和MRTG来配合使用。MRTG是一款可以绘流量图的软件。在安装前,你要确保你的系统中已经安装了以下库:gd,libpng,zlib。这里就不这些库的安装过程了,只说MRTG的安装。

解压源码安装包,之后configure:

./configure –prefix=/usr/local/mrtg-2

然后make,make install即可。安装之后,就要生成一个MRTG的配置文件了:

进入安装目录下:

cd /usr/local/mrtg-2

mkdir cfg

cd bin

./cfgmaker –global 'WorkDir: /usr/local/apache2/htdocs' –global 'Options[_]: bits,growright' –output /usr/local/mrtg-2/cfg/mrtg.cfg public@192.168.26.127

其中,cfgmaker 是用于生成配置文件的程序;/usr/local/apache2/htdocs 是你的web服务器的根目录(如果你不想在web页上查看流量曲线图,那么这里可以填任意路径,同时,下面的一些内容也就无所谓了),/usr/local/mrtg-2/cfg/mrtg.cfg是生成的配置文件的路径+文件名,192.168.26.127是你要取数据的远程服务器的IP地址。

文章来源:http://www.codelast.com/

然后再生成一个索引文件:

./indexmaker –output="/usr/local/apache2/htdocs/mrtg.html" –title="MRTG" /usr/local/mrtg-2/cfg/mrtg.cfg

索引文件的作用是使你可以在web页面中,以整合的方式查看所有通过SNMP获取到的数据绘成的图。

好了,现在MRTG的配置已经完成了,但MRTG还不能自动获取数据,我们需要在crontab中添加一个定时运行的任务,来调用MRTG去定期地获取数据:

编辑/etc/crontab文件,添加一行:

*/5 * * * * root /usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/cfg/mrtg.cfg

这表示5分钟获取一次数据。

现在大功告成了,可以通过web页面查看MRTG生成的曲线图了,在浏览器中访问如下地址即可:

http://your_IP_address/mrtg.html

其中,your_IP_address是你的MRTG所在的服务器的IP地址或域名。

其实,要用Nagios的check_snmp插件来检测交换机端口的速率与MRTG的绘图没什么关系,因为我们的目的不是绘图,而是监测交换机端口流量速度,上面只是顺便把一些无关的内容写出来了。check_snmp插件只是利用了MRTG生成的日志文件(.log文件)来分析其中的内容,得到数据并进行监测。

那么,MRTG的日志文件格式是什么样的呢?在MRTG官方网站上有说明:http://oss.oetiker.ch/mrtg/doc/mrtg-logfile.en.html

从它的这篇有点不明不白的文章里,我们是可以得到一些有用信息的。但是,在我实际使用中,还是自己试验才得出了正确的结果。

找到与你要监测的交换机端口相关的MRTG日志文件,查看其内容的前N行(注意,不是末尾N行),可以看到类似于下面的内容:

1295179801 1096754878 2488338087

 

 

1295179801 1522839 2709629 1522839 2709629

1243339501 1516835 2686609 1516835 2686609

1243339500 1516367 2686296 1516835 2686609

1243339200 1446680 2639603 1453574 2639760

……

首先,所有行的第1列都是Unix时间戳的值,代表产生这条记录的时间。

 



其次,第一行是与众不同的一行,它只有3列,第二列代表该端口上流入(incoming)的数据的字节数,第三列代表该端口上流出(outgoing)的数据的字节数。


再次,从第二行开始,下面所有行的格式都一样,第2、3、4、5列分别代表平均的数据流入(incoming)速率,平均的数据流出(outgoing)速率,最大的数据流入(incoming)速率,最大的数据流出(outgoing)速率。并且,它们的单位均为Bytes/s,即 字节/秒。如果你要换算成平常我们在谈及带宽时常用的单位Mbps,需要将这个值先乘8,再除以1000000

 


如果你要获取当前的带宽值,就用第二行的数据好了。因为对带宽的监测总是通过流入/流出的数据除以流逝的时间得到的,所以,除非时间取极限趋于0,否则是不可能得到一个当前带宽的精确值的,在MRTG5分钟采样一次的情况下,我们可以用5分钟的平均值来当作当前的带宽值。经过与Cacti的监测值的对比,我得出一个结论:这样做是合理的,两个值很接近。

 

 

 

 

至于这个值怎么取,很简单:

取incoming值:  

 

sed -n '2p' $MRTG_FILE | awk '{print $2}'

取outgoing值:  

 

sed -n '2p' $MRTG_FILE | awk '{print $3}'

 


 

 

其中,变量 MRTG_FILE 是你与你要监测的交换机端口相对应的MRTG日志文件路径,请为其赋上正确的值。下面的处理,应该就不用我说了吧?获取到了这个值,就可以在Nagios中根据值的大小来监测报警了。

 

 

 

(4)宏 $USER1$,$USER2$ …的作用

在commands.cfg文件(命令定义文件中),你可能会看到有些默认的命令中使用了 $USER1$ 这样的宏,这些宏是在resource.cfg文件中定义的,你可以自己定义或修改宏。默认的$USER1$是指代Nagios插件的路径。

文章来源:http://www.codelast.com/

(5)Android上的Nagios客户端

如果你有Android设备,那么随时监控Nagios的状态就方便了!如下几个应用(还有更多),可以让你方便地在Android设备上查看你的Nagios状态,请安装apk后自己体会吧:

http://code.google.com/p/nagroid/   tip:如果要通过SSH tunnel的https访问Nagios,则该应用可以和这个Android应用非常好地配合:http://code.google.com/p/connectbot/

http://code.google.com/p/nagmondroid/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值