Files
baim0-learn/nginx/23. 做好Nginx的监控-下篇.md
2024-03-09 13:38:35 +08:00

15 KiB
Raw Permalink Blame History

23. 做好Nginx的监控-下篇

[配置service服务的监控]

通过上篇的学习,我们已经可以定义出监控的基本项目
不过如果想监控nginx这样的服务,我们还得学习服务的监控方法,如何在nagios中定义
定义好节点之后, 接下来 我们继续学习 如果定义一个host_group 也就是组的定义

在Nagios中 各个节点的定义毕竟是分散的,我们可以将属于一类的'节点' 统一成一个'组'

接下来 我们来看下 配置文件的定义

define hostgroup{
        hostgroup_name  linux-servers ; The name of the hostgroup
        alias           Linux Servers ; Long name of the group
        members         localhost , server02.example.com , server03.example.com,server04.example.com     ; Comma separated list of hosts that belong to this group
        }

如上这一段 添加到 localhost.cfg , 就是把之前的四个节点(包括本机) 都加入到一个host_group组当中

hostgourp_name定义组名称 很好理解
alias 则是起一个组别名

重要的是最后一项 members的定义

members 后面接上各个节点的 host_name, 注意 这里的host_name 就是节点当中的 host_name, 必须一致 ,且不可以使用别名
用逗号分隔开, 不然语法会报错

之后 我们来到Nagios页面 看一下定义的组
左边找到如下 Host Groups


之后 右边会显示这个组的信息,以及组的成员

组的定义 在企业的使用中 非常实用,企业中往往 会有少则10多个,多则上百个 大大小小不同的集群
每一个集群 都可以单独定义一个Nagios组名称, 比如 webserver_group / DB_group 等等这样
在查看监控的时候,可以快速定位集群

学会了host_group定义后,咱们再学一项新的定义内容
就是 Nagios service(服务)的定义

定义好 节点,定义好组 这两项之后,Nagios也仅仅提供了 整机监控(也就是ping联通性)
可是我们还需要监控更多的东西,比如 我们也要知道 被监控机器上 SSH服务是否可用
那接下来 就要依赖Nagios service的定义了

我们来看如下这一段,取自localhost.cfg中
这一段就是默认模板提供的 service定义方法 用来监控机器的各类服务(软件)

define host 
{host_name }

define service{
        use                             local-service         ; Name of service template to use
        host_name                       localhost
        service_description             SSH
        check_command                   check_ssh
        notifications_enabled           0
        }

基本的写法跟 定义 define_host 差不太多,不过关键字有了变化

use 字段我们保留不更改
host_name: 这里 写上在 define_host当中定义的 节点名字, 依然注意 必须跟之前的host_name一致 不然Nagios找不到
所以,这里也再次证明了, 定义节点是多么的关键,后续会大量的 二次引用

service_description 这里仅仅是 这一项服务监控的注解, 可以随意写成你要的名字

check_command 这是最关键的一项了,定义这一项服务监控 具体要监控什么内容,调用什么监控脚本去执行 (后面我们会讲到 脚本自定义)
notifications_enabled 是否开启提醒功能。1为开启,0为禁用。也就是是否 开启报警 针对这一项服务的监控(我们后面会讲到报警 Pagerduty)

学会了nagios service的定义方法后, 接下来 咱们来做一下扩展
上面SSH的实例 ,我们可以看到如下
host_name localhost
其实是针对 本机(Nagios 服务端本机) 进行的service 监控

接下来 咱们再复制添加一份SSH监控,并改成监控其他客户端

define service{
        use                             local-service         ; Name of service template to use
        host_name                       server02.example.com
        service_description             SSH
        check_command                   check_ssh
        notifications_enabled           0
        }

上面 我们只把host_name 改成 server02.example.com即可 (依然注意 必须使用完全一致的 host_name)

重启nagios服务后 再来看一下 nagios的主页

我们发现 点击service之后,右边出现了 两台机器的service监控

localhost 和 server02
所以 我们就可以以此类推 后面继续添加其他的机器 陆续进入服务监控中了

接下来 我们除了SSH service之外,再来添加一项其他的监控
我们来在 localhost.cfg 后面 添加如下 两项配置 (第一项 其实已经是自带的了)

define service{
        use                             local-service         ; Name of service template to use
        host_name                       localhost
        service_description             HTTP
        check_command                   check_http
        notifications_enabled           0
        }
define service{
        use                             local-service         ; Name of service template to use
        host_name                       server02.example.com
        service_description             HTTP
        check_command                   check_http
        notifications_enabled           0
        }

上面这两项 用来监控 本机和 server02的 HTTP服务
其中红色标记的地方 就是新改的
这次因为需要 监控http服务了, 所以使用 check_http 作为监控命令

这里添加的时候需要注意如下 两项

1) check_http 本身是监控 http url是否可以正常访问的, 默认是 以 https://IPADDRSS 来访问 (80端口)
其中的IP地址 就是你在define_host当中定义,并且延伸下来的
添加这两项监控之前 你需要保证 机器上 确实开启了 工作在80端口的 web server (apache 或者 nginx 无所谓)

2) check_http 默认是监控 例如 http://127.0.0.1/index.htm (或者是其他web server中定义的index.xxx)
所以 你还必须保证 在你的web server配置的 root路径下 要存在首页(默认apache是在 /var/www/html/ , nginx在/usr/xxx/shar/html 版本不同 请各自查看),不然 也是监控失败

3) 一旦check_http 访问失败,不能返回200 ,那么监控主页 就会显示成 warning 或者 failed

正确的监控图 如下

[服务监控的进一步探索]

上一个小节最后, 我们留下了一个问题,service监控 如果需要变通的时候 怎么办呢?

接下来 我们就得 深入一步 来学习 nagios的插件了

define service{
        use                             local-service         ; Name of service template to use
        host_name                       server02.example.com
        service_description             HTTP
        check_command                   check_http
        notifications_enabled           0
        }

上面这一段 service 配置中,红色标记的部分 ,之所以能直接调用check_http
并不是天上掉下来的 ,而是有依据的
这个依据就是 nagios的插件 (我们之前安装的时候 不是安装了很多 nagios-plugins吗 这个就是插件)

nagios 定义service中 check_command 其实就是通过调用插件当中 预先设置好的 这些脚本( check_http其实就是个脚本)
才能实现监控的

我们接下来 分如下几步来分析 这些脚本和插件的关联

1) 首先 我们先执行如下命令行
rpm中 先找到 跟http相关的 nagios插件
[root@server01 nagios]# rpm -qa | grep nagios-plugins | grep http
nagios-plugins-http-2.2.1-9git5c7eb5b9.el7.x86_64

check_http这个脚本 其实就来自于 这个插件

2)接下来 我们来查看 这个插件中 都包含了什么具体文件(脚本)
[root@server01 nagios]# rpm -ql nagios-plugins-http-2.2.1-9git5c7eb5b9.el7.x86_64
/usr/lib64/nagios/plugins/check_http

如上就可以看到 ,其实 check_http 是放在了一个 默认的 nagios插件路径当中了,作为脚本被 nagios调用

3) check_http这个脚本找到后, 我们在Linux本地来试一下

[root@server01 nagios]# /usr/lib64/nagios/plugins/check_http -H 192.168.100.108
HTTP OK: HTTP/1.1 200 OK - 275 bytes in 0.002 second response time |time=0.002124s;;;0.000000 size=275B;;;0

哦 我们发现 原来这个脚本 不光可以被 nagios的 check_command直接调用
它自身还可以直接被 咱们执行 并能返回结果

4)接下来 我们本地用这个命令 来变通一下

我们把 server02的 httpd 端口改到 8080

改好之后 原本的nagios 配置的check_http 就监控不到了
于是乎 nagios主页会变成这个样子

那么怎么办呢? 我们现在Linux本地 试试 check_http 脚本 是否支持端口改变

[root@server01 nagios]# /usr/lib64/nagios/plugins/check_http -H 192.168.100.108 -p 8080
HTTP OK: HTTP/1.1 200 OK - 275 bytes in 0.002 second response time |time=0.001994s;;;0.000000 size=275B;;;0

如上图命令行的最后, 其实可以 添加一项参数 -p 来改变端口

这样以来, check_http 就可以监控其他的端口了

但是这里咱们又遇到一个疑难问题了, 虽然这里我们使用check_http脚本本地执行 可以实现了
但是 本地执行脚本 跟 nagios service的配置 目前还没有关联起来啊,还是起不了作用呀
那咱们下一个小节开始 ,咱们继续学习 如何建立这种关联

首先我们先 找到这个配置文件
/etc/nagios/objects/commands.cfg

在找到 其中这一段配置
如下这一段配置,其实是把 check_http定义出来
名称 以及 使用方法 参数如何调用 其实都是在这里设置的

# 'check_http' command definition
define command{
        command_name    check_http
        command_line    $USER1$/check_http -I $HOSTADDRESS$ $ARG1$
        }

所以说 ,在 service(define_service)中的 check_http ,其实先要在 command.cfg中定义出来(nagios => *.cfg)
define command 就是定义一个监控脚本的关键字

接下来 咱们来看其中的这一行
command_line $USER1$/check_http -I HOSTADDRESS ARG1

这一行 就是咱们要找的关联地点了, 我们上一个小节中插件所在的路径(rpm => /usr/lib64/nagios/plugins/check_xxxx),其实存在 $USER1$/ 下

关联这个命令之后,咱们还得 给这个命令 配置参数定义

我们把 这里nagios_commonad定义的命令 和 本地命令行使用脚本的用法 放在一起

本地命令行是这么用的 /usr/lib64/nagios/plugins/check_http -I 192.168.100.108 -p 8080

command_line中 是这样的 command_line $USER1$/check_http -I HOSTADDRESS ARG1
Nagios define_host(IP)

我们注意 两行后面的 红色部分 ,这下其实不用我说 大家也看明白了
参数在两边的定义 是一一对应的
先是 -I + IP地址 , 再是 -p + 端口

不过这里有一个地方需要特别的注意
HOSTADDRESS 这里 是取自service定义当中 host_name机器对应的 ip地址
而ARG1 ,比较特殊, 这个参数的值 是需要在 service中自行定义添加进去的 (define_service , ARG1 传参数)

这么说 可能还是不太好理解, 没关系 咱们拿一段配置来给大家讲解

接下来 咱们来看一下 这样一段 service 的定义

[root@server01 nagios]# vim objects/localhost.cfg

define service{
        use                             local-service         ; Name of service template to use
        host_name                       server02.example.com
        service_description             HTTP
        check_command                   check_http!-p 8080
        notifications_enabled           0
        }

我们把之前定义的 check_http 的配置 改成如上这个样子
我们注意一下 红色标记的部分
check_command check_http!-p 8080

这就是在 service中 调用监控脚本时候,添加额外参数的方法 使用 ! 分开
!每一项参数 都用这个个离开 , 参数的使用方法 跟本地命令行 是一模一样的

不过这里细心的朋友 会有这样的一个疑问
check_command check_http!-p 8080
之前 check_http 在使用的时候,不是用了两个参数吗? -I ipaddress , -p 8080
怎么在这里 调用的时候 只有一个-p 参数呢?

说到这里 其实就回答了刚才的疑问, 现在明白了 刚才的两句解释了

HOSTADDRESS 这里 是取自service定义当中 host_name机器对应的 ip地址
而ARG1 ,比较特殊, 这个参数的值 是需要在 service中自行定义添加进去的

这几个配置文件 和插件 直接的关系 可以用如下图 来表示

接下来 我们重启 nagios来看下 监控主页 是否已经对HTTP的监控改了 端口

[自己编写任意的监控脚本]

我们注意到没有 之前我们在 使用nagios的时候 添加监控项目 要么是 nagios自己自带的
要么是 nagios_plugins* 插件包提供的

其实 Nagios插件 是完全支持 自己动手编写的 只要你写的脚本 符合了一定的规则 那么 就可以被Nagios识别了

接下来 我们来看一下如下这一段 shell 代码

这就是 一段自行编写的 nagios监控脚本

脚本实现的内容很简单, 就是通过 netstat命令来获取 Linux系统中的 等待链接数(waitting_connections)
如果大于1000就报警 ,小于1000 就属于正常
Nagios可以识别4种状态返回信息,即 0(OK)表示状态正常/绿色、1(WARNING)表示出现警告/黄色、2(CRITICAL)表示出现非常严重的错误/红色、3(UNKNOWN)表示未知错误/深黄色
Nagios根据插件返回来的值,来判断监控对象的状态,并通过web显示出来,以供管理员及时发现故障。

写好脚本后,接下来 先不管Nagios , 我们本地测试一下
本地测试好了脚本之后, 下一步, 咱们找到nrpe的配置文件, 添加一项新的命令(nrpe)

[root@server02 nrpe.d]# cat /etc/nrpe.d/lcgdm-common.cfg
command[check_cpu]=/usr/lib64/nagios/plugins/lcgdm/check_cpu
command[check_network]=/usr/lib64/nagios/plugins/lcgdm/check_network
command[check_process]=/usr/lib64/nagios/plugins/lcgdm/check_process -p rfiod,globus-gridftp-server
command[check_hostcert]=/usr/lib64/nagios/plugins/lcgdm/check_hostcert -C /etc/grid-security/hostcert.pem -s

command[check_waiting_connect]=/usr/lib64/nagios/plugins/check_waiting_connect

回到服务端 nagios 服务端添加

define service{
        use                             local-service         ; Name of service template to use
        host_name                       server02.example.com
        service_description             WAITING_CONNECTS
        check_command                   check_nrpe!check_waiting_connect
        notifications_enabled           0
        }

接下来 保证 客户端 nagios用户 有权限执行 监控脚本

然后来到服务端 检查


[root@server01 objects]# /usr/lib64/nagios/plugins/check_nrpe -H 192.168.100.108 -c check_waiting_connect
OK,waiting_connections < 1000 low

如上就是脚本的编写方法了