nagios運維手冊

nagios運維手冊php

 

1      前言html

1.1  系統功能概述node

Nagios是一款開源的免費網絡監視工具,能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網絡設置,打印機等。在系統或服務狀態異常時發出郵件或短信報警第一時間通知網站運維人員,在狀態恢復後發出正常的郵件或短信通知。mysql

Nagios 能夠監控的功能有:linux

一、監控網絡服務(SMTP、POP三、HTTP、NNTP、PING等);ios

二、監控主機資源(處理器負荷、磁盤利用率等);nginx

三、簡單地插件設計使得用戶能夠方便地擴展本身服務的檢測方法;web

四、並行服務檢查機制;sql

五、具有定義網絡分層結構的能力,用"parent"主機定義來表達網絡主機間的關係,這種關係可被用來發現和明晰主機宕機或不可達狀態;數據庫

六、當服務或主機問題產生與解決時將告警發送給聯繫人(經過EMail、短信、用戶定義方式);

七、能夠定義一些處理程序,使之可以在服務或者主機發生故障時起到預防做用;

八、自動的日誌滾動功能;

九、能夠支持並實現對主機的冗餘監控;

十、可選的WEB界面用於查看當前的網絡狀態、通知和故障歷史、日誌文件等;


2      安裝配置

2.1  安裝配置nagios

2.1.1      安裝依賴程序

yum install gcc glibc glibc-common gd gd-devel xinetd openssl-devel

2.1.2      建立nagios用戶和用戶組

useradd -s /sbin/nologin nagios

mkdir /usr/local/nagios

chown -R nagios.nagios /usr/local/nagios

2.1.3      安裝nagios

wget http://cznic.dl.sourceforge.net/project/nagios/nagios-4.x/nagios-4.0.8/nagios-4.0.8.tar.gz

tar zxvf nagios-4.0.8.tar.gz

nagios在nginx+fcgi下會出如今web界面下設置主機信息的時候出錯502,這是須要

到nagios源代碼目錄的cgi目錄,找到cmd.c文件,搜索post,只有一個,修改成get

vi /usr/local/src/nagios-4.0.8/cgi/cmd.c

printf("<form method='post' action='%s'>\n", COMMAND_CGI);

改爲

printf("<form method='get' action='%s'>\n", COMMAND_CGI);

cd Nagios-4.0.8

./configure --prefix=/usr/local/nagios

make all

make install

make install-init

make install-commandmode

make install-config

make install-cgis

 

chkconfig --add nagios

chkconfig --level 3 nagios on

2.1.4      nagios目錄說明

切換目錄到安裝路徑(這裏是/usr/local/nagios),看是否存在etc、bin、sbin、share、var 這五個目錄,若是存在則能夠代表程序被正確的安裝到系統了。Nagios 各個目錄用途說明以下:

目錄 說明
bin Nagios 可執行程序所在目錄
etc Nagios 配置文件所在目錄
sbin Nagios CGI 文件所在目錄,也就是執行外部命令所需文件所在的目錄
share Nagios網頁文件所在的目錄
libexec Nagios 外部插件所在目錄
var Nagios 日誌文件、lock 等文件所在的目錄
var/archives Nagios 日誌自動歸檔目錄
var/rw 用來存放外部命令文件的目錄

2.1.5      安裝Nagiosplugins

wget http://nagios-plugins.org/download/nagios-plugins-2.0.3.tar.gz

tar zxvf nagios-plugins-2.0.3.tar.gz

cd nagios-plugins-2.0.3

./configure --prefix=/usr/local/nagios

make && make install

2.1.6      配置nagios

l  配置文件和目錄說明

文件名或目錄 用途
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 主機的一個配置文件模板,默認沒有啓用此文件

 

l  resource.cfg文件

resource.cfg是nagios的變量定義文件,文件內容只有一行:

$USER1$=/usr/local/nagios/libexec

其中,變量$USER1$指定了安裝nagios插件的路徑,若是把插件安裝在了其它路徑,只需在這裏進行修改便可。須要注意的是,變量必須先定義,而後才能在其它配置文件中進行引用。

l  commands.cfg文件

此文件默認是存在的,無需修改便可使用,固然若是有新的命令須要加入時,在此文件進行添加便可。

#notify-host-by-email命令的定義
define command{
        command_name    notify-host-by-email             #命令名稱,即定義了一個主機異常時發送郵件的命令。
        command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$                                     #命令具體的執行方式。
        }
#notify-service-by-email命令的定義
define command{
        command_name    notify-service-by-email          #命令名稱,即定義了一個服務異常時發送郵件的命令
        command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
        }
#check-host-alive命令的定義
define command{
        command_name    check-host-alive                 #命令名稱,用來檢測主機狀態。
        command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5            
                        # 這裏的變量$USER1$在resource.cfg文件中進行定義,即$USER1$=/usr/local/nagios/libexec;
                        # 那麼check_ping的完整路徑爲/usr/local/nagios/libexec/check_ping;
                        # 「-w 3000.0,80%」中「-w」說明後面的一對值對應的是「WARNING」狀態,「80%」是其臨界值。
                        # 「-c 5000.0,100%」中「-c」說明後面的一對值對應的是「CRITICAL」,「100%」是其臨界值。
                        # 「-p 1」說明每次探測發送一個包。
        }
define command{
        command_name    check_local_disk
        command_line    $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$            #$ARG1$是指在調用這個命令的時候,命令後面的第一個參數。
        }

 

l  hosts.cfg文件

此文件默認不存在,須要手動建立,hosts.cfg主要用來指定被監控的主機地址以及相關屬性信息:

define host{  
        use                     linux-server          #引用主機linux-server的屬性信息,linux-server主機在templates.cfg文件中進行了定義。
        host_name               Nagios-Linux          #主機名
        alias                   Nagios-Linux          #主機別名
        address                 192.168.1.111         #被監控的主機地址,這個地址能夠是ip,也能夠是域名。
        }  
#定義一個主機組  
define hostgroup{     
        hostgroup_name          bsmart-servers        #主機組名稱,能夠隨意指定。
        alias                   bsmart servers        #主機組別名
        members                 Nagios-Linux          #主機組成員,其中「Nagios-Linux」就是上面定義的主機。    
        }

 

l  services.cfg文件

此文件默認也不存在,須要手動建立,services.cfg文件主要用於定義監控的服務和主機資源,例如監控http服務、ftp服務、主機磁盤空間、主機系統負載等等。

define service{ 
        use                     local-service          #引用local-service服務的屬性值,local-service在templates.cfg文件中進行了定義。
        host_name               Nagios-Linux           #指定要監控哪一個主機上的服務,「Nagios-Server」在hosts.cfg文件中進行了定義。
        service_description     check-host-alive       #對監控服務內容的描述,以供維護人員參考。
        check_command           check-host-alive       #指定檢查的命令。
        } 

 

l  contacts.cfg文件

contacts.cfg是一個定義聯繫人和聯繫人組的配置文件,當監控的主機或者服務出現故障,nagios會經過指定的通知方式(郵件或者短信)將信息發給這裏指定的聯繫人或者使用者。

define contact{
        contact_name                    David             #聯繫人的名稱,這個地方不要有空格
        use                             generic-contact   #引用generic-contact的屬性信息,其中「generic-contact」在templates.cfg文件中進行定義
        alias                           Nagios Admin
        email                           david.tang@bsmart.cn
        }
define contactgroup{
        contactgroup_name       ts                              #聯繫人組的名稱,一樣不能空格
        alias                   Technical Support               #聯繫人組描述
        members                 David                           #聯繫人組成員,其中「david」就是上面定義的聯繫人,若是有多個聯繫人則以逗號相隔
        }

 

l  timeperiods.cfg文件

此文件只要用於定義監控的時間段,下面是一個配置好的實例:

#下面是定義一個名爲24x7的時間段,即監控全部時間段 
define timeperiod{ 
        timeperiod_name 24x7       #時間段的名稱,這個地方不要有空格
        alias           24 Hours A Day, 7 Days A Week 
        sunday          00:00-24:00 
        monday          00:00-24:00 
        tuesday         00:00-24:00 
        wednesday       00:00-24:00 
        thursday        00:00-24:00 
        friday          00:00-24:00 
        saturday        00:00-24:00 
        } 
#下面是定義一個名爲workhours的時間段,即工做時間段。 
define timeperiod{ 
        timeperiod_name workhours  
        alias           Normal Work Hours 
        monday          09:00-17:00 
        tuesday         09:00-17:00 
        wednesday       09:00-17:00 
        thursday        09:00-17:00 
        friday          09:00-17:00 
        } 

 

l  nagios.cfg文件

nagios.cfg默認的路徑爲/usr/local/nagios/etc/nagios.cfg,是nagios的核心配置文件,全部的對象配置文件都必須在這個文件中進行定義才能發揮其做用,這裏只需將對象配置文件在Nagios.cfg文件中進行引用便可。

log_file=/usr/local/nagios/var/nagios.log                  # 定義nagios日誌文件的路徑
cfg_file=/usr/local/nagios/etc/objects/commands.cfg        # 「cfg_file」變量用來引用對象配置文件,若是有更多的對象配置文件,在這裏依次添加便可。
cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
cfg_file=/usr/local/nagios/etc/objects/hosts.cfg
cfg_file=/usr/local/nagios/etc/objects/services.cfg
cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg
cfg_file=/usr/local/nagios/etc/objects/templates.cfg
cfg_file=/usr/local/nagios/etc/objects/localhost.cfg       # 本機配置文件
cfg_file=/usr/local/nagios/etc/objects/windows.cfg         # windows 主機配置文件
object_cache_file=/usr/local/nagios/var/objects.cache      # 該變量用於指定一個「全部對象配置文件」的副本文件,或者叫對象緩衝文件
precached_object_file=/usr/local/nagios/var/objects.precache
resource_file=/usr/local/nagios/etc/resource.cfg           # 該變量用於指定nagios資源文件的路徑,能夠在nagios.cfg中定義多個資源文件。
status_file=/usr/local/nagios/var/status.dat               # 該變量用於定義一個狀態文件,此文件用於保存nagios的當前狀態、註釋和宕機信息等。
status_update_interval=10                                  # 該變量用於定義狀態文件(即status.dat)的更新時間間隔,單位是秒,最小更新間隔是1秒。
nagios_user=nagios                                         # 該變量指定了Nagios進程使用哪一個用戶運行。
nagios_group=nagios                                        # 該變量用於指定Nagios使用哪一個用戶組運行。
check_external_commands=1                                  # 該變量用於設置是否容許nagios在web監控界面運行cgi命令;
                                                           # 也就是是否容許nagios在web界面下執行重啓nagios、中止主機/服務檢查等操做;
                                                           # 「1」爲運行,「0」爲不容許。
command_check_interval=10s                                 # 該變量用於設置nagios對外部命令檢測的時間間隔,若是指定了一個數字加一個"s"(如10s);
                                                           # 那麼外部檢測命令的間隔是這個數值以秒爲單位的時間間隔;
                                                           # 若是沒有用"s",那麼外部檢測命令的間隔是以這個數值的「時間單位」的時間間隔。
interval_length=60                                         # 該變量指定了nagios的時間單位,默認值是60秒,也就是1分鐘;
                                                           # 即在nagios配置中全部的時間單位都是分鐘。

2.1.7      驗證Nagios 配置文件的正確性

Nagios 在驗證配置文件方面作的很是到位,只需經過一個命令便可完成:

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

看到下面這些信息就說明沒問題了,如圖(圖1)

圖1

2.1.8      Nagios的啓動與中止

l  啓動Nagios

/etc/init.d/nagios start

l  重啓Nagios

/etc/init.d/nagios reload

or

/etc/init.d/nagios restart

l  中止Nagios

/etc/init.d/nagios stop

2.1.9      登錄nagios

登陸Nagios Web監控頁http://IP/nagios/ 查看相關信息。如圖(圖2)

圖2

 

2.2  安裝配置nginx

2.2.1      安裝nginx

詳見cacti運維手冊

2.2.2      配置nginx

l  修改nginx.conf配置文件(增長紅色部分)

user  webuser users;
worker_processes  1;
 
#error_log  logs/error.log;
error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    #access_log  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
server {
        listen       80;
        server_name  10.0.112.100;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm index.php;
        }
 
 
 
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi.conf;
            fastcgi_ignore_client_abort on;
        }
 
 
        location ~ .*\.(cgi|pl)?$ {
        gzip off;
        root   /usr/local/nagios/sbin;
        rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
        fastcgi_pass  unix:/opt/nginx/logs/perl-fcgi.sock;
        fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name;
        fastcgi_index index.cgi;
        fastcgi_read_timeout   60;
        fastcgi_param  REMOTE_USER        $remote_user;
        include        fastcgi_params;
        }
    }
}

l  將nagios頁面路徑連接到網站文件存放路徑

ln -s /usr/local/nagios/share/ /opt/nginx/html/nagios

2.2.3      nginx的perl環境

Nagios依賴PHP環境和perl環境。因爲Nginx不支持Perl的CGI,這裏就須要先來搭建Perl環境。讓nginx支持fcgi

l  安裝FCGI-ProcManager模塊

wget http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/FCGI-0.73.tar.gz

tar -zxvf FCGI-ProcManager-0.73.tar.gz

cd FCGI-ProcManager-0.73

perl Makefile.PL

make

make install

 

l  安裝FCGI-0.73

tar zxvf FCGI-0.73.tar.gz

cd FCGI-0.73

perl Makefile.PL

make

make install

 

l  安裝IO和IO::ALL模塊

wget http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/IO-1.25.tar.gz

tar -zxvf IO-1.25.tar.gz

cd IO-1.25

perl Makefile.PL

make

make install

 

wget http://search.cpan.org/CPAN/authors/id/I/IN/INGY/IO-All-0.41.tar.gz

tar -zxvf IO-All-0.41.tar.gz

cd IO-All-0.41

perl Makefile.PL

make

make install

 

l  下載Perl腳本,這個腳本的目的就是產生一個PERL的FastCGI接口,讓Nginx能夠以CGI方式處理Perl。

wget http://www.mike.org.cn/wp-content/uploads/2011/07/perl-fcgi.zip

unzip perl-fcgi.zip

mv perl-fcgi.pl /opt/nginx/

chmod 755 /opt/nginx/perl-fcgi.pl

 

l  創建一個CGI啓動/中止腳本,注意pidfile和dir路徑。

vi /etc/init.d/perl-fcgi

#!/bin/bash
# chkconfig:   - 99 15
# description: perl-fcgi
# processname: perl-fcgi
# pidfile: /usr/local/webserver/nginx/logs/perl-fcgi.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
#set -x
dir=/opt/nginx
 
stop ()
{
#pkill  -f  $dir/perl-fcgi.pl
kill $(cat $dir/logs/perl-fcgi.pid)
rm $dir/logs/perl-fcgi.pid 2>/dev/null
rm $dir/logs/perl-fcgi.sock 2>/dev/null
echo "stop perl-fcgi done"
}
 
start ()
{
rm $dir/now_start_perl_fcgi.sh 2>/dev/null
rm $dir/logs/perl-fcgi.pid 2>/dev/null
rm $dir/logs/perl-fcgi.sock 2>/dev/null
chown webuser.users $dir/logs
echo "$dir/perl-fcgi.pl -l $dir/logs/perl-fcgi.log -pid $dir/logs/perl-fcgi.pid -S $dir/logs/perl-fcgi.sock" >>$dir/now_start_perl_fcgi.sh
 
chown webuser.users $dir/now_start_perl_fcgi.sh
chmod u+x $dir/now_start_perl_fcgi.sh
 
sudo -u webuser $dir/now_start_perl_fcgi.sh
echo "start perl-fcgi done"
}
 
case $1 in
stop)
stop
;;
start)
start
;;
restart)
stop
start
;;
esac

chmod 755 /etc/init.d/perl-fcgi

chkconfig --add perl-fcgi

chkconfig perl-fcgi on

 

因爲啓動腳本里使用了sudo,因此當服務器重啓並加載這個服務腳本時會提示須要一個tty,致使fcgi不能隨服務器一塊兒啓動起來,因此要修改/etc/sudoers

vi /etc/sudoers

Defaults requiretty,修改成 Defaults:webuser! requiretty 表示僅webuser用戶不須要控制終端。

啓動腳本,正常狀況下在/opt/nginx/logs下生成perl-fcgi.sock這個文件,若是沒有生成,請檢查下上面的步聚。

 

vi  /usr/local/nagios/etc/cgi.cfg

use_authentication=1 #把1修改成0,保存

l  啓動nginx

/etc/init.d/nginx start

 

2.3  安裝配置PHP

詳見cacti運維手冊

2.4  安裝插件ndoutils

(若是要整合cacti,此步跳過看2.5)

該插件能夠將nagios監控結果保存到mysql中

cd ndoutils-2.0.0

./configure  --enable-mysql --with-ndo2db-user=nagios --with-ndo2db-group=nagios

make

l  將源目錄下的相關文件考到相應位置並修改權限

cp src/{ndomod-4x.o,ndo2db-4x,log2ndo,file2sock} /usr/bin/

cp config/ndo2db.cfg-sample /usr/local/nagios/etc/ndo2db.cfg

cp config/ndomod.cfg-sample /usr/local/nagios/etc/ndomod.cfg

chown nagios.nagios /usr/local/nagios/etc/ndo*

l  生成數據庫

mysql> create database nagios;

Query OK, 1 row affected (0.02 sec)

mysql> grant all on nagios.* to nagios@127.0.0.1 IDENTIFIED BY 'nagios123';

Query OK, 0 rows affected (0.07 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

mysql> quit

Bye

 

l  修改ndo2db配置文件

vi /usr/local/nagios/etc/ndo2db.cfg

db_host=127.0.0.1

db_port=3306

db_name=nagios

db_prefix=nagios_

db_user=nagios

db_pass=nagios123

l  將ndo2db啓動腳本放到系統目錄下

cp /usr/local/src/ndoutils-2.0.0/daemon-init /etc/init.d/ndo2db

l  編輯該啓動腳本

vi /etc/init.d/ndo2db

Ndo2dbBin=/usr/bin/ndo2db-4x

l  修改啓動腳本權限並啓動

chmod +x /etc/init.d/ndo2db

chkconfig --add ndo2db

chkconfig ndo2db on

/etc/init.d/ndo2db start

l  修改nagios配置文件,讓nagios支持ndomod這個broker

vi /usr/local/nagios/etc/nagios.cfg

broker_module=/usr/bin/ndomod-4x.o config_file=/usr/local/nagios/etc/ndomod.cfg

event_broker_options=-1

l  重啓nagios

/etc/ini.d/nagios restart

2.5  整合cacti和nagios

2.5.1      安裝配置ndoutils插件

該插件能夠將nagios監控結果保存到mysql中

wget http://nchc.dl.sourceforge.net/project/nagios/ndoutils-2.x/ndoutils-2.0.0/ndoutils-2.0.0.tar.gz

cd ndoutils-2.0.0

./configure  --enable-mysql --with-ndo2db-user=nagios --with-ndo2db-group=nagios

make

l  將源目錄下的相關文件考到相應位置並修改權限

cp src/{ndomod-4x.o,ndo2db-4x,log2ndo,file2sock} /usr/bin/

cp config/ndo2db.cfg-sample /usr/local/nagios/etc/ndo2db.cfg

cp config/ndomod.cfg-sample /usr/local/nagios/etc/ndomod.cfg

chown nagios.nagios /usr/local/nagios/etc/ndo*

l  修改ndo2db配置文件

vi /usr/local/nagios/etc/ndo2db.cfg

db_host=127.0.0.1

db_port=3306

db_name=cacti

db_prefix=npc_

db_user=cacti

db_pass=cacti100

l  將ndo2db啓動腳本放到系統目錄下

cp /usr/local/src/ndoutils-2.0.0/daemon-init /etc/init.d/ndo2db

l  編輯該啓動腳本

vi /etc/init.d/ndo2db

Ndo2dbBin=/usr/bin/ndo2db-4x

l  修改啓動腳本權限並啓動

chmod +x /etc/init.d/ndo2db

chkconfig --add ndo2db

chkconfig ndo2db on

/etc/init.d/ndo2db start

l  修改nagios配置文件,讓nagios支持ndomod這個broker

vi /usr/local/nagios/etc/nagios.cfg

broker_module=/usr/bin/ndomod-4x.o config_file=/usr/local/nagios/etc/ndomod.cfg

event_broker_options=-1

l  重啓nagios

/etc/ini.d/nagios restart

2.5.2      安裝npc插件

l  下載插件

wget http://www.constructaegis.com/downloads/npc-2.0.4.tar.gz

l  安裝插件

mv npc /opt/nginx/html/cacti/plugins/

chown webuser. -R /opt/nginx/html/cacti/plugins/

l  登錄cacti,安裝npc插件,如圖(圖3)

圖3

 

l  配置 npc

Console -> Settings -> npc

鉤選Remote Commands

Nagios Command File Path:      /usr/local/nagios/var/rw/nagios.cmd

Nagios URL:                    http://yourserver/Nagios

如圖(圖4)

圖4

 

l  添加執行權限

chmod +x /usr/local/nagios/var/rw/nagios.cmd

 

l  mysql修改表結構,不然npc無數據

alter table npc_eventhandlers add long_output TEXT NOT NULL default '' after output;

alter table npc_hostchecks add long_output TEXT NOT NULL default '' after output;

alter table npc_hoststatus add long_output TEXT NOT NULL default '' after output;

alter table npc_notifications add long_output TEXT NOT NULL default '' after output;

alter table npc_servicechecks add long_output TEXT NOT NULL default '' after output;

alter table npc_servicestatus add long_output TEXT NOT NULL default '' after output;

alter table npc_statehistory add long_output TEXT NOT NULL default '' after output;

alter table npc_systemcommands add long_output TEXT NOT NULL default '' after output;

2.5.3      登錄nagios

登陸Nagios Web監控頁http://IP/nagios/ 查看相關信息。如圖(圖5)

圖5

 

3      監控設置

3.1  nrpe監控

3.1.1      前言

上面已經對遠程Linux 主機是否存活作了監控,而判斷遠程機器是否存活,咱們可使用ping 工具對其監測。還有一些遠程主機服務,例如ftp、ssh、http,都是對外開放的服務,即便不用Nagios,咱們也能夠試的出來,隨便找一臺機器看能不能訪問這些服務就好了。可是對於像磁盤容量,cpu負載這樣的「本地信息」,Nagios只能監測本身所在的主機,而對其餘的機器則顯得有點無能爲力。畢竟沒獲得被控主機的適當權限是不可能獲得這些信息的。爲了解決這個問題,nagios有這樣一個附加組件--「NRPE」,用它就能夠完成對Linux 類型主機"本地信息」的監控。

3.1.2      工做原理圖,如圖(圖6)

圖6

NRPE 總共由兩部分組成:

check_nrpe 插件,位於監控主機上

NRPE daemon,運行在遠程的Linux主機上(一般就是被監控機)

按照上圖,整個的監控過程以下:

當Nagios 須要監控某個遠程Linux 主機的服務或者資源狀況時:

Nagios 會運行check_nrpe 這個插件,告訴它要檢查什麼;

check_nrpe 插件會鏈接到遠程的NRPE daemon,所用的方式是SSL;

NRPE daemon 會運行相應的Nagios 插件來執行檢查;

NRPE daemon 將檢查的結果返回給check_nrpe 插件,插件將其遞交給nagios作處理。

注意:NRPE daemon 須要Nagios 插件安裝在遠程的Linux主機上,不然,daemon不能作任何的監控。

3.1.3      安裝nagiosplugins(被監控機

nagios監控linux服務器,須要讓被監控的linux服務器安裝nrpe+nagiosplugins

wget http://nagios-plugins.org/download/nagios-plugins-2.0.3.tar.gz

tar zxvf nagios-plugins-2.0.3.tar.gz

cd nagios-plugins-2.0.3

./configure --prefix=/usr/local/nagios

make && make install

3.1.4      安裝nrpe(被監控機,監控機

l  建立nagios用戶

useradd nagios

設置禁止nagios用戶登錄

nagios:x:500:500::/home/nagios:/sbin/nologin

l  下載nrpe

wget http://nchc.dl.sourceforge.net/project/nagios/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz

tar zxvf nrpe-2.15.tar.gz

cd nrpe-2.15

./configure

make all

安裝check_nrpe 這個插件

make install-plugin (監控機

監控機須要安裝check_nrpe 這個插件,被監控機並不須要,咱們在這裏安裝它只是爲了測試目的。

 

安裝deamon

make install-daemon (被監控機

 

安裝配置文件

make install-daemon-config (被監控機

 

3.1.5      安裝xinted(被監控機

yum install xinetd

l  安裝xinted 腳本

make install-xinetd(接上面安裝nrpe)

能夠看到建立了這個文件

l  編輯這個腳本:

在only_from 後增長監控主機的IP地址。(如圖,圖7)

vi /etc/xinetd.d/nrpe

圖7

l  編輯/etc/services文件,增長NRPE服務

vi /etc/services (如圖,圖8)

圖8

l  啓動xinted 服務

/etc/init.d/xinetd start

查看NRPE 是否已經啓動(如圖,圖9)

圖9

l  測試NRPE是不然正常工做

使用上面在被監控機上安裝的check_nrpe 這個插件測試NRPE 是否工做正常。

/usr/local/nagios/libexec/check_nrpe -H 10.0.0.101

會返回當前NRPE的版本,也就是在本地用check_nrpe鏈接nrpe daemon是正常的。(如圖,圖10)

 

圖10

3.1.6      check_nrpe(被監控機)

check_nrpe –H 被監控的主機 -c 要執行的監控命令

注意:-c 後面接的監控命令必須是nrpe.cfg 文件中定義的。也就是NRPE daemon只運行nrpe.cfg中所定義的命令。

l  nrpe配置文件

vi /usr/local/nagios/etc/nrpe.cfg

log_facility=daemon
pid_file=/var/run/nrpe.pid
server_port=5666
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=127.0.0.1
 
dont_blame_nrpe=0
debug=0
command_timeout=60
connection_timeout=300
command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
command[check_sda1]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda1
command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200

紅色部分是命令名,也就是check_nrpe 的-c 參數能夠接的內容,等號 「=」 後面是實際執行的插件程序(這與commands.cfg 中定義命令的形式十分類似,只不過是寫在了一行)。也就是說check_users 就是等號後面/usr/local/nagios/libexec/check_users -w 5 -c 10 的簡稱。

咱們能夠很容易知道上面這5行定義的命令分別是檢測登錄用戶數,cpu負載,sda1的容量,殭屍進程,總進程數。各條命令具體的含義見插件用法(執行「插件程序名 –h」)。

 

l  命令測試

被監控機測試:

/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20

OK - load average: 1.17, 1.16, 1.11|load1=1.170;15.000;30.000;0; load5=1.160;10.000;25.000;0; load15=1.110;5.000;20.000;0;

/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda2

DISK OK - free space: /oracle 25443 MB (53% inode=97%);| /oracle=22392MB;40316;45356;0;50396

監控機測試:

./check_nrpe -H 10.0.0.101 -c check_load

OK - load average: 1.11, 1.10, 1.09|load1=1.110;15.000;30.000;0; load5=1.100;10.000;25.000;0; load15=1.090;5.000;20.000;0;

./check_nrpe -H 10.0.0.101 -c check_sda2

DISK OK - free space: /oracle 25443 MB (53% inode=97%);| /oracle=22392MB;40316;45356;0;50396

 

3.1.7      check_nrpe(監控機)

l  在commands.cfg中增長對check_nrpe的定義

vi /usr/local/nagios/etc/objects/commands.cfg

增長以下內容:

define command{

        command_name    check_nrpe

        command_line    /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$

        }

-c 後面帶的$ARG1$ 參數是傳給nrpe daemon 執行的檢測命令,以前說過了它必須是nrpe.cfg 中所定義的那5條命令中的其中一條。在services.cfg 中使用check_nrpe 的時候要用 「!」 帶上這個參數。

l  定義主機的監控

下面就能夠在services.cfg 中定義主機的監控了。

define service{

        use                     generic-service

        host_name               CPP-Linux

        service_description     Current Load

        check_command           check_nrpe!check_load

        }

 

 

define service{

        use                     generic-service

        host_name               CPP-Linux

        service_description     Check Disk sda2

        check_command           check_nrpe!check_sda2

        }

 

 

define service{

        use                     generic-service

        host_name               CPP-Linux

        service_description     Check Disk sdb1

        check_command           check_nrpe!check_sdb1

        }

l  全部的配置文件已經修改好了,如今重啓Nagios。

/etc/init.d/nagios restart

3.1.8      附錄CPU load average解析

l  什麼是load average

linux系統中的Load對當前CPU工做量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing)。也有簡單的說是進程隊列的長度。

       Load Average 就是一段時間 (1 分鐘、5分鐘、15分鐘) 內平均 Load 。

咱們能夠經過系統命令"w"查看當前load average狀況

 [root@CNC-BJ-5-3N1 ~]# w

20:01:55 up 76 days, 8:20, 6 users, load average: 1.30, 1.48, 1.69

 

上面內容顯示系統負載爲「1.30, 1.48, 1.69」,這3個值是什麼意思呢?

第一位1.30:表示最近1分鐘平均負載

第二位1.48:表示最近5分鐘平均負載

第三位1.69:表示最近15分鐘平均負載

PS. linux系統是5秒鐘進行一次Load採樣

l  load average值的含義

單核處理器

假設咱們的系統是單CPU單內核的,把它比喻成是一條單向馬路,把CPU任務比做汽車。當車很少的時候,load <1;當車佔滿整個馬路的時候 load=1;當馬路都站滿了,並且馬路外還堆滿了汽車的時候,load>1。如圖:

多核處理器

咱們常常會發現服務器Load > 1可是運行仍然不錯,那是由於服務器是多核處理器(Multi-core)。

假設咱們服務器CPU是2核,那麼將意味咱們擁有2條馬路,咱們的Load = 2時,全部馬路都跑滿車輛。如圖:

#查看CPU core

grep 'model name' /proc/cpuinfo | wc -l

l  什麼樣的Load average值要提升警戒

0.7 < load < 1: 此時是不錯的狀態,若是進來更多的汽車,你的馬路仍然能夠應付。

load = 1: 你的馬路即將擁堵,並且沒有更多的資源額外的任務,趕忙看看發生了什麼吧。

load > 5: 很是嚴重擁堵,咱們的馬路很是繁忙,每輛車都沒法很快的運行。

l  三種Load值,應該看哪一個

一般咱們先看15分鐘load,若是load很高,再看1分鐘和5分鐘負載,查看是否有降低趨勢。

1分鐘負載值 > 1,那麼咱們不用擔憂,可是若是15分鐘負載都超過1,咱們要趕忙看看發生了什麼事情。因此咱們要根據實際狀況查看這三個值。

3.2  自定義snmp監控

3.2.1      前言

Nagios插件能夠用任何一門編程語言來編寫,只要該編程語言在運行Nagios的平臺上獲得支持。Bash是用來編寫Nagios插件的一門流行語言,由於它功能強大、使用簡單。

  藉助插件進行的每一次有效的Nagios檢查(Nagios check)都會生成一個數字表示的退出狀態。可能的狀態有:

  ● 0--各方面都正常,檢查成功完成。

  ● 1--資源處於警告狀態。某個地方不太妙。

  ● 2--資源處於臨界狀態。緣由多是主機宕機或服務未運行。

● 3--未知狀態,這未必代表就有問題,而是代表檢查沒有給出一個清楚明確的狀態。

(狀態由/usr/local/nagios/libexec/utils.sh腳本定義)

插件還能輸出文本消息。默認狀況下,該消息顯示在Nagios web界面和Nagios郵件警報信息中。儘管消息並非硬性要求,你一般仍是能夠在可用插件中找到它們,由於消息告訴用戶出了什麼岔子,而不會迫使用戶查閱說明文檔。

3.2.2      工做原理圖,如圖(圖11)

圖11

原理圖解釋:

1. 首先在被監控機上編寫自定義監控的腳本,並給出監控信息。

2. 將監控信息賦予OID號給予snmp程序

3. snmp程序將OID號經過snmp端口協議發送給監控機。

4. 監控機經過check_snmp_extend.sh腳本拿取OID號裏的內容判斷監控結果。

5. nagios程序將定時拿取check_snmp_extend.sh腳本給出的監控結果並判斷是否報警。

3.2.3      自定義監控腳本(被監控機

好比這裏編寫一個判斷CPP主程序是否存在的腳本,內容以下:

#!/bin/bash
AVNO=`ps -ef | grep avnostop | grep -v grep | awk -F" " '{ print $2 }'`
if [ ! -z $AVNO ];
then
        echo "OK"
else
        echo "CRITICAL"
fi

程序存在將顯示OK,不存在顯示CRITICAL(這裏顯示內容其餘自定義腳本也必須同樣,這樣監控機腳本方便進行判斷)

3.2.4      snmp設置(被監控機

l  修改snmpd.conf配置文件

vi /etc/snmp/snmpd.conf

在最後一行加入

extend .1.3.6.1.4.1.2023.1 cpp /usr/local/bin/cpp.sh

關於oid號選擇詳見cacti運維手冊

 

l  重啓snmpd服務

/etc/init.d/snmpd restart

 

3.2.5      使用nagios的check_snmp(監控機)

注意:若是使用check_snmp,3.2.6和3.2.7就沒必要操做

l  使用nagios自帶的check_snmp命令來判斷

/usr/local/nagios/libexec/check_snmp -H 115.29.224.191 -C logic2015 -o .1.3.6.1.4.1.2023.1.4.1.2.11.99.104.101.99.107.95.109.121.115.113.108.1 -r OK

l  修改nagios配置

vi /usr/local/nagios/etc/objects/commands.cfg

修改以下配置:

define command{

        command_name    check_snmp

        command_line    $USER1$/check_snmp -H $HOSTADDRESS$ -C logic -o $ARG1$ -r OK –l $ARG2$

        }

l  在services.cfg中增長監控

define service{

        use                     generic-service

        host_name               aliyun-linux-115.29.224.191

        service_description     Check Mysql Program

        check_command           check_snmp!.1.3.6.1.4.1.2023.1.4.1.2.11.99.104.101.99.107.95.109.121.115.113.108.1!"Check Mysql Program"

        }

3.2.6      安裝check_snmp_extend.sh(監控機

l  下載check_snmp_extend.sh

wget http://www.logix.cz/michal/devel/nagios/check_snmp_extend.sh

l  修改check_snmp_extend.sh

因爲check_snmp_extend.sh自己腳本有些問題,要進行修改,修改後內容以下:

#!/bin/sh
 
. /usr/local/nagios/libexec/utils.sh || exit 3
 
SNMPGET=$(which snmpwalk)
 
test -x ${SNMPGET} || exit $STATE_UNKNOWN
 
HOST=$1
NAME=$2
 
test "${HOST}" -a "${NAME}" || exit $STATE_UNKNOWN
 
STATUS=$(snmpwalk -v 2c -c 12345 ${HOST} ${NAME} | awk -F" " '{ print $4 }' | sed 's/"//g' 2>&1)
 
case "$STATUS" in
        OK|WARNING|CRITICAL|UNKNOWN)
                RET=$(eval "echo \$STATE_$STATUS")
                RESULT="$STATUS - SNMP returned unparsable status: $STATUS"
                echo $RESULT           #nagios顯示信息
                ;;
        *)
                RET=$STATE_UNKNOWN
                RESULT="UNKNOWN - SNMP returned unparsable status: $STATUS"
                echo $RESULT           #nagios顯示信息
                ;;
esac
 
 
exit $RET                     #返回結果

 

3.2.7      nagios配置(監控機)

l  在commands.cfg中增長對check_snmp_extend.sh的定義

vi /usr/local/nagios/etc/objects/commands.cfg

增長以下內容:

define command{

        command_name check_snmp_extend

        command_line $USER1$/check_snmp_extend.sh $HOSTADDRESS$ $ARG1$

        }

 

l  在services.cfg中增長監控

vi /usr/local/nagios/etc/objects/ service.cfg

增長以下內容:

define service{

        use                     generic-service

        host_name               CPP-Linux

        service_description       Check For CPP

        check_command           check_snmp_extend!.1.3.6.1.4.1.2023.1.4.1.2.3.99.112.112.1

        }

注意:check_snmp_extend!後面寫的就是OID號

 

l  重啓nagios

/etc/init.d/nagios restart

 

4      報警設置

4.1  郵件報警

4.1.1      前言

因爲公司監控服務器處於內網環境,因此沒法直接發送郵件到外網郵箱。公司有臺外網郵件服務器,如今是經過發郵件到這臺外網郵件服務器再轉發到運維人員郵箱。

4.1.2      轉發流程圖

下面是轉發流程圖(圖12)

圖12

1. nagios監控服務器須要報警將郵件發送到郵件服務器

2. 郵件服務器根據配置轉發到運維人員的郵箱。

4.1.3      nagios配置

l  contacts.cfg配置

vi /usr/local/nagios/etc/objects/contacts.cfg

define contact{

        name                            generic-contact

        service_notification_period     24x7

        host_notification_period        24x7

        service_notification_options    w,u,c,r

        host_notification_options       d,u,r

        service_notification_commands   notify-service-by-email,notify-service-by-sms

        host_notification_commands      notify-host-by-email,host-notify-by-sms

        }

 

define contact{

        contact_name                    admin

        use                             generic-contact

        alias                           Nagios Admin

        email                           nagios@123.nagios.com

        pager                           139111111

        }

 

define contactgroup{

        contactgroup_name       admin

        alias                   Technical Support

        members                 admin

        }

注:由於是郵件轉發,只需設置一個用戶便可。其餘用戶在轉發設置中配置。

 

4.1.4      轉發設置

l  登錄郵件服務器,新建郵箱帳號

useradd nagios

l  設置轉發

vi /home/nagios/.forward

寫入轉發的郵箱便可

admin@123.com

相關文章
相關標籤/搜索