需求

  1. 需要监听nginx是否存活,如果nginx服务挂了,发送邮件通知

说明

  1. zabbix官方部署文档:zabbix部署
  2. 我这里准备了两台服务器,服务端(zabbix server):192.168.1.217,客户端(被监控端,zabbix agent):192.168.1.215

步骤

  1. 根据官方文档部署服务端Zabbix server 。文档没写创建数据库的步骤。
#创建一个zabbix的数据库
1:create database zabbix character set utf8 collate utf8_bin;
#创建一个zabbix的用户,密码是123456
2:create user zabbix@localhost identified by '123456';
#授权zabbix用户权限
3:grant all privileges on zabbix.* to zabbix@localhost identified by '123456';
#生效
4:flush privileges
  1. 再根据文档导入数据库就行
  2. 因为我没有安装apache,用的是nginx,所以需要配置一下nginx,注意看root指定的是哪个目录就行
server {
	listen 80;

	root /usr/share/zabbix/;

	# Add index.php to the list if you are using PHP
	index index.html index.php index.htm index.nginx-debian.html;

	server_name www.lzabbix.cn;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ /index.php?$query_string;
		#try_files $uri $uri/ =404;
	}

	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	#
	location ~ \.php$ {
			try_files $uri /index.php =404;
			#fastcgi_split_path_info ^(.+\.php)(/.+)$;
			fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
			fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME                     $document_root$fastcgi_script_name;
			include fastcgi_params;
	}


}
  1. 安装的过程中需要你修改PHP的配置文件。
  2. 最后在去192.168.1.215上安装zabbix agent 
apt install -y zabbix-agent

使用

  1. 现在在215上修改下nginx的配置如下,注意location /nginx_status配置,之后服务端会定时请求到这里,这样服务端就知道nginx的状态
server {
	listen 80 default_server;
	listen [::]:80 default_server;
	root /var/www/default;
	# Add index.php to the list if you are using PHP
	index index.html index.php index.htm index.nginx-debian.html;
	server_name _;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		#try_files $uri $uri/ =404;
		try_files $uri $uri/ /index.php?$query_string;
	}
	location /nginx_status {
		stub_status on;
		access_log off;
   	 }	


		location ~ \.php$ {
                try_files $uri /index.php =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
	location ~ /\.ht {
        	deny all;
    	}	

}
  1. 重启nginx,直接访问192.168.1.215/nginx_status看下是否正常
  2. 在被监听端215上创建一个脚本,我创建的目录是在/var/local/scripts
#! /bin/bash
#date: 2020-01-18
# Description:Zabbix4.0监控Nginx1.16.1性能以及进程状态
# Note:此脚本需要配置在被监控端

HOST="192.168.1.215"
PORT="80"

# 检测Nginx进程是否存在
function ping {
    /bin/pidof nginx | wc -l
}

# 检测Nginx性能
function active {
    /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
    /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
    /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
    /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
    /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled {
    /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests {
    /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
# 执行function
$1
  1. 给脚本赋予执行权限
chmod a+x /var/local/scripts/ngx_status.sh
  1. 手动测试脚本是否可以跑
/var/local/scripts/ngx_status.sh active

zabbix 命令行重启 如何启动zabbix-server_zabbix 命令行重启

  1.  配置zabbix_agentd.conf,定义监控脚本key,该配置文件是在215服务器上,配置文件找到下面的位置进行修改

UnsafeUserParameters=1 开启

在脚本中添加定义以下各项的键值

UserParameter=nginx.status[*],/home/scripts/ngx_status.sh $1

zabbix 命令行重启 如何启动zabbix-server_php_02

zabbix 命令行重启 如何启动zabbix-server_运维_03

zabbix 命令行重启 如何启动zabbix-server_运维_04

 11.重启zabbix agent

systemctl restart zabbix-agent

12.配置服务端,217服务器上。手动测试看能不能访问客户端了215了

zabbix_get -s 192.168.1.215 -k nginx.status[active]

13.配置好之后就是在web端进行配置。大致流程如下

创建主机组—>添加主机—>创建监控模板—>创建应用集—>创建监控项—>创建图形—>创建触发器—>创建事件—>创建处理动作—>创建用户组与用户—>创建告警方式

14.创建主机

zabbix 命令行重启 如何启动zabbix-server_php_05

zabbix 命令行重启 如何启动zabbix-server_运维_06

15.创建模板

zabbix 命令行重启 如何启动zabbix-server_运维_07

 

zabbix 命令行重启 如何启动zabbix-server_zabbix_08

16.创建应用集,先找到刚刚创建好的模板

zabbix 命令行重启 如何启动zabbix-server_zabbix 命令行重启_09

zabbix 命令行重启 如何启动zabbix-server_运维_10

 

zabbix 命令行重启 如何启动zabbix-server_zabbix_11

 17.创建监控项,也是先找到刚刚创建的模板,如果需要监听多个,就重复创建几次

zabbix 命令行重启 如何启动zabbix-server_php_12

 

zabbix 命令行重启 如何启动zabbix-server_nginx_13

zabbix 命令行重启 如何启动zabbix-server_zabbix 命令行重启_14

 18.创建图形,还是先找到模板

zabbix 命令行重启 如何启动zabbix-server_nginx_15

zabbix 命令行重启 如何启动zabbix-server_zabbix 命令行重启_16

 

zabbix 命令行重启 如何启动zabbix-server_php_17

19.为主机添加模板,找到主机点击进去

 

zabbix 命令行重启 如何启动zabbix-server_php_18

 

zabbix 命令行重启 如何启动zabbix-server_php_19

 20.之后返回主机那里,就可以看到主机后面的应用集,监控项后面是有数字的了,就说明是关联模板了

zabbix 命令行重启 如何启动zabbix-server_zabbix_20

21.查看监控数据

zabbix 命令行重启 如何启动zabbix-server_zabbix_21

23.这个时候查看图形可能会发现没有坐标轴。需要打开zabbix的源代码文件/usr/share/zabbix/include/defines.inc.php,更改为:这个simfang.ttf文件是我直接从window下上传到/usr/share/zabbix/fonts下的

zabbix 命令行重启 如何启动zabbix-server_nginx_22

define('ZBX_FONT_NAME', 'simfang');

define('ZBX_GRAPH_FONT_NAME',  'simfang');

再次刷新就能看到坐标轴了

24.将zabbix汉化,我最开始是不能选择中文的,需要做以下修改

zabbix 命令行重启 如何启动zabbix-server_zabbix 命令行重启_23

 要确定自己服务器是否安装了支持中文,执行locale看看默认的是不是zh_ch

locale

zabbix 命令行重启 如何启动zabbix-server_zabbix_24

重启服务器

dpkg-reconfigure locales

zabbix 命令行重启 如何启动zabbix-server_运维_25

25.再来配置ubuntu发送邮箱,用来通知。如果nginx挂了,那我们就会收到邮箱

26.安装相应工具,mailutils

apt-get install mailutils

27.安装ssmtp

apt-get install ssmtp

28.更改ssmtp的配置文件,/etc/ssmtp

zabbix 命令行重启 如何启动zabbix-server_php_26

 29.更改配置文件ssmtp.conf如下,授权码不是邮箱密码,是需要自己去QQ邮箱中开启

#发件人邮箱
root=1053653379@qq.com
#邮件服务器地址(端口必写)
mailhub=smtp.qq.com:465
#发件人邮箱(用于做认证,确保该邮箱所有者允许发邮件)
AuthUser=1053653379@qq.com
#发件人邮箱授权码(用户做上面邮箱的身份验证)
AuthPass=xxxxxx
#配置使用证书
UseTLS=Yes

30.revaliases配置文件需要做如下配置

#格式——主机账号:发件人邮箱:邮件服务器地址(端口必写,若不写则默认端口为25)
root:1053653379@qq.com:smtp.qq.com:465
#表示主机用户root让smtp.qq.com:465这个邮件服务器以ken@qq.com为发件人给其他用户发邮件

31.测试一下是否可以发送了,日志默认是在/var/log/mail.log文件中

echo "邮件正文" | mail -s "邮件主题" Mike@qq.com

32.创建一个触发器,我们是主机是关联到模板上的,所以我们还是在模板上创建一个触发器

zabbix 命令行重启 如何启动zabbix-server_zabbix_27

zabbix 命令行重启 如何启动zabbix-server_运维_28

 33.创建动作

zabbix 命令行重启 如何启动zabbix-server_zabbix_29

zabbix 命令行重启 如何启动zabbix-server_zabbix_30

34.设置邮箱的账号密码主机等,打开

zabbix 命令行重启 如何启动zabbix-server_zabbix_31

zabbix 命令行重启 如何启动zabbix-server_zabbix_32

 35.给用户设置邮箱

zabbix 命令行重启 如何启动zabbix-server_zabbix 命令行重启_33

zabbix 命令行重启 如何启动zabbix-server_nginx_34

 36.停掉215上的nginx,看能不能收到短信

 37.如果没有收到邮件,可以通过问题查看,这里会列出原因 

zabbix 命令行重启 如何启动zabbix-server_zabbix 命令行重启_35

38.如果是要监听mysql是否存活,需要在215上的ngx_status脚本在加一个方法来监听,1:正常

function mysql_ping {
   port=`netstat -nlt | grep 3306|wc -l`
   if [ $port -ne 1 ]; then
		echo 0
   else
		echo 1
   fi;	
}

39.你会发现这里我没有-u   -p  参数,因为如果加上了这个参数会导出返回一个错误,所以我们要先把用户名和密码配置在mysql的配置文件中,我的配置文件是在/etc/mysql/mysql.conf.d/mysqld.conf,在这个配置文件尾加上如下

[client]
user=用户名
host=192.168.1.215
password=密码

40.之后的配置就是和上面是一样的咯

41.新增一个报警媒介类型,发送钉钉消息

zabbix 命令行重启 如何启动zabbix-server_zabbix_36

zabbix 命令行重启 如何启动zabbix-server_php_37

获取MESSAGE应该是$argv[2],图上写错了

42.创建发送钉钉消息的脚本文件,先查看脚本文件应该放在哪个目录,打开配置文件

vim /etc/zabbix/zabbix_server.conf

43.找到配置

zabbix 命令行重启 如何启动zabbix-server_zabbix 命令行重启_38

 44.把脚本放入到alertscripts目录下

#!/usr/bin/php
<?php
header("Content-type: text/html; charset=utf-8");

/**
 * Class DingRobot
 * @package App\Libs
 * 钉钉机器人消息
 */
class DingRobot
{
    private $url = "";
    private $secret = "";


    function __construct()
    {
        
    }

    /**
     * @param array $data
     * $datas = [
            'content'=>[
            'msgtype' => 'text',
            'text' =>["content"=>"@测试,测试消息"
            ]]
            ];
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    function sendDing($data = array())
    {
        // TODO: Implement send_ding() method.
        if(!$data)exit();
        $time = $this->msectime();
        $sign = $this->makeSign($time);
        $url = $this->url.'×tamp='.$time.'&sign='.$sign;
        //$data = array ('msgtype' => 'text','text' => array ('content' => $msg));
       
		$res = json_decode($this->request_by_curl($url,json_encode($data)),1);
		
        if($res['errcode']!=0){
            
            return false;
        }else{
            
            return true;
        }
    }
	public function request_by_curl($remote_server, $post_string) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $remote_server);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 50);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);          //单位 秒,也可以使用
        curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/json;charset=utf-8'));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
        $data = curl_exec($ch);
		
        curl_close($ch);
        return $data;
    }
    function makeSign($time){
        $str = $time . "\n" . $this->secret;
        $signStr = base64_encode(hash_hmac('sha256', $str, $this->secret,true));
        $signStr = utf8_encode(urlencode($signStr));
        return $signStr;
    }

    //返回当前的毫秒时间戳
    function msectime()
    {
        $arr = explode(' ',microtime());
        $msec = $arr[0];
        $sec = $arr[1];
        $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        return $msectime;
    }
}
//$aa = getopt("",["content::"]);
//print_r($content);exit();
$content = $argv[2];
$to = $argv[1];
$obj = new DingRobot();
$data = [
            'msgtype' => 'text',
            'text' =>["content"=>"@".$to.$content],
			'at'=>[
				"atMobiles"=>[
					$to
				],
			"isAtAll"=>false				
			]
        ];
$obj->sendDing($data);

45.给用户配置新告警媒介

zabbix 命令行重启 如何启动zabbix-server_nginx_39

46.现在就可以试试关闭nginx,看看有没有钉钉消息