项目描述本项目的目的是构建一个能实现微信告警的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/bashcase $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}' ;; handled) 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 vim 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/bashCorpID="wwaa6fb8ff1b81aa77" # 你的企业idSecret="Cxyd*****" #你的SecretIDGURL="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 $TokenPURL="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 requestsimport jsonimport sysimport osheaders = {'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).contentif __name__ == '__main__': text = sys.argv[1] msg(text) 测试 web配置同上 
总结 下载地址: nginx限流及配置管理实战记录 关于构建aarch64环境Mysql8.0的Docker镜像问题 |