Zabbix自定义脚本监控nginx及微信告警的方法
发布时间 - 2023-05-21 00:00:00 点击率:次项目描述
本项目的目的是构建一个能实现微信告警的zabbix监控系统,方便的监控整个nginx集群,同时能批量的去部署和管理整个集群。
项目步骤
zabbix服务端(192.168.2.138)安装好zabbix server,nginx端安装好zabbix agent(192.168.2.58),配置好Nginx负载均衡集群,并打开状态统计。
nginx端编写监控脚本,取到nginx的状态。
服务端web添加监控项,出图。
注册企业微信,配置好微信接口。
zabbix服务端添加接口推送脚本,测试接口正常。
在web端配置报警媒介,群组和用户,添加相关触发器和动作。
nginx关停服务,测试是否能通过微信告警。
项目心得
在测试接收消息过程中,返回值一直是参数{ALTER.MESSAGE},排查脚本问题,版本问题,最后发现是参数{ALERT.MESSAGE},所以打字一定要细心,认真。同时对监控也有了一定的认识,运维人员不可能7*24小时盯着zabbix看,所以做到及时告警是非常必要的,对之前的高可用web集群项目叶可以进行完善。
详细步骤
zabbix-agent客户端nginx配置监控
nginx打开状态统计功能
nginx配置增加stub_status模块
location = /wyt_status{
stub_status;}测试状态统计功能是否打开
http://192.168.2.58/wyt_status\
nginx端(zabbix客户端)编写监控脚本
cd /etc/zabbix/zabbix_agentd.d #在zabbix_agentd.d目录下编写监控脚本 vim zabbix-nginx_status.sh
#!/bin/bash
case $1 in
active)
curl http://192.168.2.58:80/wyt_status 2>/dev/null|awk '/Active/ {print $NF}'
;;
accepts)
curl http://192.168.2.58:80/wyt_status 2>/dev/null|awk 'NR==3 {print $1}'
;;
h
andled)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==3 {print $2}'
;;
requests)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==3 {print $3}'
;;
reading)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==4 {print $2}'
;;
writing)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==4 {print $4}'
;;
waiting)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==4 {print $NF}'
;;
ping)
pidof nginx |wc -l
#通过查询进程PID值,测试nginx存活状态
;;
esacvim userparameter_nginx.conf #在zabbix_agentd.d目录下自定义参数配置文件 UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/zabbix-nginx_status.sh $1 #指定动作 chmod +x zabbix-nginx_status.sh #授予可执行权限 service zabbix-agent restart #刷新服务 zabbix_get -k nginx.status[ping] -s 192.168.2.58 #去服务端测试是否返回参数1
zabbix-server-web配置监控
先创建nginx主机master-nginx
添加应用集nginx
在应用集nginx增加监控项
自定义触发器nginx-up-down,监控项为nginx-ping,正常为1,每5s监控一次,若为0,严重警告。
除nginx-ping,nginx-accepts外,需要添加所有状态监控项,只有nginx-ping创建触发器,这里不一一举例。
添加好所有监控项,下一步制图,图中包含所有监控项
因为我们监控实际上就是在一直请求,所以看到nginx-requests在不断增加。
注册企业微信接口
注册成功之后创建一个运维部门
记住自己的企业ID
自建应用
应用名称为zabbix监控
创建成功后,查看信息记住自己的AgentId和Secret
微信扫码企业微信插件就可以在微信接收消息
zabbix-server接口脚本配置告警
Shell脚本
cd /usr/lib/zabbix/alertscripts 进入脚本配置文件夹 vim weixin.sh
#!/bin/bash
CorpID="wwaa6fb8ff1b81aa77" # 你的企业id
Secret="Cxyd*****" #你的SecretID
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CorpID&corpsecret=$Secret"
Token=$(/usr/bin/curl -s -G $GURL |awk -F\": '{print $4}'|awk -F\" '{print $2}')
# echo $Token
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Token"
function body(){
local int agentid=1000002 # 你的agentdid
local UserID="@all" # 发送的用户ID
local PartyID=1 # 部门ID
local Msg=$(echo "$@" | cut -d" " -f3-) # 发送给所有人
printf '{\n'
printf '\t"touser": "'"$UserID"\"",\n"
printf '\t"toparty": "'"$PartyID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'"$agentid"\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$Msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL测试脚本能否正常接收消息
可以看到正常接收。
然后我们回到zabbix-server-web配置
zabbix-server-web配置告警
管理->报警媒介类型->创建媒体类型
创建用户群组
创建用户
报警媒介
权限->超级管理员
配置->动作
添加触发器
操作
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生{TRIGGER.NAME}故障!
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
恢复操作
恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
zabbix-agent关停nginx服务测试
可以看到推送成功
Python webhook机器人脚本
新建一个测试群聊,在群里添加机器人,记住webhook地址
除了使用Shell脚本配置接口之外,还可以使用Python脚本
#!/usr/bin/python
#-*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=****”
#填写自己的webhook地址
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[1]
msg(text)测试
python weixin.py test
web配置同上
# nginx
# 自己的
# 服务端
# 可以看到
# 自定义
# 群组
# 装好
# 客户端
# 不可能
# 目录下
# 还可以
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
如何在企业微信快速生成手机电脑官网?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何在自有机房高效搭建专业网站?
Android自定义控件实现温度旋转按钮效果
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Laravel Docker环境搭建教程_Laravel Sail使用指南
如何在Ubuntu系统下快速搭建WordPress个人网站?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
大型企业网站制作流程,做网站需要注册公司吗?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Android GridView 滑动条设置一直显示状态(推荐)
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
如何在宝塔面板创建新站点?
详解Oracle修改字段类型方法总结
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel中的Facade(门面)到底是什么原理
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何快速建站并高效导出源代码?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
公司网站制作价格怎么算,公司办个官网需要多少钱?
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
如何在阿里云部署织梦网站?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
iOS验证手机号的正则表达式
如何在阿里云完成域名注册与建站?
如何制作一个表白网站视频,关于勇敢表白的小标题?
,网页ppt怎么弄成自己的ppt?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
香港服务器租用费用高吗?如何避免常见误区?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
网站建设整体流程解析,建站其实很容易!
高端云建站费用究竟需要多少预算?
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
C#如何调用原生C++ COM对象详解
进行网站优化必须要坚持的四大原则
大同网页,大同瑞慈医院官网?
javascript中对象的定义、使用以及对象和原型链操作小结
动图在线制作网站有哪些,滑动动图图集怎么做?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧


andled)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==3 {print $2}'
;;
requests)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==3 {print $3}'
;;
reading)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==4 {print $2}'
;;
writing)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==4 {print $4}'
;;
waiting)
curl http://192.168.2.58:80/wyt_status 2>/dev/null |awk 'NR==4 {print $NF}'
;;
ping)
pidof nginx |wc -l
#通过查询进程PID值,测试nginx存活状态
;;
esac