1. 程式人生 > >Linux-服務監控的搭建

Linux-服務監控的搭建

監控服務

監控是什麼?監控的重要性是什麼?為什麼要做監控?需要監控什麼?

從應用層來角度來看:

你公司業務的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

好了,一個簡單的監控服務就搭建完成了,你也可以用來監控不通的服務。