nagios工作原理
nagios的功能是监控服务和主机,但是其自身并不包括这些功能,所有的监控、检测功能都是通过各种插件来完成的。
启动nagios后,它会周期性的自动调用插件去检测服务器状态,同时nagios会维持一个队列,所有插件返回的状态信息都进入队列,nagios每次都从队首读取信息,进行处理后,再把状态结果通过web显示出来。这就是被动模式,经常用于监控主机的系统资源,比如系统负载、磁盘使用率、内存使用率、网络状态、系统进程数等等。
另一种是主动模式,主要是nagios服务器主动去获取数据,常用于探测URL的监控和服务的状态监控。
相比于主动模式中服务器主动去被监控机上轮询获取监控数据的方式。这样做的一个很大优势就是将除去数据处理的其他工作都放在了被监控机上面(包括数据的传输),就避免了被监控机数量大时一次轮询时间过长而导致监控反应延迟,这也是被动模式能承担更大监控量的关键。nagios提供了许多插件,利用这些插件可以方便的监控很多服务状态。安装完成后,在nagios主目录下的bxec里放有nagios自带的可以使用的所有插件。
nagios主要功能
- 网络服务监控(SMTP、POP3、HTTP、NNTP、ICMP、SNMP、FTP、SSH)
- 主机资源监控(CPU load、disk usage、system logs),也包括Windows主机(使用NSClient++ plugin)
- 指定自己编写的Plugin通过网络收集数据来监控任何情况(温度、警告……)
- 通过配置Nagios远程执行插件远程执行脚本
- 远程监控支持SSH或SSL加通道方式进行监控
- 简单的plugin设计允许用户很容易的开发自己需要的检查服务,支持很多开发语言(shell scripts、C++、Perl、ruby、Python、PHP、C#等)
- 包含很多图形化数据Plugins(Nagiosgraph、Nagiosgrapher、PNP4Nagios等)
- 可并行服务检查
- 能够定义网络主机的层次, 允许逐级检查, 就是从父主机开始向下检查
- 当服务或主机出现问题时发出通告,可通过email, pager, sms 或任意用户自定义的plugin进行通知
- 能够自定义事件处理机制重新激活出问题的服务或主机
- 自动日志循环
- 支持冗余监控
- Web界面可以查看当前网络状态,通知,问题历史,日志文件等
- nagios部署安装
nagios配置文件
每个文件或目录含义如下表所示:
- cgi.cfg 控制CGI访问的配置文件nagios.cfg Nagios 主配置文件
- resource.cfg 变量定义文件,又称为资源文件,在些文件中定义变量,以便由其他配置文件引用,如$USER1$
- objects objects 是一个目录,在此目录下有很多配置文件模板,用于定义Nagios 对象
- objects/commands.cfg 命令定义配置文件,其中定义的命令可以被其他配置文件引用
- objects/contacts.cfg 定义联系人和联系人组的配置文件
- objects/localhost.cfg 定义监控本地主机的配置文件
- objects/printer.cfg 定义监控打印机的一个配置文件模板,默认没有启用此文件
- objects/switch.cfg 定义监控路由器的一个配置文件模板,默认没有启用此文件
- objects/templates.cfg 定义主机和服务的一个模板配置文件,可以在其他配置文件中引用
- objects/timeperiods.cfg 定义Nagios 监控时间段的配置文件
- objects/windows.cfg 监控Windows 主机的一个配置文件模板,默认没有启用此文件
localhost.cfg文件本地监控:
# 第一个命令定义:
# 通过check_ping脚本确保监测主机和被监测主机的连通性,如果网络丢包率到达20%则产生warning警告,到达60%则产生critical警告:
define service{
use local-service
host_name localhost
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}
# 第二个命令定义:
#监测远程主机根分区磁盘状况,如果根分区可用空间低于20%会产生Warning警告,如果可用空间低于10%则产生Critical警告:
define service{
use local-service
host_name localhost
service_description Root Partition
check_command check_local_disk!20%!10%!/
}
# 第三个命令定义:
# 监测远程主机当前的登录用户数量,如果登录数量大于20用户则产生warning警告,如果大于50则产生critical警告:
define service{
use local-service
host_name localhost
service_description Current Users
check_command check_local_users!20!50
}
# 第四个命令定义:
# 监测远程主机当前的进程总数,如果大于700进程则产生warning警告,如果大于800进程则产生critical警告:
define service{
use local-service
host_name localhost
service_description Total Processes
check_command check_local_procs!700!800!RSZDT
}
# 第五个命令定义:
# 监测远程主机当前的僵尸进程,如果大于5进程则产生warning警告,如果大于10进程则产生critical警告:
define service{
use local-service
host_name localhost
service_description zombie Processes
check_command check_local_procs!5!10!Z
}
# 第六个命令定义:
# 监测远程主机当前的本地负载量:
define service{
use local-service
host_name localhost
service_description Current Load
check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
}
# 第七个命令定义:
# 监测远程主机swap文件系统使用量,如果swap可用空间低于20%则产生warning警告,低于10%则产生critical警告:
define service{
use local-service
host_name localhost
service_description Swap Usage
check_command check_local_swap!20!10
}
# 第八个命令定义:
# 监测SSH连接可用性,但消息通知功能默认被关闭,因为并不是所有用户都有权限SSH。
define service{
use local-service
host_name localhost
service_description SSH
check_command check_ssh
notifications_enabled 0
}
PS:这里check_command后面的命令名是/usr/local/nagios/etc/objects/command.cfg配置文件中定义的,如:
安装部署nagios
1. 环境配置
ip | 角色 | 主机名 |
10.0.0.1 | nagios监控服务端 | VM_0_10_centos |
10.0.0.2 | nagios被监控端 | VM_0_16_centos |
调整字符集:
echo 'exprot LC_ALL=C' >>/etc/profile
source /etc/profile
关闭防火墙和selinux:
systemctl stop firewalld
systemctl disable firewalld setenforce 0
[root@VM_0_10_centos nginx]# getenforce
Disabled
配置时间同步ntp:
yum -y install ntp
/usr/sbin/ntpdate pool.ntp.org
uptime
所需软件包:
nagios-4.2.1.tar.gz nagios的主软件包
nagios-plugins-2.1.2.tar.gz nagios的插件包
yum install -y \
-- gcc \
-- glibc \
-- glibc-common \
-- gd \
-- gd-devel \
-- xinetd \
-- openssl-devel
创建nagios用户和组:
[root@VM_0_10_centos src]# useradd -m nagios
[root@VM_0_10_centos src]# passwd nagios
Changing password for user nagios.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@VM_0_10_centos src]# groupadd nagcmd
[root@VM_0_10_centos src]# usermod -a -G nagcmd nagios
[root@VM_0_10_centos src]# usermod -a -G nagcmd apache
2.nagios服务端安装
2.1 下载nagios软件
[root@VM_0_10_centos src]# wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.2.1.tar.gz
[root@VM_0_10_centos src]# wget https://nagios-plugins.org/download/nagios-plugins-2.1.2.tar.gz
2.2 源码编译安装nagios以及相关插件
# 解压
[root@VM_0_10_centos src]# tar -zxvf nagios-4.2.1.tar.gz # 编译安装
[root@VM_0_10_centos nagios-4.2.1]# ./configure --with-command-group=nagcmd
[root@VM_0_10_centos nagios-4.2.1]# make all # 编译安装并初始化配置文件
[root@VM_0_10_centos nagios-4.2.1]# make install
[root@VM_0_10_centos nagios-4.2.1]# make install-init
[root@VM_0_10_centos nagios-4.2.1]# make install-config
[root@VM_0_10_centos nagios-4.2.1]# make install-webconf
[root@VM_0_10_centos nagios-4.2.1]# make install-commandmode
# 编译安装nagios插件
[root@VM_0_10_centos nagios-4.2.1]# cd ..
[root@VM_0_10_centos src]# tar -zxvf nagios-plugins-2.1.2.tar.gz
[root@VM_0_10_centos src]# cd nagios-plugins-2.1.2
[root@VM_0_10_centos nagios-plugins-2.1.2]# ./configure --with-nagios-user=nagios -
-with-nagios-group=nagios # 编译安装
[root@VM_0_10_centos nagios-plugins-2.1.2]# make
[root@VM_0_10_centos nagios-plugins-2.1.2]# make install
2.3 配置邮件联系人信息
可以编辑 /usr/local/nagios/etc/objects/contacts.cfg ,将联系人邮件地址换成你自己的。
[root@VM_0_10_centos src]# cd /usr/local/nagios/etc/objects/
[root@VM_0_10_centos objects]# pwd
/usr/local/nagios/etc/objects
[root@VM_0_10_centos objects]# cp contacts.cfg contacts.cfg.bak
编辑 vi contacts.cfg配置文件:将签名nagios改为自己邮箱
PS:若系统中需通过安装sedmail来发送邮件(yum install sendmail sendmail-cf)
想让哪个服务告警,则需要在那个服务下添加contactgroup组的信息,如:
cat /usr/local/nagios/etc/objects/contacts.cfg
[root@VM_0_10_centos src]# vi /usr/local/nagios/etc/servers/10.0.0.2.cfg
define service {
use generic-service
host_name VM_0_16_centos
service_description zombie Processes
check_command check_local_procs!5!10!Z
max_check_attempts 5
normal_check_interval 1
contact_groups admins # 这里添加服务告警
}
2.4 为nagios创建登录web界面的密码
[root@VM_0_10_centos objects]# htpasswd -c /usr/local/nagios/etc/htpasswd.users admin
New password:
Re-type new password:
Adding password for user admin
2.5 设置nagios服务开机自启并启动ngios
[root@VM_0_10_centos objects]# systemctl enable nagios
nagios.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig nagios on
[root@VM_0_10_centos objects]# chkconfig --list | grep nagios
nagios 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@VM_0_10_centos objects]# systemctl restart nagios # 检查是否成功启动
[root@VM_0_10_centos objects]# ps -ef | grep nagios # 检查文件语法是否正确(只需关注Total Warnings: 0和Total Errors: 0这两项即可)
[root@VM_0_10_centos ~]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
这里我安装的nginx和httpd,所以需要修改下httpd的端口号,不然会有冲突
# 先查看是否开启,如果开启了,stop下
[root@VM_0_10_centos ~]# systemctl status httpd # 查询httpd的配置文件
[root@VM_0_10_centos ~]# find / -name "httpd*conf" # 编辑httpd.conf配置文件(找到Listen,将默认的80修改为没有被占用的端口,我这里设置82)
[root@VM_0_10_centos ~]# vi /etc/httpd/conf/httpd.conf
Listen 82 # 保存退出,重启httpd服务即可
[root@VM_0_10_centos ~]# systemctl restart httpd
接下来通过浏览器访问nagios吧:http://ip:82/nagios
验证nagios服务端的监控功能,如实现监控服务器对被监控服务器磁盘负载情况的监控
1. 环境准备
下载安装nrpe:
# 下载nrpe源码包
[root@VM_0_10_centos src]# wget https://jaist.dl.sourceforge.net/project/nagios/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz # 确认是否安装好openssl(如果没有,安装一下)
[root@VM_0_10_centos src]# rpm -qa | grep openssl # 解压
[root@VM_0_10_centos src]# tar -zxvf nrpe-2.15.tar.gz
[root@VM_0_10_centos nrpe-2.15]# ./configure # 编译安装
[root@VM_0_10_centos nrpe-2.15]# make all
[root@VM_0_10_centos nrpe-2.15]# make install-plugin
[root@VM_0_10_centos nrpe-2.15]# make install-daemon
PS:这里server服务端的配置已完成
2. 在nagios-client以同样的方式安装nagios-plugins插件和nrpe即可,详细安装步骤参考上文。
3. 客户端配置(nagios-client)
3.1. 加入可以监控当前client的nagios-server端的ip地址如下
# 编辑nrpe的配置文件/usr/local/nagios/etc/nrpe.cfg修改大约在81行
[root@VM_0_16_centos nagios]# cp /usr/local/src/nrpe-2.15/sample-config/nrpe.cfg etc/
[root@VM_0_16_centos nagios]# chown -R nagios.nagios etc/
[root@VM_0_16_centos sample-config]# sed -i 's/allowed_hosts=127.0.0.1/allowed_hosts=10.0.0.1/g' /usr/local/nagios/etc/nrpe.cfg
3.2. /usr/local/nagios/etc/nrpe.cfg文件结尾添加要监控的插件
画圈部分为默认监控的插件,如果需要监控其他内容,可添加并安装相关的插件,本实验监控的是磁盘负载check_load,已包含在默认监控的内容里面了
3.3 启动nrpe
# 启动nrpe
[root@VM_0_16_centos nagios]# /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d # 设置开机自启
[root@VM_0_16_centos nagios]#echo "/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d" >> /etc/rc.local # 检查服务是否启动成功
[root@VM_0_16_centos nagios]# netstat -lnt | grep 5666
tcp 0 0 0.0.0.0:5666 0.0.0.0:* LISTEN
tcp6 0 0 :::5666 :::* LISTEN
[root@VM_0_16_centos nagios]# lsof -i:5666
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nrpe 5828 nagios 4u IPv4 3869385 0t0 TCP *:5666 (LISTEN)
nrpe 5828 nagios 5u IPv6 3869386 0t0 TCP *:5666 (LISTEN) # PS:重启nrpe 可以先用killall杀掉nrpe进程再启动即可
4. 服务端(nagios-server)配置
1)创建host.cfg主机文件添加被监控的主机,这里使用lohosthost.cfg作为模板取前51行作为host.cfg的模板
# 配置/usr/local/nagios4/etc/objects/localhost.cfg
[root@VM_0_10_centos src]# head -n 51 /usr/local/nagios/etc/objects/localhost.cfg > /usr/local/nagios/etc/objects/hosts.cfg
用vi编辑hosts.cfg改为以下内容
# 授权
[root@VM_0_10_centos objects]# chown -R nagios.nagios /usr/local/nagios/etc/objects/hosts.cfg
2)创建services.cfg监控服务文件添加要监控的服务
[root@VM_0_10_centos objects]# touch /usr/local/nagios/etc/objects/services.cfg
[root@VM_0_10_centos objects]# chown -R nagios.nagios /usr/local/nagios/etc/objects/services.cfg
[root@VM_0_10_centos objects]# vi /usr/local/nagios/etc/objects/services.cfg
define service {
use generic-service ; Monitor parameters using templates.cfg templates
host_name VM_0_16_centos ; The host name of the monitored server
service_description check load
check_command check_nrpe!check_load ; Service commands to monitor
}
这一步其实可以(1)(2)简化一下,将hosts.cfg和services.cfg合并为一个配置文件,具体如下
# 首先将nagios.cfg配置文件中的servers目录注释去掉,让其能读取到这个目录及目录下的文件
[root@VM_0_10_centos etc]# less nagios.cfg | grep dir
# extension) in a particular directory by using the cfg_dir
# directive as shown below:
cfg_dir=/usr/local/nagios/etc/servers # 该目录是不存在的,需要创建目录并赋予对应的权限
[root@VM_0_10_centos etc]# mkdir -p servers
[root@VM_0_10_centos etc]# chmod 755 servers/
[root@VM_0_10_centos servers]# chmod 644 services.cfg # 将services.cfg文件重命名为被监控的主机ip
[root@VM_0_10_centos servers]# mv services.cfg 10.0.0.2.cfg # 编辑10.0.0.2.cfg文件,将之前添加的hosts.cfg文件随便命名或删除即可
[root@VM_0_10_centos servers]# vi 10.0.0.2.cfg define host{
use linux-server ; Name of host template to use
; This host definition will inherit all variables that are defi
ned ; in (or inherited by) the linux-server host template definitio
n. host_name VM_0_16_centos
alias 102-server
address 10.0.0.2
}
define service {
use generic-service
host_name VM_0_16_centos # 这个地方一定要被监控主机的主机名,如果是ip会报错
service_description check load
check_command check_nrpe!check_load
max_check_attempts 5
normal_check_interval 1
} # 检查配置文件语法是否错误
[root@VM_0_10_centos servers]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # 重启nagios服务
[root@VM_0_10_centos servers]# /etc/init.d/nagios reload
Reloading nagios configuration (via systemctl): [ OK ]
3)在commands.cfg 中加入check_nrp插件配置
# 编辑/usr/local/nagios/etc/objects/commands.cfg 在文件结尾添加以下内容,这里注意下路径问题"/"
[root@VM_0_10_centos objects]# vi /usr/local/nagios/etc/objects/commands.cfg
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
4) 检查nagios主配置文件并重启
[root@VM_0_10_centos etc]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
[root@VM_0_10_centos etc]# /etc/init.d/nagios reload
Reloading nagios configuration (via systemctl): [ OK ]
5) 客户端测试是否有监控的主机及服务
打开浏览器登录nagios出现以下则说明没有监控到主机,意思为(似乎您没有权限查看您所请求的任何主机的信息…)
解决方法:
把cgi.cfg的nagiosadmin全部替换成admin(我们之前设置的登录名)
[root@VM_0_10_centos ~]# sed -i 's/nagiosadmin/admin/g' /usr/local/nagios/etc/cgi.cfg # 检查语法并重启nagios
[root@VM_0_10_centos ~]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
[root@VM_0_10_centos ~]# /etc/init.d/nagios reload
Reloading nagios configuration (via systemctl): [ OK ]
打开浏览器访问
可以看到被监控的主机的相关信息
但是上面的主机名不是被监控主机的,通过本地监控服务器上测试:
# 报错NRPE: Unable to read output
[root@VM_0_10_centos objects]# /usr/local/nagios/libexec/check_nrpe -H 10.0.0.2 -c check_load
NRPE: Unable to read output # 但是能输出nrpe版本
[root@VM_0_10_centos objects]# /usr/local/nagios/libexec/check_nrpe -H 10.0.0.2
NRPE v2.15
[root@VM_0_10_centos objects]# /usr/local/nagios/libexec/check_nrpe -H 10.0.0.2 -c check_load
OK - load average: 0.00, 0.12, 0.23|load1=0.000;15.000;30.000;0; load5=0.120;10.000;25.000;0; load15=0.230;5.000;20.000
;0;
通过上面修改的配置文件,将(1)(2)组合为一个被监控主机名.cfg文件之后,重启nagios服务,web端能看到监控的服务名了
当我点击主机名进入的时候发现报错如下:
解决:这个是nrpe的路径问题,在上面3)在commands.cfg 中加入check_nrp插件配置添加的内容中忘记将"/"斜杆加上,上班已经修正。重启nagios服务再次运行,问题解决
[root@VM_0_10_centos etc]# vi objects/commands.cfg
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
} [root@VM_0_10_centos etc]# /etc/init.d/nagios reload
Reloading nagios configuration (via systemctl): [ OK ]