1 概念(简介)
Nagios是插件式的结构,它本身没有任何监控功能,所有的监控都是通过插件进行的,因此其是高度模块化和富于弹性的。Nagios监控的对象可分为两类:主机和服务。主机通常指的是物理主机,如服务器、路由器、工作站和打印机等,这里的主机也可以是虚拟设备,如xen虚拟出的Linux系统;而服务通常指某个特定的功能,如提供http服务的httpd进程等。而为了管理上的方便,主机和服务还可以分别被规划为主机组和服务组等。
Nagios不监控任何具体数值指标(如操作系统上的进程个数),它仅用四种抽象属性对被监控对象的状态进行描述:OK、WARNING, CRITICAL和UNKNOWN。于是,管理员只需要对某种被监控对象的WARNING和CRITICAL状态的阈值进行关注和定义即可。Nagios通过将WARTING和CRTICAL的阈值传递给插件,并由插件负责某具体对象的监控及结果分析,其输出信息为状态信息(OK,WARNING,CRITICAL或UNKOWN)以及一些附加的详细说明信息。
2 特性
由上述说明可以,Nagios是极富弹性的,其监控功能完全可以按照管理员的期望进行。此外,它外提供了对问题的自动响应能力和一个功能强大的通知系统。所有这些功能的实现是基于一个结构明晰的对象定义系统和少数几个对象类型实现的。
1)命令(Commands)
“命令”用于定义Nagios如何执行某特定的监控工作。它是基于某特定的Nagios插件定义出的一个抽象层,通常包含一组要执行的操作。
2)时段(Time periods)
“时段”用于定义某“操作”可以执行或不能执行的日期和时间跨度,如工作日内的每天8:00-18:00等;
3)联系人和联系人组(Contacts and contact groups)
“联系人”用于定义某监控事件的通知对象、要通知的信息以及这些接收通知者何时及如何接收通知;一个或多个联系人可以定义为联系人组,而一个联系人也可以属于多个组;
4)主机和主机组(host and host groups)
“主机”通常指某物理主机,其包括此主机相关的通知信息的接收者(即联系人)、如何及何时进行监控的定义。主机也可以分组,即主机组(host groups),一个主机可同时属于多个组;
5)服务(Services)
“服务”通常指某主机上可被监控的特定的功能或资源,其包括此服务相关的通知信息的接收者、如何及何时进行监控等。服务也可以分组,即服务组(Service groups),一个服务可同时属于多个服务组;
3 相关概念
3.1 依赖关系
Nagios的强大功能还表现在其成熟的依赖关系系统上。比如,某路由设备故障必然会导致关联在其上的其它主机无法被正常访问,如果不能定义这些设备间的依赖关系,那么监控系统上必然会出现大量的设备故障信息。而Nagios则通过依赖关系来描述网络设备的拓扑结构,并能够实现在某设备故障时不再对依赖于此设备的其它设备进行检测,从而避免了无谓的故障信息,方便管理员及时定位并排除故障。此外,Nagios的依赖关系还可以在服务级别上实现,如果某服务依赖于其它服务时,也能实现类似主机依赖关系的功能。
3.2 宏
Nagios还能够使用宏,并且宏的定义在整个Nagios系统中具有一致性。宏是能够用于对象定义中的变量,其值通常依赖于上下文。在“命令”中定义的宏,相对于主机、服务或其它许多参数来说,其值会随之不同。比如,某命令可以根据向其传递的IP地址的不同来监控不同的主机。
3.3 计划中宕机
Nagios还提供了调度性计划中的宕机机制,管理员可以周期性的设定某主机或服务为计划中的不可用状态。这种功能可以阻止Nagios在调度宕机时段通知任何信息。当然,这也可以让Nagios自动通知管理员该进行主机或服务维护了。
3.4 软状态和硬状态(Soft and Hard States)
如上所述,Nagios的主要工作是检测主机或服务的状态,并将其存储下来。某一时刻,主机或服务状态仅可以是四种可用状态之一,因此,其状态能够正确反映主机或服务的实际状况就显得特别关键。为了避免某偶然的临时性或随机性问题,Nagios引入了软状态和硬状态。在实际的检测中,Nagios一旦发现某主机或服务的状态为UNKOWN或不同于上一次检测时的状态,其将会对此主机或服务进行多次测试以确保此状态的变动是非偶然性的。具体共要做出几次测试是可以配置的,在这个指定次数的测试时段内,Nagios假设此变化后的状态为软件状态。一旦测试完成后状态仍然为新变的状态时,此状态就成了硬状态。
4 安装篇见详细安装文档
5 相关配置及参数详解
5.1 Nagios的主配置文件
Nagios的主配置文件为nagios.cfg,其语法非常简洁,通常#开头的行为注释行,而参数的设置格式为<parameter>=<value>;其中,有些参数是可以重复出现的。其中常用的参数说明如下:
log_file: 设定Nagios的日志文件;
cfg_file: Nagios对象定义的相关文件,此参数可重复使用多次以指定多个文件;
cfg_dir: 设定Nagios对象定义的相关文件所在的目录,此目录中的所有文件都会被作为对象定义的文件;此参数可重复使用多次以指定多个目录;
resource_file: 设定Nagios附加的宏定义的相关文件;
status_file: 设定Nagios存储所有主机和服务当前状态信息的文件;
status_update_interval: 设定status_file指定的文件中状态信息的更新频率;
service_check_timeout: 设定服务检测的超时时间,默认为60秒;
host_check_timeout: 设定主机检测的超时时间,默认为30秒;
notification_timeout: 设定通知信息发送尝试的超时时间,默认为30秒;
5.2 resource_file和宏定义
在主配置文件中,参数resource_file用于定义所有用户变量(即“宏”)的存储文件,它用于存储对象定义中的可以访问的额外信息,如访问某服务的密码等;因此,这些信息通常都是些敏感数据,一般不允许通过Web接口来访问。此文件中可以定义的宏可多达32个,它们分别为$USER1$,$USER2$...$USER32,这些宏一般在check命令中引用。通常情况下$USER1$用于引用Nagios插件所在目录这个路径信息,因此,一般不建议修改其值。
Nagios事先定义了许多宏,它们的值通常依赖于其上下文。
如下:
HOSTNAME: 用于引用host_name指定所定义的主机的主机名;每个主机的主机名都是唯一的;
HOSTADDRESS: 用于引用host对象中的address指令的值,它通常可以为IP地址或主机名;
HOSTDISPLAYNAME: 用于引用host对象中alias指令的值,用以描述当前主机,即主机的显示名称;
HOSTSTATE:某主机的当前状态,为UP,DOWN,UNREACHABLE三者之一;
HOSTGROUPNAMES: 用于引用某主机所属的所有主机组的简名,主机组名称之间以逗号分隔;
LASTHOSTCHECK:用于引用某主机上次检测的时间和日期,Unix时间戳格式;
LISTHOSTSTATE:用于引用某主机前一次检测时的状态,为UP,DOWN或UNREACHABLE三者之一;
SERVICEDESC: 用于引用对应service对象中的desccription指令的值;
SERVICESTATE: 用于引用某服务的当前状态,为OK,WARNING,UNKOWN或CRITICAL四者之一;
SERVICEGROUPNAMES: 用于引用某服务所属的所有服务组的简名,服务组名称之间以逗号分隔;
CONTACTNAME: 用于引用某contact对象中contact_name指令的值;
CONTACTALIAS: 用于引用某contact对象中alias指令的值;
CONTACTEMAIL: 用于引用某contact对象中email指令的值;
CONTACTGROUPNAMES: 用于引用某contact所属的所有contact组的简名,contact组名称之间以逗号分隔;
注:
Nagios 3还支持自定义宏,只是它的定义和使用方式比较独特。管理员可以在某类型对象的定义中使用额外的指令,并能够在命令中使用特别格式的宏来引用此指令的值。其引用方式根据对象类型的不同也有所不同,具体如下:
$_HOST<variable>$ – 引用在主机对象中定义的指令的值;
$_SERVICE<variable>$ – 引用在服务对象中定义的指令的值;
$_CONTACT<variable>$ – 引用在联系人对象中定义的指令的值;
5.3 定义主机中notification_options选项参数含义
其中的notification_options用于指定当主机处于什么状态时应该发送通知。其各状态及其表示符如下:
d —— DOWN
u —— UNREACHABLE
r —— UP(host recovery)
f —— flapping
s —— 调试宕机时间开始或结束
5.4 定义服务中notification_options选项参数含义
其中的notification_options用于指定当服务处于什么状态时应该发送通知。其各状态及其表示符如下:
w —— WARNING
u —— UNKNOWN
c —— CRITICAL
r —— OK(recovery)
f —— flapping
s —— 调试宕机时间开始或结束
5.5 定义服务组
define servicegroup
{
servicegroup_name webservices
alias All services related to web
members webserver1,www,webserver2,www
}
5.6 定义主机组
define hostgroup
{
hostgroup_name webservers
alias Linux web servers
members webserver1
}
5.7 定义联系人组
define contactgroup
{
contactgroup_name linux-admins
alias Linux Administrators
members magedu, mageedu
}
5.8 定义模板
Nagios通过功能强大的继承引擎来实现基于模板的对象继承。这就意味着可以定义将某类型的对象的通用属性组织起来定义为对象模板,并在定义其类型中的对象时直接从此模板继承其相关属性的定义。定义对象模板的方法很简单,通常只需要在定义某类型对象时使用register指令并将其值设定为0即可。对象模板的名称通常使用name指令定义,这与某特定类型对象使用的指令也有所不同。而定义此种类型的对象时,只需要使用use指令并将其值设定为对应模板的名称即可。
check_interval 5 #每5分钟检测一次
retry_check_interval 1 #出现问题时每1分钟重检测一次
max_check_attempts 3 #检测失败后最大重试次数
notification_interval 10 #10分钟发送一次警报
notification_period 24x7 #发送警报的时间段
notification_options w,u,c,r #什么情况发送警报
5.9 配置cgi.cfg文件
1、配置nagios页面刷新时间
2、配置不同用户为只读权限
1)创建nagios用户
root@wang:/usr/local/nagios/etc# /usr/bin/htpasswd /usr/local/nagios/etc/htpasswd.users wang
New password:
Re-type new password:
Adding password for user wang
root@wang:/usr/local/nagios/etc# cat /usr/local/nagios/etc/htpasswd.users
nagiosadmin:GFyDMApK3t6ys
wang:vkH7qZYVLEXSo
2)配置cgi.cfg,用户为只读
root@wang:/usr/local/nagios/etc# vim cgi.cfg
6 报警的四种方式
查看报警信息有四种方式,基于nagios页面本身报警;基于网页插件报警;基于Nagstamon工具报警;基于第三方邮件发送报警。
- 基于网页本身报警方式
1)修改配置文件/usr/local/nagios/etc/cgi.cfg
root@wang:~# vim /usr/local/nagios/etc/cgi.cfg ; 将以下几行注释去掉
host_unreachable_sound=YinPing.wav ; 音频文件名
host_down_sound=YinPing.wav
service_critical_sound=YinPing.wav
service_warning_sound=YinPing.wav
service_unknown_sound=YinPing.wav
#normal_sound=noproblem.wav
注:要修改音频的文件名
2)将WAV音频文件上传至/usr/local/nagios/shara/media/目录下
root@wang:~# ls /usr/local/nagios/share/media/
YinPing.wav
3)重启nagios
root@wang:~# /etc/init.d/nagios restart
4)将服务Down掉,查看是否有报警声
此时发现报警声只响一声,原音在于nagios每检测到服务出故障时默认只报警一声。如要连续多声报警,可从更必源码包nagios/cgi/status.c配置文件参数,再重新编译nagios即可。
if(sound != NULL) {
printf("<object type=\"audio/x-wav\" data=\"%s%s\" height=\"0\" widt
h=\"0\">", url_media_path, sound);
printf("<param name=\"filename\" value=\"%s%s\">", url_media_path, s
ound);
printf("<param name=\"autostart\" value=\"true\">");
printf("<param name=\"playcount\" value=\"100\">");
printf("</object>");
}
将标红处改成想要报警声次数
- 基于网页插件报警(仅支持火狐浏览器)
1) 下载火狐浏览器
2) 到工具栏点击附加组件管理器添加nagios checker插件安装
2)安装后点击选项(新增)
3)依次按如下图自行设置
注:其他配置可自行通过相关选项定义
4)现在服务Down,只要开着火狐浏览器,就可听到服务报警声音。
3、基于Nagstamon小工具报警
1)下载安装:https://nagstamon.ifw-dresden.de/download工具进行如下图配置即可
4、基于SendEmail邮件报警
此步骤可参数naigos详细安装文档操作。
7 Nagios监控windows
1.NSClient原理图:
2. NSClient与nrpe最大的区别就是:
--被监控机上安装有nrpe,并且还有插件,最终的监控是由这些插件来进行的.当监控主机将监控请求发给nrpe后,nrpe调用插件来完成监控.
--NSClient则不同,被监控机上只安装NSClient,没有任何的插件.当监控主机将监控请求发给NSClient后,NSClient直接完成监控,所有的监控是由NSClient完成的.
这也说明了NSClient的一个很大的问题,不灵活,没有可扩展性.它只能完成自己本身包含的监控操作,不能由一些插件来扩展.好在NSClient已经做的不错了,基本上可以完全满足我们的监控需要.
7.1 NSClient++ 安装及配置
NSClient++下载地址:http://sourceforge.net/projects/nscplus/files/nscplus/
1)输入nagios服务器地址
2)修改配置文件NSC.ini
7.2 监控进程:
1) 监控 windows 主机的 Explorer.exe 进程运作状况,如程序终止,则会发 Critical
define service {
host_name winxp226
service_description Explorer
use generic-service
check_command check_nt!PROCSTATE! -d SHOWALL -l explorer.exe
register 1
}
7.3 监控服务
1) 监控 windows主机的W3SVC设置的动作状况
define service{
host_name winxp226
use generic-service
service_description W3SVC
check_command check_nt!SERVICESTATE!-d SHOWALL -l W3SVC
}
2)监控Windows主机的MySQL服务运行情况,如服务终止,则会发出CRITICAL
define service {
host_name winxp226
service_description MySQL55
use generic-service
check_command check_nt!SERVICESTATE! -d SHOWALL -l MySQL55
register 1
}
3)监控 windows 主机的SNMP服务的运作状况,如服务终止,则会发CRITICAL
define service{
use generic-service
host_name winxp226
service_description SNMP
check_command check_nt!SERVICESTATE!-d SHOWALL -l "SNMP Service"
}
注意:此服务名称应与Windows服务名称相同,如服务中间有空格时请将其放入双引号内,否则将会报无效的参数。如下图
7.4 监控页面参数说明
作用:
检测指定主机上的http服务,可以是http或者https,可以重定向,查找字符串,正则表达式,检测链接次数,证书过期时间。
用法:
check_http -H | -I [-u ] [-p ]
[-w ] [-c ] [-t ] [-L] [-a auth]
[-b proxy_auth] [-f ]
[-e ] [-s string] [-l] [-r | -R ]
[-P string] [-m :] [-4|-6] [-N] [-M ]
[-A string] [-k string] [-S] [--sni] [-C ] [-T ]
[-j method]
选项:
1)-H 和-I 必须指定一个或者两个都写
H, --hostname=ADDRESS
主机名,支持虚拟主机,也可以添加端口。
-I, --IP-address=ADDRESS
使用IP地址或者名字(直接使用数字的IP可以不适用dns解析)
2)-p, --port=INTEGER
Port number (default: 80)
检测端口,默认是80
3)-4, --use-ipv4 -6, --use-ipv6
使用ipv4或者ipv6连接
4)-S, --ssl
通过ssl链接
5)--sni
启用SSL/TLS支持主机名扩展
6)-C, --certificate=INTEGER
证书有效地时间
7)-e, --expect=STRING
用“,”分割的字符串列表,预期至少有一个出现在服务响应的第一列。
服务器响应的第一行:是状态行,由协议版本,数字状态码,和相关的原因文本短语组成。
8)-s, --string=STRING
在返回的页面中出现的字符串
9)-u, --url=\'#\'" /span>
访问资源的路径,默认是/
10)--invert-regex
如果搜索到就返回critical,如果没有就返回OK,和-r/-R结合。不可以和-s结合使用。
11)-a, --authorization=AUTH_PAIR
用户名密码 基于网站的基本认证
12)-b, --proxy-authorization=AUTH_PAIR
代理服务器的用户名密码
13)-m, --pagesize=INTEGER<:INTEGER>
页面大小需要 最小:最大(单位:bytes)
14)-w, --warning=DOUBLE
告警响应时间
15)-c, --critical=DOUBLE
发送危险警告的响应时间
16)-t, --timeout=INTEGER
连接超时时间
实例:
1)-u测试页面 是否可以到开 可以用相对路径和绝对路径
-H -I 有一个就可以
相对路径
#./check_http -H www.****.com -u /url1/url2/index.html
绝对路径
#./check_http -H www.****.com -u http://www.****.com/url1/url2/index.html
端口,默认就是80
#./check_http -H www.****.com -p 80 -u http://www.****.com/url1/url2/index.html
使用数字IP
#./check_http -I xxx.xxx.xxx -u /url1/url2/index.html
2)加密传输 -S
# ./check_http -H "log.gw.com.cn" -S
Connection refused
HTTP CRITICAL - Unab
le to open TCP socket
3)测试服务器的http版本协议或者状态返回码 -e
# ./check_http -I 114.80.136.138 -k "HOST:log.gw.com.cn" -e "HTTP/1.1"
HTTP OK: Status line output matched "HTTP/1.1" - 3088 bytes in 0.206 second response time |time=0.205964s;;;0.000000 size=3088B;;;0
# ./check_http -I 114.80.136.138 -k "HOST:log.gw.com.cn" -e "HTTP/1.0"
HTTP CRITICAL - Invalid HTTP response received from host: HTTP/1.1 200 OK
4)搜索返回的页面中的内容 -s
# ./check_http -I 114.80.136.138 -k "HOST:log.gw.com.cn" -s "Piwik"
HTTP OK: HTTP/1.1 200 OK - 3088 bytes in 0.196 second response time |time=0.196134s;;;0.000000 size=3088B;;;0
$ curl 114.80.136.138 -H "host:log.gw.com.cn" 显示的页面中出现的“Piwik”
5)以用户名密码访问一个需认证的页面 -a;
# ./check_http -I 10.15.62.38 -u /nagios/
HTTP WARNING: HTTP/1.1 401 Authorization Required - 726 bytes in 0.019 second response time |time=0.019393s;;;0.000000 size=726B;;;0
# ./check_http -I 10.15.62.38 -u /nagios/ -a nagiosadmin:nagios
HTTP OK: HTTP/1.1 200 OK - 917 bytes in 0.066 second response time |time=0.066009s;;;0.000000 size=917B;;;0
6、连接超时的时间 -t;
# ./check_http -I 10.15.62.38 -t 1
HTTP OK: HTTP/1.1 200 OK - 38056 bytes in 0.017 second response time |time=0.017460s;;;0.000000 size=38056B;;;0
7、定义warning和critical的告警阀值:-w和-c;
8、检测返回的页面大小 -m ;
# ./check_http -H "log.gw.com.cn" -I 114.80.136.151 -m 10:400
HTTP WARNING: HTTP/1.1 200 OK - page size 3128 too large - 3128 bytes in 0.223 second response time |time=0.223207s;;;0.000000 size=3128B;10;0;0
返回的页面是3128 bytes,超过了最大限制400,发出了报警。
9、检测证书是否过期 -C
#check_http -H www.verisign.com -C 14
证书过期时间大于14天 返回OK状态;证书还有0-14天过期,返回警告信息;证书已经过期,返回紧急状态。
10、设置返回的http的头部信息 -A
# ./check_http -H "log.gw.com.cn" -v
GET / HTTP/1.1
User-Agent: check_http/v1.4.16 (nagios-plugins 1.4.16)
Connection: close
Host: log.gw.com.cn
# ./check_http -H "log.gw.com.cn" -v -A "check_http"
GET / HTTP/1.1
User-Agent: check_http
Connection: close
Host: log.gw.com.cn
11、只显示头部信息,不显示页面信息。 -N
# ./check_http -H "log.gw.com.cn" -I 114.80.136.151 -N
HTTP OK: HTTP/1.1 200 OK - 1460 bytes in 0.219 second response time |time=0.218590s;;;0.000000 size=1460B;;;0
# ./check_http -H "log.gw.com.cn" -I 114.80.136.151
HTTP OK: HTTP/1.1 200 OK - 3128 bytes in 0.220 second response time |time=0.220288s;;;0.000000 size=3128B;;;0
7.5 自定义开发监控脚本
1. 定义 nagios返回的状态变量(非常重要,nagios就是根据状态定义才决定是否报警)
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
2. 案例
root@wang:/usr/local/nagios/libexec# vim 123.sh
a=2
STATE_WARNING=1
if [ $a -eq 2 ]
then
echo "CRITICAL - two is Warning!!"
exit $STATE_WARNING
fi
3. 效果: