[关闭]
@cdmonkey 2015-04-30T02:59:54.000000Z 字数 12334 阅读 1436

Nagios(1)监控服务基础介绍

Nagios


https://zybuluo.com/northcom/note/51928

一、企业中为什么要部署监控系统?

内容暂略

二、Nagios监控系统的构成

1. 构成组件

Nagios监控系统(监控端)一般由下面几部分构成:

主程序(Nagios)
插件程序(Nagios-Plugins)
可选扩展程序(NRPE、NSClient++、NSCA、NDOUtils等等)

Nagios的功能是监控服务和主机,但其仅仅是一个平台,自身并不包括实现这部分功能的代码,所有的监控、检测功能都是由插件来实现的。同时,如果监控系统发现问题不能报警那就没有意义了,所以报警也是很重要的功能之一。但是同上面一样,Nagios自身也没有报警部分的代码,甚至没有插件,而是交给用户或者其他相关开源项目组去完成。

Nagios的安装,是指基本平台,也就是Nagios软件包的安装。它是监控体系的框架,也是所有监控的基础。打开其官方的文档,会发现Nagios基本上没有什么依赖包,只要求系统是Linux或者其他Nagios支持的系统。不过,如果你没有安装Apache,那么你就没有那么直观的界面来查看监控信息了,所以Apache姑且算是一个前提条件。

2. 附加程序

2.1 NRPE

NRPE工作于被监控端,用于在被监控的远程UNIX/Linux主机上执行脚本插件以获取数据,并回传给监控端,以实现对这些主机资源的监控,可以理解为半被动模式。可用于监控本地的负载(uptime)、CPU(topsar)及其温度、内存和交换分区(freeswap)、IO(iostat)、RAID以及对本地所有文件的指纹(MD5)监控。

之所以说是被动模式,指的是监控端被动的等待监控数据的回传。被动模式是在被监控机上面通过插件获取监控数据,然后将数据发往监控机,最后监控机对监控数据处理。这样做的一个很大的优势就是将除去处理数据的其他工作都放在了被监控机上面(包括了数据的传输),这样就避免了被监控机数量大时,一次轮询时间过长而导致监控反应延迟,这也就是被动模式能承担更大监控量的关键。

NRPE以守护进程的方式运行,默认端口为5666。

此处输入图片的描述

相当于领导分配工作,下属完成,然后汇报工作。

工作原理:
NRPE(Nagios Remote Plugin Executor)是用于在远端服务器上运行监测命令的守护进程,它用于让Nagios监控端通过相应插件触发远端主机上的检测命令,并将检测结果返回给监控端。当Nagios需要监控某个远程主机的时候:

① 首先:Nagios会运行“check_nrpe”这个插件,告诉它要检查什么。
② 其次:check_nrpe插件会连接到远程的NRPE daemon,所采用的方式是SSL。
③ 然后:NRPE daemon会运行相应的插件来执行检查。
④ 最后:NRPE daemon将检查的结果回传给check_nrpe,然后再将其递交给Nagios做处理。

2.2 NSClient++

同样是半被动模式,用于Windows系统的被监控端。其作用就相当于NRPE。

此处输入图片的描述

2.3 NSCA

属于纯被动模式的监控。NSCA需要同时安装在Nagios的监控端(服务器端)和被监控端(客户端)。用于让被监控的远程UNIX/Linux主机主动将获取到的监控信息发送给监控端(在分布式监控集群模式中会用到,如果是300台以内的服务器,可以不用)。

分布式监控NSCA外部构件简介:为完成从远程主机主动提交强制检测结果,于是就开发了NSCA外部构件。该外部构件包括两个部分,第一部分是客户端程序(send_nsca),运行于远程主机上并负责将强制检测结果送到指定的Nagios服务端。另一部分是NSCA的守护进程(nsca),它既可以独立的运行于守护进程服务,也可以注册到“inetd”里作为一个inetd客户程序来提供监听连接。从客户端收到服务检测结果之后,守护进程将结果提交给Nagios,方式是通过在外部命令文件里插入一条PROCESS_SVC_CHECK_RESULT命令,之后跟上检测结果。在Nagios服务端下一次处理外部命令时将会找到这条由分布式服务器送来的强制检测信息并处理它。

此处输入图片的描述

从上图中可以看出,NSCA模式属于纯被动模式,而NRPE则属于半被动模式。

三、Nagios服务器端安装

此处输入图片的描述

1. 安装过程

源码安装前需要先确定 已经安装Apache、gcc、GD库和开发库(见安装步骤的第五步)。

  1. #Step 1: Config yum
  2. cd /etc/yum.repos.d/
  3. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  4. #Step 2: Config profile
  5. echo 'export LC_ALL=C'>> /etc/profile
  6. source /etc/profile
  7. #Step 3: Stop iptables and selinux
  8. /etc/init.d/iptables stop
  9. /etc/init.d/iptables stop
  10. chkconfig iptables off
  11. setenforce 0
  12. -------------------------
  13. #Or use the following script:
  14. if [ -f /etc/selinux/config ]; then
  15. sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
  16. setenforce 0
  17. fi
  18. -------------------------
  19. #Step 4: Config time sync
  20. /usr/sbin/ntpdate pool.ntp.org
  21. echo '#time sync by oldboy at 2010-2-1'>>/var/spool/cron/root
  22. echo '*/10 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1'>>/var/spool/cron/root
  23. crontab -l
  24. #Step 5: Install gcc and lamp env etc
  25. yum install gcc glibc glibc-common -y
  26. yum install gd gd-devel -y
  27. yum install httpd php php-gd -y
  28. yum install mysql* -y
  29. #Step 6: Add Nagios user
  30. /usr/sbin/useradd -m nagios
  31. /usr/sbin/groupadd nagcmd
  32. /usr/sbin/usermod -a -G nagcmd nagios
  33. /usr/sbin/usermod -a -G nagcmd apache
  34. #Step 7: Download and install Nagios
  35. [ ! -f oldboy_training_nagios_soft.zip ] && exit 1
  36. unzip oldboy_training_nagios_soft.zip
  37. tar xzf nagios-3.5.1.tar.gz
  38. cd nagios
  39. ./configure --with-command-group=nagcmd
  40. make all
  41. make install
  42. make install-init
  43. make install-config
  44. make install-commandmode
  45. make install-webconf
  46. cd ../
  47. #Step 8: Config web auth
  48. htpasswd -cb /usr/local/nagios/etc/htpasswd.users oldboy 123456
  49. #Step 9: Install nagios-plugins
  50. yum -y install perl-devel
  51. tar zxf nagios-plugins-1.4.16.tar.gz
  52. cd nagios-plugins-1.4.16
  53. ./configure --with-nagios-user=nagios --with-nagios-group=nagios --enable-perl-modules
  54. make && make install
  55. cd ../
  56. ls /usr/local/nagios/libexec/|wc -l
  57. #Step 10: Install NRPE
  58. tar zxvf nrpe-2.12.tar.gz
  59. cd nrpe-2.12
  60. ./configure
  61. make all
  62. make install-plugin
  63. make install-daemon
  64. make install-daemon-config
  65. cd ..
  66. #Step 11: Startup service and check
  67. /etc/init.d/nagios start
  68. /etc/init.d/httpd start
  69. echo -----------
  70. lsof -i tcp:80
  71. echo ----------
  72. ps -ef|grep nagios
  73. echo "NAGIOS is successfully installed."
  74. echo ok
  75. #至此,监控服务端安装完毕。
  76. #注意:Nagios主进程没有端口,这是因为它自身并不提供监控服务,而是依赖于插件程序,所以无需服务端口。
软件包 功能
nagios-3.5.1.tar.gz Nagios的主程序。
nagios-plugins-1.4.16.tar.gz Nagios的插件程序。
nrpe-2.12.tar.gz Nagios客户端(被监控端)的NRPE程序。
pnp-0.4.14.tar.gz 画图的Web程序。
rrdtool-1.2.14.tar.gz 画图工具。
Class-Accessor-0.31.tar.gz

需要注意的问题:

2. 汉化

  1. [root@Nagios tools]# tar jxvf nagios-cn-3.2.3.tar.bz2
  2. [root@Nagios tools]# cd nagios-cn-3.2.3
  3. [root@Nagios nagios-cn-3.2.3]# ./configure --prefix=/usr/local/nagios
  4. make all
  5. make install
  6. make install-init
  7. make install-config
  8. make install-commandmod
  9. #上面就是汉化包的安装,但是安装完后页面认证以及授权都要重新进行。

3. 目录结构

Nagios服务端的目录结构:

  1. [root@Nagios ~]# tree -L 1 /usr/local/nagios/
  2. /usr/local/nagios/
  3. ├── bin
  4. ├── etc #配置文件的目录。
  5. ├── include
  6. ├── libexec #插件(Nagios Plugins)的目录。
  7. ├── perl
  8. ├── sbin
  9. ├── share #监控页面的站点目录。
  10. └── var #数据以及日志的目录。
  1. [root@Nagios ~]# tree /usr/local/nagios/etc/
  2. /usr/local/nagios/etc/
  3. ├── cgi.cfg #采用授权模式,并且控制访问权限。
  4. ├── htpasswd.users #登录监控站点页面的密码验证文件。
  5. ├── nagios.cfg #主配置文件。
  6. ├── nrpe.cfg #客户端NRPE的配置文件,如果不把Nagios同时作为被监控端,就可以不用理会该配置文件。
  7. ├── objects
  8. ├── commands.cfg
  9. ├── contacts.cfg
  10. ├── localhost.cfg #定义对本地主机的监控。
  11. ├── printer.cfg
  12. ├── switch.cfg
  13. ├── templates.cfg
  14. ├── timeperiods.cfg
  15. └── windows.cfg
  16. └── resource.cfg

/usr/local/nagios/etc/object目录下的配置文件:

此处输入图片的描述

Nagios自己定义了一套规则用于配置文件,其中最重要的概念就是“对象(object)”。在Nagios的配置过程中涉及到的几个定义的对象有:主机、主机组,服务、服务组,联系人、联系人组,监控时间以及监控命令等。从这些定义可以看出,Nagios各个配置文件之间是互为关联,彼此引用的。要成功配置Nagios监控系统,必须要弄清楚每个配置文件之间依赖与被依赖的关系,最重要的有四点:

第一:定义监控哪些主机、主机组、服务和服务组。
第二:定义这个监控要用什么命令实现。
第三:定义监控的时间段。
第四:定义主机或服务出现问题时要通知的联系人和联系人组。

所有这些对象绝大多数都是需要我们手动进行定义的,这也许就是Nagios的安装显得复杂的地方。

配置主配置文件:

  1. #首先备份配置文件目录:
  2. [root@Nagios nagios]# tar zcvf etc.tar.gz ./etc/
  3. [root@Nagios nagios]# vim etc/nagios.cfg +34
  4. ...
  5. ------------------------------
  6. # You can specify individual object config files as shown below:
  7. cfg_file=/usr/local/nagios/etc/objects/commands.cfg
  8. cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
  9. cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg
  10. cfg_file=/usr/local/nagios/etc/objects/templates.cfg
  11. #主配置文件中是通过上面这种方式加载配置文件的。
  12. ------------------------------
  13. #在主配置文件中既可以加载单独的一个『cfg』文件,也可以指定一个目录,即该目录下的所有cfg文件都会被加载。
  14. #在第34行处添加下面的内容(加载两个配置文件及一个配置文件目录):
  15. cfg_file=/usr/local/nagios/etc/objects/hosts.cfg
  16. cfg_file=/usr/local/nagios/etc/objects/services.cfg
  17. cfg_dir=/usr/local/nagios/etc/services
  18. #并且将下面的这行注释掉:
  19. #cfg_file=/usr/local/nagios/etc/objects/localhost.cfg
  20. ...
  1. #依据上面新加载的配置文件目录创建该目录并授权:
  2. [root@Nagios etc]# mkdir services
  3. [root@Nagios etc]# chown -R nagios.nagios services/
  4. #生成hosts.cfg、services.cfg两个配置文件并授权:
  5. cd /usr/local/nagios/etc/objects/
  6. head -51 localhost.cfg >hosts.cfg
  7. chown nagios.nagios /usr/local/nagios/etc/objects/hosts.cfg
  8. ------------------------------
  9. touch services.cfg
  10. chown nagios.nagios services.cfg

4. 监控模式的定义及选择

按照监控的行为来看,老男孩老师把Nagios的监控分为主动监控和被动监控(NRPE为半被动而NSCA为全被动)两种模式。监控数据的获取方式是主动模式与被动模式的最大区别。

主动模式:和NRPE无关,就是利用服务端本地插件直接获取监控信息。
被动模式:服务端主程序通过check_nrpe插件,和客户端NRPE服务进程沟通,调用其本地插件获取监控数据。

我自己的理解:
对于NSCA这种对监控数据主动上报的模式,我们称之为“纯被动模式”,换句话说,监控端对于获取被监控端的监控数据这项工作,完全是不参与不发起的,只有监控数据主动上上门,Nagios才会对其进行监控分析等操作。

四、Nagios服务端的配置

1. hosts.cfg

该配置文件是用来定义(需要监控的)主机及主机组的。当需要监控的服务器较少,并且服务器上需要监控的服务也较少的时候,此时监控文件的写法,可以采用单台服务器监控的策略,一台一台的添加。操作有个好处是,可以随时增减服务器的监控,比较容易上手。

  1. [root@Nagios ~]# cd /usr/local/nagios/etc/objects/
  2. [root@Nagios objects]# vim hosts.cfg
  3. #定义被监控的客户端主机(我们这里将两台Web服务器进行定义。需要监控几台就定义几台):
  4. define host{
  5. use linux-server #指定使用的模板。
  6. host_name WEB-A1 #被监控主机的名称,最好别带空格。
  7. alias WEB-A1 #对于别名的设置无关紧要,和主机名相同即可。
  8. address 172.16.1.10
  9. }
  10. define host{
  11. use linux-server
  12. host_name WEB-A2
  13. alias WEB-A2
  14. address 172.16.1.12
  15. }
  16. ---------------------
  17. #定义主机组,多个成员主机名以逗号相隔,且必须是上面定义过的。
  18. define hostgroup{
  19. hostgroup_name linux-servers
  20. alias Linux Servers
  21. members WEB-A1,WEB-A2
  22. }

配置文件的语法检查:

  1. [root@Nagios ~]# /etc/init.d/nagios checkconfig
  2. #配置修改完成后,一般要进行语法检查:
  3. Running configuration check... CONFIG ERROR! Check your Nagios configuration.
  4. #这样的错误提示无法让我们定位错误点。还可以使用下面的方法进行与法检查,能够显示详细的检查信息:
  5. [root@Nagios ~]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
  6. #但是这样要太麻烦,为了方面,我们可以修改下服务脚本:
  7. [root@Nagios ~]# vim /etc/init.d/nagios +183
  8. #在第183行处将语句结尾的重定向输出到空去掉,即
  9. $NagiosBin -v $NagiosCfgFile

2. services.cfg

Nagios主要是监控主机的各种信息,包括本机资源,对外提供的服务等等。而这些监控项目在Nagios里面都是被定义为一个个的服务(service),而要实现每个监控项目,则需要通过commands.cfg文件中定义的命令。

例如我们现在有一个监控项目是监控一台机器的Web服务是否正常,我们需要哪些元素呢?最重要的有下面三点:首先是监控哪台机,然后是这个监控要用什么命令实现,最后就是出了问题的时候要通知哪个联系人。

  1. [root@Nagios ~]# vim /usr/local/nagios/etc/objects/services.cfg
  2. #添加如下内容来定义一个监控的项目,也叫服务:
  3. define service {
  4. use generic-service #指定使用的模板。
  5. host_name WEB-A1,WEB-A2
  6. #指定了被监控的主机,而且是我们定义过的。这里可以指定多台主机,并用逗号分隔。
  7. service_description Disk Partition #这个监控项目的描述,或者说是这个项目的名称。
  8. check_command check_nrpe!check_disk
  9. #定义本监控项目所使用的指令。由于是监控远程主机的磁盘,所以使用被动模式,因而要调用check_nrpe指令,而该指令是由『commands.cfg』所定义的。
  10. #感叹号后面的指令名实际上就是客户端的『nrpe.cfg』文件中定义的指令。
  11. }

如果命令不带$ARG1$就可以在services.cfg中直接使用,如果带了使用时就带上参数,以“!”相隔。

此处输入图片的描述

3. commands.cfg

定义在监控服务(项目)中所使用的指令:

  1. [root@Nagios ~]# vim /usr/local/nagios/etc/objects/commands.cfg
  2. #如果要使用NRPE被动模式,则要在这里定义『check_nrpe』这个指令。
  3. define command{
  4. command_name check_nrpe
  5. command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
  6. #涉及到的三个宏:
  7. #$USER1$是在『resource.cfg』文件中定义的,代表插件的安装路径。
  8. #$HOSTADDRESS$则默认被定义为监控主机的地址。
  9. #$ARGn$表示第n个命令传递参数(通知、事件处理、服务检测等)。
  10. }
  11. ----------------------
  12. #上面定义的指令实际上就相当于下面的手动执行(如下图所示):
  13. [root@Nagios ~]# /usr/local/nagios/libexec/check_nrpe -H 172.16.1.10 -c check_disk
  14. DISK OK - free space: / 14373 MB (84% inode=90%);| /=2659MB;14355;16508;0;17944

我们先将上面的两个文件的关系进行小结:

services.cfg定义监控项目使用某个命令,而该命令必须在commands.cfg中进行定义。
定义该命令实际上是使用了libexec目录下的对应插件。

如果出现下面的错误信息,说明当前使用Nagios用户没有权限查看监控信息。我们需要修改cgi.cfg文件,将其中的管理员全部改为oldboy用户(系统默认的管理员为“nagiosadmin”)。

此处输入图片的描述

  1. #在该配置文件中,对不同的服务设置了不同的权限。
  2. [root@Nagios ~]# vim /usr/local/nagios/etc/cgi.cfg
  3. #在编辑其中执行全局替换指令:
  4. :g/nagiosadmin/s//oldboy/g
  5. ----------------------
  6. #由于配置文件更改,所以首先需要检查语法:
  7. [root@Nagios ~]# /etc/init.d/nagios checkconfig
  8. ...
  9. Total Warnings: 0
  10. Total Errors: 0
  11. Things look okay - No serious problems were detected during the pre-flight check
  12. OK.
  13. #然后重新加载配置文件:
  14. [root@Nagios etc]# /etc/init.d/nagios reload
  15. Running configuration check...done.
  16. Reloading nagios configuration...done

4. templates.cfg

  1. [root@Nagios ~]# cd /usr/local/nagios/etc/objects/
  2. [root@Nagios objects]# vim templates.cfg

5. 主动模式

上面所演示的都是基于NRPE的半被动模式。主动模式如前所述,一般都是对客户端对外提供的服务进行监控,例如服务进程自身,URL地址及端口号等。虽然也可以通过编写脚本来实现被动的模式,但一般很少这样做。

  1. #在监控端简单的通过主动模式对远程主机的指定端口进行检测:
  2. [root@Nagios ~]# /usr/local/nagios/libexec/check_tcp -H 172.16.1.10 -p 80
  3. TCP OK - 0.001 second response time on port 80|time=0.000923s;;;0.000000;10.000000
  4. ----------------------
  5. #对Web服务器的主动模式检测:
  6. [root@Nagios ~]# /usr/local/nagios/libexec/check_http -I 172.16.1.10
  7. HTTP OK: HTTP/1.1 200 OK - 360 bytes in 0.170 second response time |time=0.169697s;;;0.000000 size=360B;;;0

check_tcpcheck_http这两个插件是实际生产中的主动模式中最为常用的检测工具。

下面我们要对Web服务器上的一个博客站点进行访问监控:

  1. #services.cfg:
  2. define service{
  3. use generic-service
  4. host_name WEB-A1
  5. service_description blog_url
  6. check_command check_weburl!-H blog.etiantian.org
  7. #比较复杂的URL需要使用双引号括起来。
  8. max_check_attempts 3
  9. normal_check_interval 2
  10. retry_check_interval 1
  11. check_period 24x7
  12. notification_interval 30
  13. notification_period 24x7
  14. notification_options w,u,c,r
  15. contact_groups admins
  16. }
  17. ----------------------
  18. #commands.cfg:
  19. #'check_weburl' command definition
  20. define command{
  21. command_name check_weburl
  22. command_line $USER1$/check_http $ARG1$ -w 10 -c 30
  23. }

注意:如果是监控域名,需要在Nagiso服务端的/etc/hosts文件中添加客户端的域名解析条目。为了防止生产服务器频繁报错,在实际工作中我们有时也会将域名与其公网IP在hosts文件中进行解析。如此就可以防止因Nagios监控服务端自身的DNS问题导致的误报。

这里当然也有一个问题:那就是由于跳过公网DNS解析,从而导致无法监控到DNS导致的域名解析故障了。

主动模式配置小结:

① 首先在服务端的命令行里把要监控的指令事先调试好。
② 在commands.cfg文件中定义相应的命令,并调用调试好的命令行里的插件。
③ 在Nagiso服务端的services.cfg文件中定义要监控的项目,并调用已经定义好的命令。

6. 错误提示

Connection refused by host:一般是客户端的NRPE服务进程未开启,或者是防火墙阻挡。
NRPE: Unable to read output:客户端NRPE服务进程无法获取到监控数据(插件存在但执行不正常)。
CHECK_NRPE: Error - Could not complete SSL handshake.:客户端的nrpe.cfg文件中的allowed_hosts=后面没有把监控端的地址加进来。
Connection refused or timed out:客户端没有开机。
Internal Server Error:SELinux。

五、监控内容分组

1. 主机分组

服务器较多,每个服务器上监控的服务也很多,这是再采用单台的策略就不合适了,需要将Nagios的客户端归组,让管理员或是负责这些服务的人员能够一目了然的看见他管理的主机,此时需要采用Nagios的组策略来管理机器了。

  1. [root@Nagios ~]# cd /usr/local/nagios/etc/objects/
  2. [root@Nagios objects]# vim hosts.cfg
  3. ...
  4. #定义主机组,多个成员主机名以逗号相隔,且必须是上面定义过的:
  5. define hostgroup{
  6. hostgroup_name linux-servers
  7. alias Linux Servers
  8. members WEB-A1,WEB-A2
  9. }

Service Overview For All Host Groups:
此处输入图片的描述

2. 服务分组

此处输入图片的描述

在对服务进行定义时也可采用分组的策略,前提是这个组中的服务器都具有相同的监控项目。

和主机组一样,我们可以按需将相同的服务放入一个服务组,这样有规律的分类,便于我们在Web端查看。也就是说在实际工作中,如果监控的项目很多,那么在主机中查找某一类监控项目时不太好找,那么对监控项目进行分组就会方便查看某个项目中的所有主机情况。

  1. #服务分组的配置文件既可以在主配置文件中单独的指定:
  2. cfg_file=/usr/local/nagios/etc/objects/servicegroup.cfg
  3. #也可以放在我们之前加载的配置文件目录中:
  4. [root@Nagios ~]# cd /usr/local/nagios/etc/services/
  5. [root@Nagios services]# vim servicegroup.cfg
  6. #总之是怎么放置都可以。
  7. --------------------
  8. define servicegroup{
  9. servicegroup_name Swap Useage
  10. alias Linux Servers
  11. members WEB-A1,Swap Useage,WEB-A2,Swap Useage
  12. #注意分组成员的写法,比较奇怪的写法。
  13. }

3. 管理员分组

即根据不同的管理员(权限及类别)显示不同的主机和服务。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注