需求
- 需要监听nginx是否存活,如果nginx服务挂了,发送邮件通知
说明
- zabbix官方部署文档:zabbix部署
- 我这里准备了两台服务器,服务端(zabbix server):192.168.1.217,客户端(被监控端,zabbix agent):192.168.1.215
步骤
- 根据官方文档部署服务端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
- 再根据文档导入数据库就行
- 因为我没有安装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;
}
}
- 安装的过程中需要你修改PHP的配置文件。
- 最后在去192.168.1.215上安装zabbix agent
apt install -y zabbix-agent
使用
- 现在在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;
}
}
- 重启nginx,直接访问192.168.1.215/nginx_status看下是否正常
- 在被监听端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
- 给脚本赋予执行权限
chmod a+x /var/local/scripts/ngx_status.sh
- 手动测试脚本是否可以跑
/var/local/scripts/ngx_status.sh active
- 配置zabbix_agentd.conf,定义监控脚本key,该配置文件是在215服务器上,配置文件找到下面的位置进行修改
UnsafeUserParameters=1 开启
在脚本中添加定义以下各项的键值
UserParameter=nginx.status[*],/home/scripts/ngx_status.sh $1
11.重启zabbix agent
systemctl restart zabbix-agent
12.配置服务端,217服务器上。手动测试看能不能访问客户端了215了
zabbix_get -s 192.168.1.215 -k nginx.status[active]
13.配置好之后就是在web端进行配置。大致流程如下
创建主机组—>添加主机—>创建监控模板—>创建应用集—>创建监控项—>创建图形—>创建触发器—>创建事件—>创建处理动作—>创建用户组与用户—>创建告警方式
14.创建主机
15.创建模板
16.创建应用集,先找到刚刚创建好的模板
17.创建监控项,也是先找到刚刚创建的模板,如果需要监听多个,就重复创建几次
18.创建图形,还是先找到模板
19.为主机添加模板,找到主机点击进去
20.之后返回主机那里,就可以看到主机后面的应用集,监控项后面是有数字的了,就说明是关联模板了
21.查看监控数据
23.这个时候查看图形可能会发现没有坐标轴。需要打开zabbix的源代码文件/usr/share/zabbix/include/defines.inc.php,更改为:这个simfang.ttf文件是我直接从window下上传到/usr/share/zabbix/fonts下的
define('ZBX_FONT_NAME', 'simfang');
define('ZBX_GRAPH_FONT_NAME', 'simfang');
再次刷新就能看到坐标轴了
24.将zabbix汉化,我最开始是不能选择中文的,需要做以下修改
要确定自己服务器是否安装了支持中文,执行locale看看默认的是不是zh_ch
locale
重启服务器
dpkg-reconfigure locales
25.再来配置ubuntu发送邮箱,用来通知。如果nginx挂了,那我们就会收到邮箱
26.安装相应工具,mailutils
apt-get install mailutils
27.安装ssmtp
apt-get install ssmtp
28.更改ssmtp的配置文件,/etc/ssmtp
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.创建一个触发器,我们是主机是关联到模板上的,所以我们还是在模板上创建一个触发器
33.创建动作
34.设置邮箱的账号密码主机等,打开
35.给用户设置邮箱
36.停掉215上的nginx,看能不能收到短信
37.如果没有收到邮件,可以通过问题查看,这里会列出原因
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.新增一个报警媒介类型,发送钉钉消息
获取MESSAGE应该是$argv[2],图上写错了
42.创建发送钉钉消息的脚本文件,先查看脚本文件应该放在哪个目录,打开配置文件
vim /etc/zabbix/zabbix_server.conf
43.找到配置
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.给用户配置新告警媒介
46.现在就可以试试关闭nginx,看看有没有钉钉消息