Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知。我最近在我们部门在搞这个东东,呵呵,顺便把一些心得放到博客上给大家分享分享。(注意下面的文章不是笔者的原创,我是在前辈的基础上加入自己的心得和排除一些错误信息,加以修改而已)

一、安装配置Nagios
 
1、Nagios简介
 
Nagios是一款遵循GPLv2的开源网络监控软件,可用来监控指定的多种系统的主机、服务,并可在它们的工作状态发生变化时通知管理员。它的特性包括:
1)监控网络服务(HTTP、POP3、SMTP、PING、MySQL等)
2)监控主机资源(磁盘空间利用率、内存利用率、CPU负载等)
3)简洁的插件设计接口,使得用户可以轻松开发所需的检测脚本
4)并行服务模式
5)轻松描述网络结构,并且能够区辨“宕机”和“主机不可达”
6)通过邮件或用户自定义的方式将主机或服务的工作状态变化情况通知给管理员
7)自动日志滚动
8)支持以冗余方式进行主机监控
9)可以通过web方式直观的查看当前网络状态、通知和问题历史、日志文件等等,此组件为可选
 
Nagios通常由一个主程序(Nagios)、一个插件程序(Nagios-plugins)和四个可选的ADDON(NRPE、NSCA、NSClient++和NDOUtils)组成。Nagios的监控工作都是通过插件实现的,因此,Nagios和Nagios-plugins是服务器端工作所必须的组件。而四个ADDON中,NRPE用来在监控的远程Linux/Unix主机上执行脚本插件以实现对这些主机资源的监控;NSCA用来让被监控的远程Linux/Unix主机主动将监控信息发送给Nagios服务器(这在冗余监控模式中特别要用到);NSClient++是用来监控Windows主机时安装在Windows主机上的组件;而NDOUtils则用来将Nagios的配置信息和各event产生的数据存入数据库,以实现这些数据的快速检索和处理。这四个ADDON(附件)中,NRPE和NSClient++工作于客户端,NDOUtils工作于服务器端,而NSCA则需要同时安装在服务器端和客户端。
 
下图是笔者根据自己的理解给出的Nagios各组件的关系图,希望能帮助读者理解。如果您对此构图中的关系持有异议,欢迎通过各种方式跟笔者交流。
 

 
 
目前,Nagios只能安装在Linux系统主机上,其编译需要用到gcc。同时,如果打算使用web界面的管理工具的话,还需要有apache服务器和GD图形库的支持。
 
2、安装前的准备工作
 
(1)解决安装Nagios的依赖关系:
 
Nagios基本组件的运行依赖于httpd、gcc和gd。可以通过以下命令来检查nagios所依赖的rpm包是否已经完全安装:
# rpm -q httpd gcc glibc glibc-common gd gd-devel
 
对于缺少的rpm包,您可以挂载光盘直接使用rpm命令进行安装。如果不想总是被rpm的依赖关系所困扰,您可以通过yum结合本地源来实现rpm包的管理。对于本地源的建立,可以参考笔者的另外一篇关于yum的文章。
 
说明:以上软件包您也可以通过编译源代码的方式安装,只是后面许多要用到的相关文件的路径等需要按照您的源代码安装时的配置逐一修改。
 
 
(2)添加nagios运行所需要的用户和组:
 
# groupadd nagcmd
# useradd -m nagios
# usermod -a -G nagcmd nagios
 
把apache加入到nagcmd组,以便于在通过web Interface操作nagios时能够具有足够的权限:
# usermod -a -G nagcmd apache
 
3、编译安装nagios:
 
# tar zxf nagios-3.1.2.tar.gz 
# cd nagios-3.1.2
# ./configure --with-command-group=nagcmd
# make all
# make install
# make install-init
# make install-config
# make install-commandmode
 
为email指定您想用来接收nagios警告信息的邮件地址,默认是本机的nagios用户:
# vi /usr/local/nagios/etc/objects/contacts.cfg 
email        nagios@localhost       #这个是默认设置
 
在httpd的配置文件目录(conf.d)中创建Nagios的Web程序配置文件:
# make install-webconf
 
创建一个登录nagios web程序的用户,这个用户帐号在以后通过web登录nagios认证时所用:
# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
 
以上过程配置结束以后需要重新启动httpd:
# service httpd restart
 
4、编译、安装nagios-plugins
 
nagios的所有监控工作都是通过插件完成的,因此,在启动nagios之前还需要为其安装官方提供的插件。
 
# tar zxf nagios-plugins-1.4.13.tar.gz 
# cd nagios-plugins-1.4.13
# ./configure --with-nagios-user=nagios --with-nagios-group=nagios
# make
# make install
 
5、配置并启动Nagios
 
(1)把nagios添加为系统服务并将之加入到自动启动服务队列:
# chkconfig --add nagios
# chkconfig nagios on
 
(2)检查其主配置文件的语法是否正确:
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
 
(3)如果上面的语法检查没有问题,接下来就可以正式启动nagios服务了:
# service nagios start
 
(4)配置selinux
如果您的系统开启了selinux服务,则默认为拒绝nagios web cgi程序的运行。您可以通过下面的命令来检查您的系统是否开启了selinux:
#getenforce
 
如果上面命令的结果显示开启了selinux服务,您可以通过下面的命令暂时性的将其关闭:
#setenforce 0
 
如果您想在以后完全关闭selinux,可以通过编辑/etc/sysconfig/selinux文件,将其中的selinux后面的值“force”修改为“disable”即可。
 
当然,您也可以通过以下方式将nagios的CGI程序运行于SELinux/targeted模式而不用关闭selinux:
# chcon -R -t httpd_sys_content_t /usr/local/nagios/sbin
# chcon -R -t httpd_sys_content_t /usr/local/nagios/share
 
(5)通过web界面查看nagios:
http://your_nagios_IP/nagios
 
登录时需要指定前面设定的web认证帐号和密码。
 
注意:为了nagios系统的安全,建议您使用信息摘要强认证模式(如MD5),强制使用web的TSL/SSL安全通讯模式,并且通过访问控制列表设定能访问nagios的web界面的客户端地址。
 
二、Nagios的插件简介
 
Nagios本身并不包含任何监控机制,其所有的监控工作都是通过插件(plugin)来实现的。这些插件通常是通过命令行方式监控主机或服务工作状态的Perl脚本或Shell脚本(通常于/usr/local/nagios/libexec目录),由Nagios进行按需调用,并把执行结果返回给Nagios。Nagios正是根据这些返回值来判断是否“采取某种行动”(如运行事件句柄(event handlers),发送通知等)。下图展示了插件相对于 Nagios进程和被监控对象间的关系。
 

 
官方提供了一些用来监控系统基本资源(如 CPU负载、磁盘利用率、Ping速率等)的插件。如果需要监控其它形式资源(如CPU电压、CPU风扇转速、网络流量等)的状态,您可以利用官方提供的其它插件或第三方提供的插件,当然,您也可以自己编写所需要的插件。
 
以下是常用来获得插件的地址:
Nagios插件项目:
NagiosExchange.org
Nagios
官方提供的插件通常都会提供简单的使用帮助,可以在每个脚本后使用“-h”或“--help”来获得这些帮助信息。如要想了解插件脚本check_nt的帮助信息,可以使用如下命令:
# ./check_nt  --help
 
三、Nagios配置文件概览
 

 
Main Config File:主配置文件,通常为nagios.cfg,包含许多指示Nagios守护进程工作属性的指令。此配置文件会被Nagios Daemon和CGIs使用。
Resource  File(s):资源文件,常用来存储用户自定义的“宏(macro)”,如可用来存储“密码”等敏感性的信息,使之可以避免直接暴露在CGIs源文件中。
Object Definition Files:对象定义文件,常用来定义要监控对象以及如何监控这些对象,如主机、服务、主机组、服务组、联系人、联系人组、命令等。这些对象定义文件可以通过cfg_file指令包含于主配置文件中;如果对象定义文件有很多,则可以将它们存放于某一目录中,而后使用cfg_dir指令一次性地由主配置文件读取。这些文件通常位于/usr/local/nagios/etc/objects目录中。
CGI Configure File:CGI配置文件,包含许多决定CGIs工作属性的指令,以及一个指向主配置文件的引用。
四、Nagios常见对象概览
对象(Objects)是Nagios“监控”和“通知”机制的基本逻辑组件,其主要包括:
  • Service
  • Service Groups
  • Hosts
  • Host Groups
  • Contacts
  • Contact Groups
  • Commands
  • Time Periods
  • Notification Escalations
  • Notification and Excution Dependenicies
  •  

 

 
主机和主机组:主机通常是网络中的物理设备,至少有某个种类的访问地址(主机名、IP地址或MAC地址);每个主机通常都提供一个到多个服务(service);主机彼此间可以形成父/子(parent/child)关系,用来描述主机间的“从属”或“包含”关系(“网络可达性”关系)。主机组通常指一到多个主机的组合。
 

服务和服务组(Service/Service groups):“服务”是Nagios监控逻辑的核心,通常从属于某个主机,可以是主机的属性(如CPU负载、磁盘空间、交换空间使用率等),也可以是由主机提供的某个“服务”(如POP3、HTTP、SSH等),甚至也可以是DNS资源记录这样的主机资源。服务组通常指一至多个服务定义的组合。
联系人和联系人组(Contacts/Contack Groups):“联系人”是指“通知(notification)”的接受对象。联系人通常有一个或多个“通知”方式(如移动电话、Email、即时通讯帐户等),以接收其职责范围内的主机或服务发来的通知。“联系人组”通常指一个或多个联系人的集合。
 
时段(Timeperiods):“时段”通常定义用来控制“主机和服务何时被监控”以及“联系人何时可以接收通知”的有效时间段。
命令( Commands):用来定义Nagios可以调用的程序、脚本等,还包括了这些程序或脚本的调用格式。
 
五、NDOUtils的安装与设定:
 
1、NDOUtils简介
 
NDOUTILS ADDON主要用来将Nagios的配置信息和event产生的数据存入数据库(目前的beta版支持mysql和pgsql,稳定版只支持mysql),以方便实现数据的快速检索和处理,并且为其它通过web接口程序来管理这些数据提供了保障。
在一个大型应用中,可能存在多个独立的或分布式布置的Nagios服务器,这种环境中的每个Nagios服务器通常被称为一个Nagios实例。在多Nagios实例的环境中,既可以把所有实例的数据存入到一个数据库,也可以将各实例的数据分别存储。
在只有一个Nagios实例环境中,其实例名称通常为“default”;而在多实例的环境中,则需要为此些Nagios实例各自命名。
 
NDO Utils主要由以下四个部分组成:
 
1)NDOMOD Event Broker Module(NDOMOD.O):用来输出Nagios进程产生的数据(data和logic),其前提是Nagios在编译时开启了Event broker的功能。同时,NDOMOD模块还可以导出Nagios配置有关的信息(包括Nagios监控进程运行时环境产生的动态数据)至文件、Unix域套接字或者TCP套接字。NDO2DB将通过前面的这三种方式获得Nagios的有关数据。
2)NDO2DB:用来接收由NDOMOD和LOG2NDO组件输出的信息并将之存储在数据库中。启动时,NDO2DB进程将创建一个TCP套接字或Unix域套接字以监听客户端(输出端)的连接请求。目前仅支持MySQL数据库。
多个客户端可以同时向一个NDO2DB守护进程输出数据,此时的NDO2DB将为每一个连接进来的客户端(Nagios实例)建立一个连接进程,以实现每个客户端数据的独立存储、检索和处理。 
3)LOG2NDO:用来将Nagios的历史日志通过NDO2DB进程输出至数据库。LOG2NDO与NDO2DB进程通信的方法依然是标准文件、Unix域套接字或者TCP套接字三种。
4)FILE2SOCK:从标准文件或标准输入读入数据,并将之输出至Unix域套接字或TCP套接字。当NDOMOD或LOG2NDO将数据输出至标准文件时,此工具则可用来将这些标准文件中数据读出并发送给NDO2DB进程监听的TCP套接字或Unix域套接字。
 

 
2、安装NDOUtils
 
# tar zxf ndoutils-1.4b8.tar.gz
# cd ndoutils-1.4b8
# ./configure --enable-mysql --with-mysql-lib=/usr/lib --with-mysql-inc=/usr/include  --disable-pgsql
# make
 
# cp -v src/{ndomod-3x.o,ndo2db-3x,file2sock,log2ndo}  /usr/local/nagios/bin
 
以上复制的文件中前两项是版本相关的,即如果您的nagios主版本号是2系列,则需要拷贝名为ndomod-2x.o和ndo2db-2x的两个文件。后两项是通用文件,无论哪个版本都需要复制。
 
3、为NDOUtils创建数据库
 
# mysql -uroot -p
mysql> create database ndodb;
mysql> GRANT  CREATE,SELECT,INSERT,UPDATE,DELETE ON ndodb.* TO ndouser@localhost IDENTIFIED BY '123456';
mysql> flush privileges;
 
下面两条命令用来生成ndoutils所需要的数据库表等,这些表默认以“nagios_”为前缀;install脚本命令必须在db子目录内执行:
# cd db
# ./installdb -u ndouser -p 123456 -h localhost -d ndodb
其中各选项的意义如下:
-u用来指定导入时所用的mysql用户帐号
-p表示前面mysql用户的密码
-h表示mysql服务器地址,如果是localhost,则可以省略
-d表示目标数据库
 
说明:如果与cacti整合的话,npc插件会在cacti的数据库自动生成ndoutils所需要表,这些表均以“npc_”为前缀。后面讲到整合的文章中会继续对些做出说明。
 
4、复制、编辑配置文件
 
# cd ..
# cp -v config/{ndo2db.cfg,ndomod.cfg} /usr/local/nagios/etc
 
# vi /usr/local/nagios/etc/nagios.cfg
在文件中添加:
broker_module=/usr/local/nagios/bin/ndomod-3x.o config_file=/usr/local/nagios/etc/ndomod.cfg
 
此外,请确保您的/usr/local/nagios/etc/nagios.cfg中有如下行出现,否则,请自行添加:
event_broker_options=-1                //为Nagios开启event broker
 
5、编辑ndo2db守护进程和ndomod的配置文件
 
# vi /usr/local/nagios/etc/ndo2db.cfg
socket_type=tcp
db_servertype=mysql
db_host=localhost
db_port=3306
db_prefix=nagios_
db_user=ndouser
db_pass=123456
 
说明:
i) 以上"db_"开头的选项用来指定连接数据库的属性;
ii)其默认用来接收数据的方式为Unix域套接字,这里修改成了TCP套接字;同时,ndomod.cfg配置文件中指定的输出方式也应该做相应的修改;
 
接下来我们去编辑ndomod的配置文件,为其指定数据的输出方式和输出目标主机:
# vi /usr/local/nagios/etc/ndomod.cfg
output_type=tcpsocket
output=127.0.0.1
 
 
6、启动ndo2db守护进程
 
# /usr/local/nagios/bin/ndo2db-3x -c /usr/local/nagios/etc/ndo2db.cfg
 
建议此时查看系统日志(/var/log/messages)中是否有错误出现。
 
如果此时Nagios进程已启动,则需要停止并重新启动nagios:
# killall -SIGHUP nagios
# rm -f /usr/local/nagios/var/nagios.lock
# /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
 
说明:
i)此处停止Nagios必须通过向Nagios发送SIGHUP信号的方式进行;
ii)建议此时查看nagios日志文件中是否表明ndomod的模块加载是否正常,以及其是否能正常连接到data sink;查看日志,可以使用如下命令实现:# tail -30 /usr/local/nagios/var/nagios.log
 
排错信息:
i)  如果ndomod模块没能正常加载的话,建议重新检查nagios的配置文件中是否添加了所需的broker module条目;
ii) 同时,如果ndomod没有正常连接到data sin,建议查看ndo2db.cfg文件中关于mysql连接项目的指定是否正确;
iii)确认一下在编译NDOUtils时是否指定了关于mysql库文件位置的选项;