Linux-服务监控的搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gu_wen_jie/article/details/82020473

监控服务

监控是什么?监控的重要性是什么?为什么要做监控?需要监控什么?

从应用层来角度来看:

你公司业务的WEB 服务器拒绝连接了?
客户无法给你们的邮箱发邮件了?
论坛的大量用户无法登陆?
DNS 无法正常解析?
数据库服务器宕机了,用户无法写入数据了?
...

从服务器、应用和网络设备的角度来看:

目前服务器的CPU 负载多少,一天中那个时刻负载高,一个月中哪一天服务器CPU 的负载比较高?
磁盘的使用率是多少?
内存的使用率是多少?
...

我想上面的任何一个问题出现的话,对我们的业务造成的影响都是巨大的。

不同的公司,不同的应用,就会增加更多需要监控的对象。通过上面列举的比较常见的问题,我想,监控的重要性就不言而喻了。我们如何及时的获得这些应用的运行状态信息,在出现问题时能够及时知道,这就是监控要做的事情。

当然今天不是来说:ZABBIX (比较火的一个开源的企业级的监控服务方案),但是会做一个简单的介绍。

ZABBIX

zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。开源这个很舒服。
zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
zabbix由2部分构成,zabbix server与可选组件zabbix agent。
注意:
要想搭建一个Zabbix的工作环境,需要从服务器入手。与服务器通信,管理员需要使用一个Zabbix前端界面,与Zabbix服务器和数据库进行通信。三个关键(界面、服务器和数据库)可以安装在同一台服务器上,但是如果你拥有一个更大更复杂的环境,将它们安装在不同的主机上也是一个选项。Zabbix服务器能够直接监控到同一网络中的设备,如果其他网络的设备也需要被监控,那还需要一台Zabbix代理服务器。

今天主要是就服务端口监控来说一个小demo,所以我们直接上正文吧。想要学习zabbix的可以到官网了解一下。
ZABBIX官网https://www.zabbix.com

基于端口的监控服务

刚好我的服务器上刚刚装了swoole,我们就以swoole里的websocket服务为例,来做一个监控ws服务的监控服务。
1.首先我们启动ws服务,注意我的端口是:9503
这里写图片描述
因为我们是写demo,所以不用展示Ws.php的代码了。这个端口你测试的时候可以拿mysql的3306,redis的6379等等,所以,他只是为了启动一个服务。
我们看下,这个服务到底启动了没,再开个窗口看下:
这里写图片描述
ok,完美启动了。

2.那么我们怎么监控呢
我们先来看下这条命令吧(以当前demo监控的9503端口为例)

netstat -anp | grep 9503 | grep LISTEN | wc -l
//意思就是说这个端口一共有多少行的意思,启动了当然就是1行,如果没有启动就是0行

试着运行一下这条命令看一下,你会发现,打印出来了一个数字:1
这里写图片描述
我们就可以拿这个数字做文章。
有些人会问了,为什么这时候我打印这条命令的时候和上图类似显示了一条提示语句,然后跟了一个数字1,有的却是像下面一样只显示一个数字1呢?
这里写图片描述
注意:一定要注意你的用户什么,第一张是以guwenjie普通用户进行查看的,那条提示语句也说的很明显(…but you should be root),第二章是以root用户身份进行查看的,so…
所以我们需要将那条提示语处理掉,我们只需要那个数字才对。像这样:

netstat -anp 2>/dev/null | grep 9503 | grep LISTEN | wc -l

将多余的信息输出过滤到/dev/null
这里写图片描述

接下来就好做了:在Ws.php目录下创建一个Guard.php文件

<?php
/**
 * Created by PhpStorm.
 * User: 0375
 * Date: 2018/8/24
 * Time: 15:03
 */
class Guard{
    const PORT = 9503;

    public function port()
    {
        $shell = "netstat -anp 2>/dev/null | grep ".self::PORT." | grep LISTEN | wc -l";
        $result = shell_exec($shell);//PHP执行shell脚本函数(shell_exec())
        if($result != 1){
            //说明此事端口已经挂掉,发送报警服务,比如向管理员邮箱发送邮件或者直接发送短信提醒
            echo date("Y-m-d H:i:s")."-ERROR\n";
        }else{
            echo date("Y-m-d H:i:s")."-SUCCESS\n";
        }
    }
}
(new Guard())->port();

ok,;来测试一波吧(如果服务正常肯定走else区间否则就是if区间,我先测试启动情况然后测试未启动情况)
这里写图片描述
未启动的时候:
这里写图片描述

定时任务实现实时监控

上面的程序已经实现了监控功能,但是我们需要的是它自己实时监测,说白了就是需要一个定时任务。
那么,可以采取两种方案。

1.Linux中的crontab定时任务
2.使用swoole的定时任务

crontab定时任务的粒度为分钟,就是最小是精确到分钟的,而swoole的定时任务的粒度是毫秒级,当然也包括秒了。所以如果你想要更精确的监控可以采用swoole的定时任务,分钟级crontab也是没问题的。

如果你对crontab定时任务不太熟悉,可以查看我另一篇关于crontab定时任务的文章:Linux中的Crontab定时任务详解
在这里,我们使用swoole的定时任务来实现这个实时监控。
swoole,可能有些人会说不知道怎么安装,这种教程网上一大把,之后我也会写一个swoole的编译安装的文章,最好自己动手操作下,就是,下载,解压,./configure make -j make install 然后在php.ini配置文件中加入swoole.so扩展文件,扩展的编译安装大同小异,自己动手几次就学会了。

我们使用这个方法:swoole_timer_tick()
仔细看一下其中的参数说明和使用案例。那么上面的代码稍作改动即可:

<?php
/**
 * Created by PhpStorm.
 * User: 0375
 * Date: 2018/8/24
 * Time: 15:03
 */
class Guard{
    const PORT = 9503;

    public function port()
    {
        $shell = "netstat -anp 2>/dev/null | grep ".self::PORT." | grep LISTEN | wc -l";
        $result = shell_exec($shell);
        if($result != 1){
            //说明此时端口已经挂掉,发送报警服务,比如向管理员邮箱发送邮件或者直接发送短信提醒
            echo date("Y-m-d H:i:s")."-ERROR\n";
        }else{
            echo date("Y-m-d H:i:s")."-SUCCESS\n";
        }
    }
}

//2000毫秒,每两秒执行一次
swoole_timer_tick(2000,function ($timer_id){
    (new Guard())->port();
});

来试试吧,
这里写图片描述
可以很明显的看到,两秒钟打印一次,刚开始服务未开启,ERROR,开启后变为SUCCESS。

后台服务化

到此已经实现了实时监控了,但是我们总不可能一直开一个窗口放在这里,所以,我们需要把他做成后台服务,让他在后台自己去监控,然后将打印的信息输出到日志文件中,这样的效果会更好。

这个时候,只需要执行以下命令即可:

//nohup 用途:不挂断地运行命令。
nohup /usr/local/php/bin/php /home/wwwroot/script/Guard.php > /home/wwwroot/script/guard-log.txt &

注意:首先php一定要带上php所在路径,后面的路径信息一定要使用你的,以上都是我的路径信息,最后的 & 符号一定不要落掉。该命令表示,在后台不间断运行Guard.php脚本,并且日志信息输出到guard-log.txt文件中
这里写图片描述
这个时候你会发现那个日志文件就会不停的打印进东西:
这里写图片描述
PS:tail -f 挺好用的,比vim方便

如果你想查看该服务是否在后台运行,除了上面的查看日志文件也可以这样:

ps aux | grep /home/wwwroot/script/Guard.php

上面执行完nohub命令后,会返回进程号,如果你想要终止这个后台进程可以暴力杀死即可,例如:kill 27317

好了,一个简单的监控服务就搭建完成了,你也可以用来监控不通的服务。

猜你喜欢

转载自blog.csdn.net/gu_wen_jie/article/details/82020473