运维监控
说明:
- 无论是小公司,也会招聘专门的监控运维岗、或是对运维软件有一定的技术要求。 或者是大公司,假设北京总部有70个运维,里面可能有20个SRE高级运维,3个devops运维开发,3个监控运维(维护zabbix、prometheus)、剩下的就是桌面运维(维护硬件资产、发放笔记本、显示器、台式机,等工作)、或者IT机房硬件运维。
- 监控,是运维工作里的一大重要环节(监控服务器的正常,cpu 内存 硬盘的使用率,防止服务器突然使用率升高,导致无法及时发现故障异常)。通过微信 邮件 qq 钉钉等通信实时的发送消息,告知运维人员当前服务器的情况。
为什么需要运维监控:
- 运维的职责: 1.保障企业数据的安全可靠。2.为客户提供7*24小时服务。 3.不断提升用户的体验。在关键时刻,提前提醒我们服务器要出问题了,及时的解决这个问题,避免出现更大的问题。
- 没有监控:
- 在有监控系统之前,运维人员需要登录服务器手动敲打命令来获取系统数据,例如iotop,glances,htop,free,ps等查看服务器状态的命令。
- 运维人员通过系统管理的命令来获取服务器数据,为了分析问题,可能会把数据复制到本地机器,通过excel等工具进行制表,画图分析服务器性能动态。
- 这种手动管理服务器的麻烦在于,服务器出现问题的时候,运维无法即使的发现,可能服务器内存满了,网站应用挂了,用户过来投诉才能发现。
- 手工运维监控,无法实时的监控服务器的运行,收集数据麻烦,也可以使用ansible+shell脚本的方式进行批量处理服务器集群的监控操作。
- 有监控软件:
- 通过一个友好的界面进行浏览整个网站所有的服务器状态,可以在web前端方便的查看监控数据,可以回溯寻找事故发生时系统的问题和报警情况,有了一套完善的监控体系,这种监控体系不手动的更为高效。
- 监控系统是整个运维自动化体系中非常重要的环节,从服务器上架到机房,到最后下架回收,整个过程都应该有监控的存在。
- 服务器上架的硬件监控,检测线路,服务器接口状态,服务器运行时的监控,系统指标监控,且在出现异常的时候发出报警通知对应的人员,在服务器回收的时候,要取消硬件,软件的监控,并且大型公司还会对监控系统进行开发,确保有API能够方便的和其他部门同事进行协同工作。
公司的运维:
- 一般公司里的运维,大致可以分为基础运维、应用运维、运维开发、监控组四大部分。
- 基础运维,负责IDC运维,服务器上下架,网络设备等。
- 应用运维,也就是system administrator,系统管理员。
- 运维开发,负责运维工具的开发,系统开发等,例如开发监控系统,代码发布系统。
- 监控组,也就是24小时值班的人员,需要时刻关注服务器,网站的状况,出现问题后,第一时间联系相关运维以及研发人员。
运维体系:
- 物理服务器:linux系统或者windows系统。装机标准(cobbler+pxe实现自动化装机)。
- 自动化批量管理工具:ansible 或者 saltatack
- 监控软件:zabbix(https://www.zabbix.com/) 或者 Nagios(https://www.nagios.org/)或者 Prometheus(https://prometheus.io/)
- 日志收集系统:elk日志收集
- 自动化构建程序:jenkins + git + gitlab
- 容器:docker 或者 k8s
- 云服务器:私有云(openstack) 或者 公有云
监控的生命周期:
- 服务器上架。
- 进行基础设置监控。
- 服务器温度,风扇转速(ipmitool命令对服务器进行远程管理,注意只能用在物理机,vmware不行)
- 存储的容量,性能(df,fdisk,dd,iotop(yum install iotop))
- CPU性能好坏(lscpu,uptime,top,htop(yum install htop),glances (yum install glances))
- 内存容量(free)
- 网络情况(iftop(yum install iftop),nethogs(yum install nethogs))
- 应用监控。
- 数据库mysql,redis。nginx web服务器等等。
- 若是服务器在维护中,暂停监控指标,否则监控会不停的报警。
- 监控系统在运维自动化系统中。
- 监控数据收集,可视化展示(图表展示,柱状图,曲线图,折线图)
- 异常数据报警
- 结合如CMDB等系统协同工作
监控软件的功能:
- 监控系统能够自定义监控的内容,自己通过脚本采集所需的数据,数据需要存入到数据库,日后对该数据进行分析计算,可以简易的部署到服务器中,数据可视化直观清晰。
- 可以定义复杂度告警逻辑,做到监控项之间的关联告警,例如程序之间的依赖检测,而不是只单独检测某一个指标,告警可以确认响应,让运维组内的人知道已经有人在处理告警问题了,报警方式可以自定义,如短信,邮件,以及微信,钉钉等,告警的内容自定义,可以预处理一些任务,如自我修复,重启,采集数据等。
- 监控系统有强大的API,提供给研调用用,其他系统调用。监控数据是开放性,数据结构主流,便于解析。监控可视化可以简易的插件使用,而非复杂的js文件。
1.监控总结
为什么要有监控
1. 对系统不间断7*24的实时监控
2. 实时反馈、可视化展示服务器运行状态
3. 保证业务高度可用性,提前预警
4. 保证了业务的可靠性、稳定性、安全性
主流的监控软件
1. zabbix 监控王者 https://www.zabbix.com/documentation/4.0/zh/manual
2. 夜鹰系统 https://www.didiyun.com/production/ops.html
3. 普罗米修斯 https://prometheus.io/ (新时代监控王者,主要结合容器、k8s使用)
如何着手监控工作
以下思路作为参考,属于全链路的监控搭建,具体从哪个环节开始,以你工作需求为切入点。
1. 硬件监控、路由器、交换机、防火墙的流量监控
2. 系统资源监控、cpu、内存、磁盘、网络流量、进程存活、tcp链接数
3. 服务监控、nginx、php-fpm、tomcat、mysql、redis、django
4. web监控、nginx-status、http请求响应耗时
5. 日志监控、所有服务的日志收集、存储、分析、展示(部署ELK架构)、或者购买日志易系统
6. 安全监控、系统防火墙firewalld、web应用防火墙(nginx+lua)
7. 网络监控、smokeping
8. 业务监控 分析公司搞秒杀、抢购等活动时产生的瞬时流量、注册量、判断产生的价值
2.手动监控方式
1.系统资源监控:
cpu监控命令:
w、top、sar、glances
内存监控:
free
磁盘:
df disk
2.网络监控:
ifconfig、route、glances、iftop、netstat、ss
NetHogs 是一个开源的命令行工具(类似于Linux的top命令),用来按进程或程序实时统计网络带宽使用率。
# 例如:查看以建立的tcp连接
1.查看以建立的tcp连接
netstat -an | grep -i established
-a 全部的链接
-n 将主机名转为ip:端口
grep -i established 部分大小写过滤established链接
图-1 就是查看到 当前链接sshd服务的链接的ip:port,就是当前vmware宿主机练级
2.查看端口情况
netstat -tunlp
ss -tunlp
3.查看路由表
netstat -rn
Zabbix监控
zabbix核心理念:
- 主机 ( HOST ):就是具体的一个监控对象,某一个被监控的实例,可以是一个数据库,也可以是一个操作系统。
- 可以是一个系统linux/windows/网络设备 或者某个服务进程,mysql。
- 通过zabbix-agent(收集数据) 产生的ip:port(默认时ip:10050 )进行监控,如果时某个服务比如mysql,那么就是ip:3306。
- 监控就是通过ip+端口进行当前机器或者某个程序的监控。
- 模板 ( Template ):定义了具体一类监控对象的抽象(可以理解为分组),就是特指监控某一个类型的,比如监控windows模版,那么就是专属于监控Windows的时候,直接选择这个模板就可以实现开箱即用的数据采集。
- 监控项 ( ITEM ):监控项定义了具体的某一项采集指标,比如:cpu采集,内存采集,磁盘采集。
- 触发器 ( Trigger ):触发器是基于监控项存在的,可以理解为条件,比如:监控cpu的温度大于90时。
- 动作 ( Action ):动作时基于触发器存在的,当触发器触发了,就可以执行特定的动作(发邮件,法钉钉,发微信,执行javascript脚本或者Shell脚本等等)通知运维人员查看。
监控什么设备主机:HOST 监控设备使用什么样的模板(都有什么功能,收集那些数据):Template 定义监控的什么具体的内容(监控项):ITEM 监控的内容在什么条件下出发:Trigger 出发后的动作是什么:Action # 例如:监控机器 10.0.0.100 机器的 cpu 内存 磁盘的使用情况,当使用率到达 80% 触发条件,告知管理当前机器的运维人员赶紧修复程序
zabbix的架构模式:
- 组成部分:数据库(存储采集数据),zabbix-ui(可视化展示),zabbix-server(服务端),zabbix-agent(客户端)
Zabbix Server:负责接收Agent发送的监控数据,并进行处理和存储。 Database:存储所有配置信息和监控数据,可以是MySQL或PostgreSQL。 Zabbix Agent:部署在被监控的主机上,负责收集本地数据并发送给Zabbix Server。 Zabbix UI (Frontend):基于Web的界面,用于展示监控数据和配置监控项。
1.Zabbix组件介绍
# 功能特点:
zabbix是一款超过23年经验的监控王牌软件
数据采集
支持SNMP、JMX、等采集数据协议
支持自定义时间频率采集数据
支持server、proxy、agent的方式采集数据
灵活定义触发器
支持自定义触发条件
将触发器和告警方式关联
多种告警方式
短信、邮件、微信
告警分等级、一般、警告、紧急
支持自定义警告内容。
可视化展示丰富
内置图形功能可以将采集的数据实时绘制成图形
使用图形聚合功能可以汇总多个监控项图形、集中展示
提高报表分析功能
存储历史数据
采集到的数据存储入库,便于长久管理,查看历史记录
配置简单上手
配置文件简单,文档丰富,参数易懂
一般添加主机、关联模板两部曲即可完成主机监控
大量的监控模板
zabbix-agent支持大量的监控项且被制作成了模板,方便复用
美观的UI页面
基于php开发的zabbix-ui,大部分操作通过页面点击完成。
二次开发能力
提供zabbix API可编程接口,进行批量数据操作,以及第三方工具集成。
多平台扩展
支持linux、windows
由C语言开发的server、agent、性能强悍。
1-1.Zabbix-Server
是什么:
- Zabbix Server 是 C 语言开发的 Zabbix 服务端,有着 强悍的采集和计算性能,而且资源使用率很低。
主要功能:
- 定时读取 Zabbix 数据库,同步 Zabbix UI 配置的信息到缓存,下发到 Zabbix Agent 或者 Zabbix Proxy。
- 被动采集:zabbix-server主动去客户端中采集监控数据。Zabbix Server 会有专门的 Poller 线程去采集数据,可以定义特定的时间区间或者特定的频率。
- 主动采集:客户端会主动将数据发送给zabbix-server。Zabbix Server 也会有专门的 Trapper 线程来接收数据,时间间隔或者频率取决于设备侧或者Agent上报配置。
- 接收到的历史数据(来自于 Agent、Proxy、设备侧),Zabbix Server 会缓存下来,进行告警表达式计算,进行动作触发,最终会同步到数据库的历史记录表,history开头的表。
- 注意:一般将zabbix与ansible安装在同一台机器上,还是看情况而定。
工作形式:
- server 向 agent主动要数据 # 被动采集,效率低 比如:zabbix-server监控了100台机器,那么每一次zabbix都要一个一个的要数据,在进行更新到数据库,缓存,页面展示,如果某一台机器收集数据慢,那么zabbix-server,就等待数据收集完毕。
- agent 主动抛数据给 server # 主动采集,效率高 比如:zabbix-server监控了100台机器,agent会主动将数据交给zabbix,省去了等待主动询问的时间,那个机器给了数据,那么就进行操作一系列的持久化渲染动作。
1-2.Zabbix-Proxy
是什么:
- Zabbix Proxy 其实就是一个简化版的Zabbix Server,具备除了 Zabbix Server 有的告警相关的功能,其他的都是 Proxy 具备的。
功能作用:
- Zabbix Proxy 会定时把采集到的数据上报到 Zabbix Server,Zabbix Server 具备全量的数据,才可以做告警计算,复杂的告警计算可以跨设备。
- 针对大型监控采集环境,可以 通过 Proxy 来实现分布式采集 ,可以非常有效的减轻 Zabbix Server 的采集压力。
- 针对 弱网环境 ,就是网络质量不高的现场环境,Proxy 可以在本地采集,缓存本地,不断重试给Server发送数据,直到发送成功为止,可以大大降低现场的采集失败率。
- 支持负载均衡:Proxy 可以支持负载均衡,即数据可以从多个 Proxy 发送给不同的 Zabbix Server,这样可以提高系统的可用性和容错能力。
- 减少zabbix server的直接暴漏:在某些安全策略下,可能不希望 Zabbix Server 直接暴露给所有被监控的主机。通过 Proxy,可以减少这种直接暴露,增加系统的安全性。
1-3.Zabbix-Agent
是什么:
- Zabbix Agent 是 Zabbix 监控系统中的一个关键组件,它负责在被监控的主机上运行并收集各种性能数据和状态信息。
功能作用:
- 数据采集:定期收集主机的系统性能数据,如 CPU 使用率、内存使用情况、磁盘空间、网络接口流量等。
- 监控项支持:支持多种监控项,包括但不限于 CPU、内存、磁盘、网络、系统日志、自定义脚本等。
- 模式支持:主动与被动模式,abbix Agent 可以工作在主动(Active)模式或被动(Passive)模式下。在主动模式下,Agent 会主动向 Zabbix Server 发送数据;在被动模式下,Agent 会响应 Zabbix Server 的请求来发送数据。
- 低消耗资源:设计为轻量级,即使在资源受限的主机上也能运行,对主机性能的影响很小。
- 自动注册:在某些配置下,Zabbix Agent 可以自动注册到 Zabbix Server,简化了监控的设置过程。
- 故障转移:可以配置多个 Zabbix Server,以实现故障转移和高可用性。
1-4.Zabbix名称说明
模版:所有的监控项的大类,具有复用的作用,只要设置模版,那么主机(无论多少)就可以进行使用,使用内部设置的监控项,触发器,图形,聚合图形。
应用集:对监控项的分组,比如:监控内存(剩余,缓冲区多少,缓存区多少等等。)将这些归到一个类别中。
监控项:对主机采集的数据,以及自定义的key,具体监控的某一项(cpu温度还是内存大小)。
触发器/动作:对监控项设置的触发条件,当到达这个条件时,就会触发动作(发邮件,发微信,执行脚本)。
图形/聚合图形:图形是对多个监控项对主机采集的值,进行可视化的界面展示,聚合图形,是对多个图形的可视化展示。就是对采集的数据进行阶段性或者周期性的可视化展示。
自动发现规则:是一种功能,允许 Zabbix 服务器自动检测网络中的设备和服务,并将它们注册为监控对象,而无需手动配置每个监控项。
1-5.功能整体之间的关系
主机
可以属于一个或多个 主机组。
模板
可以应用于一个或多个 主机 和 主机组。
应用集
包含一个或多个 监控项。
监控项、触发器、图形 都是 应用集 的子项。
触发器
可以关联到一个或多个 监控项。
图形
可以展示一个或多个 监控项 的数据。
动作
可以关联到一个或多个 触发器,并使用 媒介 发送通知。
2.Zabbix安装
文档网站地址:https://www.zabbix.com/cn/manuals
下载网址:https://www.zabbix.com/cn/download (配置centos或者ubuntu仓库方式,如果需要源码安装请看文档)
架构模式:linux + apache + mysql + php
版本:4.0版本(选取LTS标识,这种是长期支持版本),这意味着该软件版本将获得官方的长期支持,包括但不限于错误修复、安全更新和维护。
形式:客户端本地,执行脚本命令,采集当前客户端机器的数据,发送给zabbix-server机器,这些都是一些数据,通过php前端页面将这些数据展示位图形化页面。
2-1.Zabbix-Server安装
2-1-1.配置仓库
官方下载网址:
https://www.zabbix.com/cn/download
使用清华源: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/
1.安装清华源的repo文件
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
2.替换repo文件的地址
sed -i "#repo.zabbix.com#mirrors.tuna.tsinghua.edu.cn/zabbix#g" /etc/yum.repos.d/zabbix.repo
安装包说明:
zabbix-server-mysql # 以mysql版本的存储版本开发的zabbix
zabbix-web-mysql # php为核心的zabbix-ui页面(内部安装了对应web软件) 以mysql版本存储开发的,内部封装了apache httpd服务器
zabbix-agent # 在即客户端的的数据的核心软件,在服务端安装,服务端也需要自己监控自己
mariadb-server # mariadb数据库
2-1-2.安装置数据库
1.安装zabbix程序/数据库程序 # 当前使用的apache httpd服务器,所以会自动安装httpd服务器
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent mariadb-server
2.启动数据库
systemctl start mariadb # 安装时默认没有密码
mysqladmin password 123456 # 设置密码
mysql -uroot -p123456 -e "create database zabbix character SET utf8 COLLATE utf8_bin;" # 创建数据库
# 注意 utf8mb4 的长度最大索引 767 字节会导入数据超出,所以使用 utf8
mysql -uroot -p123456 -e "create user zabbix@localhost identified by 'zabbix';" # 创建用户
mysql -uroot -p123456 -e "grant all privileges on zabbix.* to zabbix@localhost;" # 授权
3.导入数据
/usr/share/doc/zabbix-server-mysql-4.0.50/create.sql.gz # 放到当前这个指定的位置,不同的版本不同,大致都在和这个位置
zcat /usr/share/doc/zabbix-server-mysql-4.0.50/create.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -pzabbix zabbix # 导入数据库
4.验证数据是否导入
mysql -uzabbix -pzabbix -e "show tables from zabbix;"
2-1-3.验证php通信
1.安装 httpd 服务
yum install httpd -y
2.启动服务
systemctl start httpd
3.添加文件到 /var/www/html/ 验证php可以使用
vim info.php
<?php
phpinfo();
?>
3.访问
http://192.168.85.143/info.php
2-1-4.Zabbix-Server配置文件
文档地址:https://www.zabbix.com/documentation/4.0/zh/manual/appendix/config
# 配置文件路径
/etc/zabbix/zabbix_server.conf
1.查看默认配置文件 # 配置中不要有注释信息
cat /etc/zabbix/zabbix_server.conf | grep -Ev '^#|^$'
ListenIP=0.0.0.0 # 服务监听地址
ListenPort=10051 # 监听端口
LogFile=/var/log/zabbix/zabbix_server.log # 日志存放地址
DebugLevel=3 # 日志级别
LogFileSize=0 # 日志文件大小(单位MB),0自动回滚,日志会一直存储到这个文件中。如果设置的大小到达这个大小就会截断。
PidFile=/var/run/zabbix/zabbix_server.pid # pid文件
SocketDir=/var/run/zabbix # socket存放文件夹
DBHost=192.168.85.143 # 数据库地址,如果数据库部署到其他的位置,请将用户设置可以全部访问
DBName=zabbix # 数据库名称
DBUser=zabbix # 数据库登录用户
DBPassword=zabbix # 数据库密码
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log # 指定了 Zabbix server 进程用于存储其监控数据的文件路径。
Timeout=4 # gent, SNMP设备或外部检查的超时时长(单位为秒) 用于 agent 和 server 之间的通信 默认3秒。
AlertScriptsPath=/usr/lib/zabbix/alertscripts # 参数定义了 Zabbix 服务器用来存储告警觉脚本的路径。
ExternalScripts=/usr/lib/zabbix/externalscripts # Zabbix agent 的配置参数,它定义了 Zabbix agent 用来存储外部脚本的路径。这些脚本可以被 agent 用来执行远程命令或脚本。
LogSlowQueries=3000 # 据库查询消耗时间,大于该时间将会记入日志(毫秒)
CacheSize=128M # 用于存储主机、监控项、触发器数据的共享内存大小(用于存储最近获取的监控数据。增加缓存大小可以减少对数据库的读取次数。默认是4M)。
StartPollers=5 # 设置启动时创建的 poller(轮询器)的数量,用于处理监控项的主动检查,默认就是5。
# 参数说明:
AlertScriptsPath 告警觉触发后的处理逻辑脚本(发生告警后执行的动作)。
ExternalScripts 自定义"监控项"的数据收集或其他需要在 agent 端执行的任务(自定监控项,比如cpu的使用率值获取)。
DebugLevel 参数:
0 - Zabbix进程的起停基本信息
1 - 重要信息
2 - 错误信息
3 - 警告信息
4 - 调试信息 (产生大量信息)
5 - 扩展调试 (产生更多信息)
2.启动zabbix-server
systemctl start zabbix-server # 默认的端口是10051 可以修改
2-1-5.配置前端ui页面
# 注意:
想要访问前端页面,需要基于lnmp 或者 lamp ,到底使用nginx 还是 apchae 的区别。zabbix-web-mysql 是基于 php 开发的图形界面,当前安装4.0的版本只支持 apache 版的web服务器。
# 因为zabbix-web-mysql已经封装了httpd服务器,所以只需要修改配置文件即可。
1.修改配置文件
文件路径:/etc/httpd/conf.d/zabbix.conf
修改时区:php_value date.timezone Europe/Riga 修改为 php_value date.timezone Asia/Shanghai
2.httpd的配置说明
# 相当于设置一个别名当访问 172.16.1.1:80/zabbix,就会将 /zabbix 替换 /usr/share/zabbix,资源从/usr/share/zabbix
Alias /zabbix /usr/share/zabbix # /usr/share/zabbix 就是网页的跟目录
# 增加配置,可以访问根路径跳转/zabbix
RewriteEngine On
RewriteRule ^/$ /zabbix/ [R=301,L]
<Directory "/usr/share/zabbix"> # 对当前的网页根目录进行设置
Options FollowSymLinks
AllowOverride None
Require all granted # 该目录的资料允许访问
<IfModule mod_php5.c> # 当用户访问php程序,就会交给 mod_php5.c 进行处理,底层驱动去解析代码
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value max_input_vars 10000
php_value always_populate_raw_post_data -1
php_value date.timezone Asia/Shanghai
</IfModule>
</Directory>
# 其他目录的访问权限设置
<Directory "/usr/share/zabbix/conf">
Require all denied # 拒绝访问
</Directory>
<Directory "/usr/share/zabbix/app">
Require all denied # 拒绝访问
</Directory>
<Directory "/usr/share/zabbix/include">
Require all denied # 拒绝访问
</Directory>
<Directory "/usr/share/zabbix/local">
Require all denied # 拒绝访问
</Directory>
3.启动访问安装
systemctl start httpd
# 访问进行安装即可
# 登录:
用户名:Admin 密码:zabbix
2-1-6.修改中文显示操作
2-1-7.修改中文显示乱码
# 因为缺少字体
1.下载字体文泉仪微黑字体
yum install wqy-microhei-fonts -y
2.将字体赋值到zabbix静态文件中,覆盖原先的字体
cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/zabbix/assets/fonts/graphfont.ttf
3.在刷新网页即可
2-2.Zabbix-Agent
2-2-1.Zabbix-Agent安装
# 安装到当前的server端中,监控zabbix-server主机本身
1.安装ntpdate软件
yum install ntpdate -y
2.设置时间同步
ntpdate -u ntp.aliyun.com
*/5 * * * * /usr/sbin/ntpdate -u cn.ntp.org.cn >/dev/null 2>&1 # 设置一个定时器,进行同步
3.安装agent客户端
yum install zabbix-agent -y
# rpm包安装
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm # 在清华源中安装
rpm -ivh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm # 官方网站中下载
2-2-2.Zabbix-Agent配置文件
# 配置信息官网:
https://www.zabbix.com/documentation/4.0/zh/manual/appendix/config/zabbix_agentd
# 配置文件所在位置
/etc/zabbix/zabbix_agentd.conf
1.配置信息 # 配置中不要有注释信息
grep -vE '^$|^#' /etc/zabbix/zabbix_agentd.conf # 查看配置信息
StartAgents=3 # 默认3,在agent启动时,开启多少个进程,进行处理监控任务
ListenIP=0.0.0.0 # 服务监听地址
ListenPort=10050 # 服务监听端口默认10050。
PidFile=/var/run/zabbix/zabbix_agentd.pid # pid 文件存放位置
LogFile=/var/log/zabbix/zabbix_agentd.log # 日志存放位置
DebugLevel=3 # 日志级别,默认是3
LogFileSize=0 # 日志文件大小(单位MB),0自动回滚,日志会一直存储到这个文件中。如果设置的大小到达这个大小就会截断。
Server=127.0.0.1 # 将信息发送到那个 Zabbix Server或者zabbix proxy,支持多个逗号进行隔开。
ServerActive=127.0.0.1 # 被动发送信息到 Zabbix Server或者zabbix proxy,
Hostname=ZabbixServer # 设置 Agent 识别的主机名(唯一,不能是中文),会在server端上进行显示这个名字。
Include=/etc/zabbix/zabbix_agentd.d/*.conf # 指定额外的配置文件目录,Agent 将包含该目录下的所有配置文件
# 参数说明补充
DebugLevel 参数:
0 - Zabbix进程的起停基本信息
1 - 重要信息
2 - 错误信息
3 - 警告信息
4 - 调试信息 (产生大量信息)
5 - 扩展调试 (产生更多信息)
Server 参数:将信息发送主动发送 Zabbix Server或者zabbix proxy,支持多个逗号进行隔开。 # 主动模式
Server=192.168.1.100,192.168.1.101
ServerActive 参数:被动将信息发送 Zabbix Server或者zabbix proxy,支持多个逗号进行隔开。 # 被动模式
ServerActive=192.168.1.100,192.168.1.101
# 注意:
Server与ServerActive可以同时在一个配置文件中。
2-2-3.Zabbix-Agent启动
1.启动
systemctl start zabbix-agent
2.查看端口
netstat -tunlp | grep 10050
3.查看服务端ui页面
配置 -> 主机 # 当变为绿色,说明已经连接上了,开始监控,可以看到监控的数据。
3.Zabbix基本使用
功能 | 作用 |
---|---|
主机群组 | 整个zabbix的核心(多个主机的集合)。可以将主机归属到这个主机组中,也可以将模版绑定在主机组中。 |
模版 | 是用于定义监控配置的可复用对象,它们是监控系统的核心组件之一。 |
主机 | zabbix的监控的对象,主要就是对主机进行监控。 |
维护 |
3-1.主机群组
概念:
- 将多个主机(Hosts)归类到一个组中的集合。每个主机可以属于一个或多个主机组。主机组本身并不直接监控主机,而是通过分组的方式,方便用户对主机进行批量操作和管理。
作用:
- 批量应用模板:可以将模板批量链接到主机组中的所有主机,而不需要逐个主机操作。
- 批量添加监控项:通过主机组,可以快速为组内的所有主机添加或修改监控项、触发器等。
- 批量维护模式:可以将主机组中的所有主机批量切换到维护模式,避免在维护期间产生不必要的告警。
总结:
- 主要作用主机(将主机组进行分类,分权限)管理,因为整个zabbix可以围绕主机组进行管理。
- 可以进行批量的进行操作,直接对整个主机组下的主机全部生效。
配置 -> 主机群组
3-1-1.创建主机群组
配置 -> 主机群组 -> 创建主机群组
3-2.添加主机操作
添加主机 | IP | 作用 |
---|---|---|
test-01 | 192.168.85.133 | 测试服务器 |
test-03 | 192.168.85.145 | 测试服务器 |
3-2-1.对两台机器安装Zabbix-Agent
1.安装
rpm -ivh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm
2.配置
vim /etc/zabbix/zabbix_agentd.conf
StartAgents=3
ListenIP=0.0.0.0
ListenPort=10050
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
DebugLevel=3
LogFileSize=0
Server=192.168.85.143
ServerActive=192.168.85.143
Hostname=Server
Include=/etc/zabbix/zabbix_agentd.d/*.conf
# Server 与 ServerActive 填写 zabbix-server服务地址
3.启动
systemctl start zabbix-agent
3-2-2.在UI页面添加主机
操作流程:
1.添加一个主机流程:
配置 -> 主机 -> 创建主机
2.填写基本资料
1.主机的名称
2.选择主机的群组
3.填写ip地址
3.添加模版(模版中有监控项)
选择模版 -> 添加
# 注意:
防火墙问题,配置的zabbix-server服务器地址问题。
3-2-3.资产设置
配置 -> 主机 -> 添加主机或者点击主机进行设置时。
# 可以在资产信息中查看到这些主机的信息,如果不设置,其他的用户(分配配了这些监控的组)也无法看到这些主机。
3-2-4.主机列表可用状态的小绿灯亮了说明
说明了,服务器server 与 客户端agent 实现了通信
如果不是绿色,是红色,那么就需要进行排错,根据排除流程执行。确保防火墙可以通信
# 绿色通信可以基于最新数据与图形查看,监控的数据(必须模版中监控项支持查图形化数据)
3-2-5.主机图形数据查看
1.图形化数据查看,数据可视化查看。
# 注意:
需要可视化查看,就必须有相应的图形才可以(需要会根据数据进行创建)。
监控 -> 图形 -> 选择群组(监控设备的分组) -> 选择分组中某个主机 -> 选择展示的图形(比如cpu/内存/磁盘) -> 选择图形展示时间段 # 可以看到最新的数据信息与相对应的触发器信息。
2.怎么查看最新数据
监控 -> 最新数据 -> 搜索需要查看的主机 -> 选择应用集(登录用户是安全的应用集) -> 查看下面的监控项 # 查看某个机器的登录用户有几个
# 对应的zabbix的-get命令
zabbix_get -s 192.168.19.145 -k system.users.num # 参数值可以从模版对应的监控项进行查看键值
3-3.模板功能
作用:
- 模板(Templates)是用于定义监控配置的可复用对象,它们是监控系统的核心组件之一。
- 模板的主要作用是实现监控配置的复用。也可以进行扩展使用。
注意:
- 模版中添加主机组只是一个关联关系,并不会将这个模版应用到主机组中的主机中。
模版的功能字段说明:
字段 说明 监控项(Items)
定义需要采集的数据,例如 CPU 使用率、内存使用率、网络流量等。 触发器(Triggers)
基于监控项的值设置告警条件,例如当 CPU 使用率超过 90% 时触发告警。 图形(Graphs)
定义如何将监控数据以图形的形式展示出来,便于直观查看。 应用集(Applications)
将相关的监控项组织在一起,便于管理和查看。 宏(Macros)
定义可复用的变量,用于模板中某些配置的动态替换。 图解:
1.怎么查看zabbix提供了多少模版
点击配置 -> 点击模版 -> 点击应用
2.模版中可以定义其他的功能
监控项,触发器,图形,应用集,宏
3-3-1.添加模版
点击配置 -> 点击模版 -> 点击创建模版
# 需要填写内容:
1.模版:
1.模版名称:# 名称不能是中文,如果需要中文,可以使用可见名称字段进行填写
这是模板的唯一标识符,用于区分不同的模板。
2.选择群组:
模板需要被分配到一个或多个群组中。
2.链接的模版
# 功能说明:链接现有的模版,直接使用模版的监控项,简化了操作。
1.链接指示器:
选择现有的模版,点击添加
2.链接的模板:
已经连接的模版
3.主机关联新创建模版
配置 -> 主机(选择一台主机) -> 选择模版 -> 链接指示器(选择新建的模版) -> 点击添加 -> 更新 # 这样这个主机就会使用当前模版
3-3-2.添加应用集
作用: 是用于组织和管理监控项的逻辑分组。
添加方式:
添加方式 作用 在模板中创建应用集
在模板中创建的应用集
会根据模版绑定的主机
一起被链接(都会生效)。适合标准化监控配置,便于管理和更新。在主机中创建应用集
只在主机中创建应用集
仅针对单个主机
。提供灵活性,适合特定主机的定制监控需求。创建方式对比:
- 模板中创建 → 所有绑定模板的主机可用
- 主机中创建 → 仅当前主机可用
图解:
1.创建方式:
1.模版创建应用集 # 这个应用集是创建选中的模版之下
配置 -> 模版(选择某个模版) -> 切换到应用集 -> 点击创建应用集
2.主机中创建应用集 # 这个是创建选中的主机之下的应用集
配置 -> 主机 -> 点击应用集 -> 点击创建应用集
# 注意:
还有一种是在创建监控项时,可以创建应用集,这种也属于主机级别创建。
# 说明:
1.使用场景分析:
模版创建:如果你需要为多个主机应用相同的监控配置,应该在模板中创建应用集。
主机创建:如果只针对某个主机添加特定的监控项,应该在主机中创建应用集。
2.管理简单化分析:
模版创建:如果在模版中创建的可以简单化管理,只要更新模版的监控项或者其他的图形,聚合图形,触发器,就会直接对所有使用模版的主机都会生效。
主机创建:如果在主机创建应用集,那么需要手动的进行操作,如果有大量的主机都是这样创建应用集,那么就需要大量操作。
3.建议:
尽量在模版中创建应用集,实现监控配置的标准化和复用。对于特殊情况,可以在主机中创建应用集。
3-3-3.添加触发器
说明: 对监控项设置一个范围,超出这个范围就会在系统中进行提示(设置了邮件提醒或者其他的提醒)。
添加方式:
添加方式 作用 在模板中触发器
在模板中创建的触发器
会根据模版绑定的主机
一起被链接(都会生效)。适合标准化监控配置,便于管理和更新。在主机中创触发
只在主机中创建图形
仅针对单个主机
。提供灵活性,适合特定主机的定制监控需求。
# 操作
配置 -> 模版 -> 触发器(点击)-> 创建触发器 -> 填写名称,严重性选择,选择表达式(选择time_wait监控项作为触发器设置条件当大于等于20触发器触发) -> 点击添加
触发器触发
3-3-4.添加图形
说明: 图形其实就是对监控项数据的可视化展示。
添加方式:
添加方式 作用 在模板中创建图形
在模板中创建的图形
会根据模版绑定的主机
一起被链接(都会生效)。适合标准化监控配置,便于管理和更新。在主机中创建图形
只在主机中创建图形
仅针对单个主机
。提供灵活性,适合特定主机的定制监控需求。图解:
# 操作:
配置 -> 模版 -> 选中模版(点击图形)-> 创建图形(填写图形的名称,选择监控项【监控项就是展示图形数据】)
3-3-5.添加聚合图形
作用: 将模版的图形(多个图形)合并到一起进行展示。可以把从各种来源的信息聚合到一起,以便在单个屏幕上快速查看。
添加方式:
需要先在模版中添加一个图形。
创建一个聚合图形,将图形整合在一起进行展示。
操作流程: 检测 -> 聚合图形 -> 创建聚合图形 -> 填写所属者和名称 -> 保存 点击添加的新的聚合图形的构造函数 -> 点击更改 -> 选择展示的图形(展示主机组下的所有的主机的图形)
3-4.维护功能
作用:
- 维护功能用于在对主机或主机组进行维护操作时,避免产生误告警。
- 当进入维护状态,系统会根据维护配置来决定是否触发告警。
维护类型:
维护类型 说明 有数据收集
在这种模式下,Zabbix 会继续收集监控数据,但不会触发任何告警。 无数据收集
在这种模式下,Zabbix 会完全停止对主机的监控数据收集。
配置 -> 维护
3-4-1.创建维护
配置 -> 维护 -> 创建维护时间
3-4-2.测试查看
# 触发 Checksum of /etc/passwd 监控项,修改50s检测一次
1.对 test-01(维护状态) 与 test-03 同时添加一个用户
useradd testuser
2.查看ui页面的
3-5.监控项
作用:
- 监控项可以说是整个zabbix的核心中的核心,监控项就是主要采集主机中的某些(根据监控项而定的数据)数据。
- 主动获取数据:
- 监控项可以主动的监控设备或者系统,从中获取数据。(例如,对于服务器监控,监控项可以通过 SNMP(简单网络管理协议)协议从网络设备(如交换机、路由器)获取接口流量、CPU利用率等信息)
- 应用程序监控,监控项可以获取应用程序的性能指标。(比如在监控一个Web服务器(如Apache或Nginx)时,监控项可以获取每秒的请求数、响应时间等数据。)
- 被动接受数据:
- 监控项也可以接收被监控对象主动发送的数据。(例如,在一些分布式系统中,应用节点会主动将自身的日志级别、错误信息等发送到Zabbix服务器。)
- 性能指标监控:
- 监控项能够持续监测各种性能指标。对于数据库服务器,监控项可以监测数据库的连接数、查询响应时间、缓存命中率等关键性能指标。(例如,在MySQL数据库中,监控项可以通过查询数据库系统表或者使用特定的命令来获取当前的连接数,从而帮助管理员了解数据库的负载情况。)
- 对于存储系统,监控项可以监测磁盘的I/O操作速率、磁盘空间使用率等。(例如,监控项会定期检查磁盘的使用情况,当磁盘空间使用率超过设定的阈值(如80%)时,就可以及时发出警报,避免因为磁盘空间不足而导致系统故障。)
- 状态监测:
- 监控项可以监测设备或服务的运行状态。(例如,它可以通过ICMP(Internet控制消息协议)ping来监测网络设备是否可达。)
- 对于服务状态监测。(如监控一个邮件服务(如SMTP服务),监控项可以尝试发送测试邮件或者检查服务端口是否开放来判断邮件服务是否正常运行。)
添加方式:
- 添加方式可以满足不同的场景,这种添加方式与应用集添加方式对应。
添加方式 作用 在应用集添加监控项
在 应用集中添加监控项
,那么就会归属于这个应用集
关联的模版
,模版绑定了哪些主机,它们都会生效。在主机添加监控项
在 主机
中添加只是针对单个主机
。提供灵活性,适合特定主机的定制监控需求。注意:
- 在添加监控项时,键值不能再已有的应用集或者监控项中存在。
- 在主机中创建创建监控项,如果绑定的应用集是属于主机的,那么只对主机生效,如果绑定的是模版(公共)中的应用集,就会也只会对主机生效。
- 如果在主机中创建时,并没有指派应用集,那么也只会对主机生效。
- 在模版中的应用集中创建的监控项,会针对绑定模版的全部主机生效。
总结:
- 监控项就是从主机中采集数据(无论是主动还是被动),所以说它就是整个zabbix的核心。所以必须知道怎么配置(自定义)监控项。
- 监控项时是用于采集数据的基本单元。
- 主机中的监控项是“私有”的,只影响该主机。
- 模板中的监控项是“共享”的,会影响所有绑定该模板的主机。
- 应用集只是监控项的分组方式,不改变监控项生效的主机范围。
图解:
3-5-1.自定义添加监控项
1.为什么自定义添加监控项
模板里面提供了大量的监控项,为何还要自定义,为了监控默认配置中没有的,并且zabbix支持自定义监控项。
2.自定义监控项的方式
自定义监控项的表现形式是(命令、脚本),只要能获取到值,就可以通过zabbix展示。
3.自定义完整流程
1.编写命令脚本(需要再agent中编写)
2.编写zabbix的自定义监控项的配置文件。
3.重启zabbix-agent,通过zabbix_get测试是否可以拿到数据。
4.在前端页面进行设置。
3-5-2.采集TCP的11种状态命令
状态 | 说明 |
---|---|
CLOSED |
表示初始状态。 |
LISTEN |
表示服务器端的某个SOCKET处于监听状态,可以接受连接。 |
SYN_SENT |
在服务端监听后,客户端SOCKET执行CONNECT连接时,客户端发送SYN报文,此时客户端就进入等待服务端的确认。 |
SYN_RCVD |
表示服务端接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态。 |
ESTABLISHED |
表示连接已经建立了。 |
FIN_WAIT_1 |
这个是已经建立连接之后,其中一方请求终止连接,等待对方的FIN报文。 |
FIN_WAIT_2 |
实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。 |
TIME_WAIT |
表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。 |
CLOSING |
这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。 |
CLOSE_WAIT |
这种状态的含义其实是表示在等待关闭。 |
LAST_ACK |
这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。 |
1.采集命令
netstat -ant
2.例如采集 LISTEN 的数据:
netstat -ant | grep 'LISTEN' | wc -l
3-5-3.配置zabbix-agent采集脚本
语法规则:
UserParameter=<key>,<shell command>
存储目录:
/etc/zabbix/zabbix_agentd.d # yum安装 情况下
1.创建zabbix-agent采集脚本文件
touch /etc/zabbix/zabbix_agentd.d/script.conf
2.简单配置语法 # 适用于单条,不可复用
1.第一种
UserParameter=key名称,HOME= 对应的命令 # 如果HOME=后面对应的是命令,需要有空格,如果不是命令不需要空格。
2.第二种
UserParameter=key名称,对应的命令 # 没有什么要求
例如:
# 第一种写法:命令与等号之间需要空格区分,不然会出现无法识别,哪怕是全路径也不行
UserParameter=wcpasswd,HOME= /usr/bin/wc -l /etc/passwd
UserParameter=wcpasswd,HOME= wc -l /etc/passwd
# 第二种写法
UserParameter=wcpasswd,/usr/bin/wc -l /etc/passwd
# 注意:
这种写法,如果针对多条命令,命令都是重复的,但是查询的资源不同,比较繁琐。
例如:tcp的11中状态,那么就需要些11条。
UserParameter=LISTEN,netstat -ant|grep -c LISTEN
UserParameter=TIME_WAIT,netstat -ant|grep -c TIME_WAIT
UserParameter=ESTABLISHED,netstat -ant|grep -c ESTABLISHED
3.高级配置语法 # 适用于可复用
1.命令写法
# 属于传递参数的写法,与shell脚本传递参数相同,将第一个参数传递给 $1
1.命令
UserParameter=tcp.status[*],netstat -ant|grep -c $1
2.写入
echo 'UserParameter=tcp.status[*],netstat -ant|grep -c $1' > /etc/zabbix/zabbix_agentd.d/script.conf
2.脚本写法 # 这种写法相对比较复杂,不如上面的写法简单,但是可以处理更多的内容
1.创建脚本
vim /opt/zabbix_agent_tcp_script/tcp_status.bash # 脚本名称
#! /bin/bash
netstat -ant|grep -c $1 # 脚本内容
2.设置脚本可执行
chmod +x /opt/zabbix_agent_tcp_script/tcp_status.bash
3.写入zabbix-agent脚本文件
UserParameter=tcp.status[*],/opt/zabbix_agent_tcp_script/tcp_status.bash $1
echo 'UserParameter=tcp.status[*],/opt/zabbix_agent_tcp_script/tcp_status.bash $1' > /etc/zabbix/zabbix_agentd.d/script.conf
3.重启客户端的zabbix-agent
systemctl restart zabbix-agent
4.测试(在zabbix-server进行测试)
zabbix_get -s 192.168.85.145 -k tcp.status[LISTEN]
zabbix_get -s 192.168.85.145 -k tcp.status[TIME_WAIT]
zabbix_get -s 192.168.85.145 -k tcp.status[ESTABLISHED]
3-5-4.在前端页面添加监控项-1
# 监控项的添加方式也是两种
1.在模版的应用集中添加,会应用到所有关联当前应用集的模版的主机组的主机中
2.在主机中添加,只会在主机中生效(哪怕在已经存在的应用集中添加【可以在模版中查询的应用集】,也只会对当前主机生效)。
# 总结
所以在添加监控项时,请从模版的应用集中添加,除非特殊情况(主机需要)。
添加流程:
配置 -> 模版 -> 搜索(需要将监控项创建到这个模版下)-> 点击监控项 -> 点击创建监控项 -> 保存
填写添加监控项数据:
1.名字是必填项,不能重复 # 名称 tcp_status_listen
2.键值必填项,不能重重复 # 添加的key tcp.status[LISTEN]
3-5-5.在前端页面添加监控项-2
按照TCP状态,将11个状态进行添加
1.名称:tcp_status_time_wait 添加key: tcp.status[TIME_WAIT]
2.名称:tcp_status_last_ack 添加key: tcp.status[LAST_ACK]
3.名称:tcp_status_closed 添加key: tcp.status[CLOSED]
4.名称:tcp_status_syn_sent 添加key: tcp.status[SYN_SENT]
5.名称:tcp_status_syn_rcvd 添加key: tcp.status[SYN_RCVD]
6.名称:tcp_status_established 添加key: tcp.status[ESTABLISHED]
7.名称:tcp_status_fin_wait_1 添加key: tcp.status[FIN_WAIT_1]
8.名称:tcp_status_fin_wait_2 添加key: tcp.status[FIN_WAIT_2]
9.名称:tcp_status_closing 添加key: tcp.status[CLOSING]
10.名称:tcp_status_close_wait 添加key: tcp.status[CLOSE_WAIT]
操作:
点击到刚刚添加的监控项 -> 点击克隆 -> 修改名字和键值
3-5-6.查看最新数据
4.Zabbix命令使用
4-1.Zabbix-get命令
文档:https://www.zabbix.com/documentation/4.0/zh/manual/concepts/get
作用:它可以用于与 Zabbix agent 进行通信,并从 Zabbix agent 那里获取所需的信息。zabbix服务器 查询 zabbix客户端
参数:
参数 作用 -s
或者--host
指定目标主机名或IP地址(agentip或者主机名称) -p
或者--port
指定主机上运行 Zabbix agent 的端口号。默认端口10050 -K
或者--key
指定要从监控项键值检索的值(这个键值就是 模版 -> 监控项的键值,或者是自定义的监控项键值)
1.安装命令 # 在服务端安装
yum install zabbix-get -y
2.使用命令
zabbix_get -s agent端的ip -k key值
例如:
zabbix_get -s 192.168.85.145 -k agent.ping # 确定是否ping通
zabbix_get -s 192.168.85.145 -k agent.version # 查看客户端的 agent版本
4.Zabbix报警媒介设置
说明: 报警的前提是,触发器触发,触发后就会设置报警(触发器(Trigger)判断某个条件是否成立【比如“CPU 使用率 > 90% 超过 5 分钟”】)。
媒介类型 | 描述 | 配置方法 |
---|---|---|
邮箱 (Email) | 通过电子邮件发送告警 | 在 Zabbix 服务器配置文件中设置 SMTP 服务器信息 |
微信 (WeChat) | 通过微信公众号、企业微信或微信模板消息发送告警 | 使用企业微信 API、微信模板消息 API 或第三方服务 |
钉钉 (DingTalk) | 通过钉钉群机器人发送告警 | 使用钉钉群机器人的 Webhook URL |
短信 (SMS) | 通过短信发送告警 | 使用第三方短信服务,如阿里云短信服务、腾讯云短信等 |
自定义脚本 (Custom Script) | 通过用户定义的脚本发送告警 | 编写脚本并在 Zabbix 媒介类型中配置 |
4-1.邮箱报警
流程:
- 给zabbix设置发件人的密码账户。
- 设置收件人的邮箱。
- 开启执行触发器后的,触发邮件动作。
4-1-1.zabbix中添加报警媒介类型
# 设置一个简单的触发条件监控项,确保可以使用
1.添加到脚本中 # 添加到 test-01机器中
echo 'UserParameter=user_count,HOME= who | wc -l' > /etc/zabbix/zabbix_agentd.d/script.conf
2.重启机器
systemctl restart zabbix-agent
3.在前端ui页面设置监控项
4.设置当前监控项的触发器
user_count >= 2 时进行触发
1.需要获取邮箱的授权密码 # qq邮箱为例
qq邮箱授权:tawcbmofavlybfhe / xfpfufogvnlrbdja
2.在zabbix中设置报警媒介
管理 -> 报警媒介类型 -> 添加报警媒介 # 将媒介启用
4-1-2.在用户资料中设置报警媒介
# 操作
点击用户图标 -> 选择报警媒介 -> 添加报警媒介(选择类型 + 输入接受邮箱)# 将媒介启用
4-1-3.添加新的动作
# 动作是在触发器触发后,执行的操作(发邮件,发送手机短信,钉钉或者微信)
# 操作
配置 -> 动作 -> 添加动作 -> 编写动作(触发条件) -> 编写操作(设置谁能接收到信息) -> 编写操作恢复(设置谁能接收到信息)# 将动作启用
4-1-4.进行测试
触发当前设置的简单的触发器。
4-2.微信报警
流程:
- 注册企业微信。获取企业微信ID与微信的API接口。
- 写一个脚本(主要使用这个微信的API接口)。
- zabbix配置脚本。
4-2-1.注册企业微信
注册企业微信网址:
https://work.weixin.qq.com/wework_admin/frame
操作流程:
1.注册
2.进入后台管理
3.修改通信录的名称
4.创建应用
5.获取这个应用的ID号和应用秘钥
id:1000002
秘钥:4qg_mmv5lzrWhme1nf95qPMewcsQbNDpGm3D-dJPQGU # 需要手机登录企业微信后,从企业微信团队信息中查看。
6.获取企业的id
id:ww6043ed9caddc076a
7.关注当前创建的企业微信
4-2-2.设置应用白名单
# 注意:
需要设置白名单,不设置,无法使用接口进行发送数据
说明: https://open.work.weixin.qq.com/devtool/query?e=60020
需要再当前创建的应用中设置白名单(企业可信ip)。 在添加企业可信ip时需要请先'设置可信域名或设置接收消息服务器URL'。
4-2-3.微信报警逻辑架构图
4-2-4.编写脚本-python
# 使用python设置
1.安装python 3
yum install python3 python3-devel python3-pip
2.安装包
pip3 install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
3.脚本内容
#!/usr/bin/env python3
import requests
import sys
import os
import json
import logging
# 日志格式构造
logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join('/tmp','weixin_python.log'),
filemode = 'a')
# 企业ID
corpid='ww0d835870608d79e8'
# 应用秘钥
appsecret='4qg_mmv5lzrWhme1nf95qPMewcsQbNDpGm3D-dJPQGU'
# 应用id
agentid=1000002
# 获取身份令牌,用于和微信通信的认证
# 参考企业微信API文档https://developer.work.weixin.qq.com/document/path/90487
token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid +'&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']
msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken
# 构造消息体
# sys.argv 接受执行脚本时的传入的位置参数,使用[数值]进行取值
#touser=sys.argv[1]
toparty=sys.argv[1]
subject=sys.argv[2]
# 发送微信消息的数据格式
message=sys.argv[2] + "\n\n" +sys.argv[3]
params={
#"touser": touser,
"toparty": toparty,
"msgtype": "text",
"agentid": agentid,
"text": {
"content": message
},
"safe":0
}
# 最终发请求
req=requests.post(msgsend_url, data=json.dumps(params))
# 调试请求发送结果
# print(req.content)
# 记录日志
logging.info(f'\n 发送的企业微信组:{toparty};\n 标题:{subject};\n 内容:{sys.argv[3]};\n 响应结果:{req.content}')
4.测试脚本
python3 weixin.py '部门id' '我是标题' '我是内容'
python3 weixin.py 1 '我是标题' '我是内容'
# 注意
一定要将外网ip地址添加到企业信任ip中,不然是无法接受到信息的。
4-2-5.编写脚本-shell
1.脚本
vim zabbix.sh
#!/bin/bash
agentid='1000002' # 企业微信的应用ID
corpid='ww0d835870608d79e8' # 企业微信的企业ID
corpsecret='4qg_mmv5lzrWhme1nf95qPMewcsQbNDpGm3D-dJPQGU' # secretID,企业微信应用的秘钥
#user=$1 #接受者的账户,由zabbix传入 ,发送单个人
group=$1 # 接收信息的组,企业微信的通讯录id
title=$2 # 报警邮件标题,由zabbix传入 ,zabbix中发送消息的头部标题
message=$3 # 报警邮件内容,由zabbix传入 ,zabbix中发送消息的正文
# 获取token信息,需要在链接里带入ID,提取token
# -s 安静执行
# -X 指定请求方法
token=$(curl -s -X GET "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${corpsecret}"|awk -F \" '{print $10}')
# 构造语句执行发送动作,发送http post请求
# -H 设置请求头
# -d 构造的json数据
curl -s -H "Content-Type: application/json" -X POST "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}" -d' {
"toparty" : "'"${group}"'",
"msgtype" : "text",
"agentid" : "'"${agentid}"'",
"text" : {
"content" : "'"${title}\n\n${message}"'"
},
"safe":0
}' >> /tmp/weixin_bash.log
# 将报警信息写入日志文件
echo -e "\n报警时间:$(date +%F-%H:%M)\n报警标题:${title}\n报警内容:${message}" >> /tmp/weixin_bash.log
2.执行脚本
bash zabbix.sh '发送的企业微信的部门id' '标题' '内容'
# 补充:
1.shell json格式构造(字符串):
'{"key": "'"${提取的变量}"'"}'
2.关于白名单的问题:
当发送消息,发送不出去,需要查看是否在应用中配置白名单ip
应用管理->企业可信ip
需要对应用程序配置白名单ip,前提需要一个可信用的ip/域名/服务器
错误代码信息说明:https://developer.work.weixin.qq.com/devtool/query?e=60020
4-2-6.zabbix设置脚本,UI页面设置
自定义报警文档:
https://www.zabbix.com/documentation/3.4/zh/manual/config/notifications/media/script
宏参数查询
https://www.zabbix.com/documentation/3.4/zh/manual/appendix/macros/supported_by_location
1.在zabbix-server配置文件
AlertScriptsPath=/usr/lib/zabbix/alertscripts # 没有请添加这个参数
/usr/lib/zabbix/alertscripts # 存放脚本的目录,将编写好的脚本移动到当前目录下。
2.移动
mv /opt/zabbix.sh /usr/lib/zabbix/alertscripts/
chown zabbix.zabbix /usr/lib/zabbix/alertscripts/zabbix.sh
chmod +x /usr/lib/zabbix/alertscripts/zabbix.sh
chown zabbix.zabbix /tmp/weixin_bash.log
3.脚本传入的参数
1.组id 2.报警的头部title 3.报警的主要内容content ,这些参数可以通过zabbix的宏进行提那几
# 脚本的顺序不能乱
{ALERT.SENDTO} -> 接受个人媒介设置的收件人控件内容(ALERT.SENDTO接受收件人控件填写的信息) # 添加企业部门id
{ALERT.SUBJECT} -> 动作中的消息模板的标题
{ALERT.MESSAGE} -> 动作中的消息模板的消息
# 注意
一定要确保配置 -> 动作(介质设置为全部介质或者指定好介质)不然发送不出去。
4-2-4.进行测试
触发当前设置的简单的触发器。
4-3.钉钉报警
流程:
- 需要先创建一个团队或者企业
- 创建一个群组
- 在创建群组中创建群组机器人
4-3-1.创建群聊
4-3-2.创建群聊机器人
1.文档地址:
https://open.dingtalk.com/document/robots/custom-robot-access # 机器人说明文档
https://open.dingtalk.com/document/orgapp/custom-robots-send-group-messages # 机器人接口文档
2.创建完毕后,会生成一个webhook的地址,通过这个地址可以进行触发群机器人。# 建议增加上加密方式
https://oapi.dingtalk.com/robot/send? access_token=d6d89bdcc06b34ab5f44b6ab6e9bafd738727197e31620d88af11581be9463a5 # api要保存好,使用的是post请求。
4-3-3.测试webhook地址
1.通过crul传递参数
curl 'https://oapi.dingtalk.com/robot/send?access_token=d6d89bdcc06b34ab5f44b6ab6e9bafd738727197e31620d88af11581be9463a5' \
-X POST \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text","text": {"content": "zabbix 报警测试,哈哈哈哈"}}'
2.使用python
import requests
access_token = "d6d89bdcc06b34ab5f44b6ab6e9bafd738727197e31620d88af11581be9463a5"
url = f"https://oapi.dingtalk.com/robot/send?access_token={access_token}"
data = {"msgtype": "text", "text": {"content": " zabbix 报警测试,哈哈哈哈"}}
r = requests.post(url, json=data)
print(r.status_code, r.text)
3.@具体的某个人
在传递的数据中需要加上这个人的手机号
data = {"msgtype": "text", "text": {"content": " zabbix 报警测试,哈哈哈哈"},"at":{"atMobiles":[具体群组中的个人手机号或者员工ID,],"isAtAll":false},}
例如:
data = {"msgtype": "text", "text": {"content": " zabbix 报警测试,哈哈哈哈"},"at":{"atMobiles":[1895855451,1895855452],"isAtAll":false},}
那么就会@群中的手机号是1895855451,1895855452俩个用户。
4-3-4.编写zabbix脚本-python
1.脚本
vim dingding.py
#!/usr/bin/python3
import os
import sys
import json
import logging
import requests
BASE_PATH=os.path.dirname(os.path.abspath(__file__))
logging.basicConfig(level = logging.INFO, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join(BASE_PATH,'dingding_python.log'),
filemode = 'a')
# 位置参数1 手机号码
user_phone=sys.argv[1]
# 参数2,消息正文(zabbix tilte + content)
text=sys.argv[2] + "\n\n" + sys.argv[3]
access_token = "d6d89bdcc06b34ab5f44b6ab6e9bafd738727197e31620d88af11581be9463a5"
# 钉钉机器人API
webhook_url=f"https://oapi.dingtalk.com/robot/send?access_token={access_token}"
# 请求传递的参数
# 构造json数据体
data={
"msgtype":"text",
"text":{
"content":text
},
"at":{
"atMobiles":[user_phone,],
"isAtAll":False
}
}
# 请求头,表明请求类型是json
headers={"Content-Type":"application/json"}
# 发HTTP请求,POST方式,传入数据与请求头
response=requests.post(url=webhook_url,data=json.dumps(data),headers=headers)
print(response.json())
if response.json().get('errcode') == 0:
logging.info(f"send successful : {response.content}")
else:
logging.error(f"fail in send : {response.content}")
2.执行脚本
python dingding.py 手机号 "消息title" "关键字:zabbix 主要内容"
4-3-5.编写zabbix脚本-shell
1.脚本
vim dingding.sh
#!/bin/bash
#webhook 地址 webhook=''
#接受者的手机号,由 zabbix 传入
user=$1
#报警邮件标题,由 zabbix 传入
title=$2
#报警邮件内容,由 zabbix 传入
message=$3
# 构造语句执行发送动作
# bash就是用curl 构造json数据发出去而已,注意引号的细节就好
# 通过API返回的数据,来确认是否发送正确
curl -s \
-H "Content-Type: application/json" \
-X POST "https://oapi.dingtalk.com/robot/send?access_token=d6d89bdcc06b34ab5f44b6ab6e9bafd738727197e31620d88af11581be9463a5" \
-d '{"msgtype":"text","text":{"content":"'"${title} \n\n ${message}"'"},"at":{"atMobiles":["'"${user}"'"],"isAtAll":false}}' >> /tmp/ding_bash.log
#将报警信息写入日志文件
echo -e "\n 报警时间:$(date +%F-%H:%M)\n 报警标题:${title}\n 报警内容:${message}" >> /tmp/ding_bash.log
2.执行:
bash dingding.sh 手机号 '我是标题' '我是内容:zabbix报警了'
4-3-6.zabbix设置脚本,UI页面设置
# 操作与企业微信的操作是相同。
1.将脚本存放在 /usr/lib/zabbix/alertscripts 目录下,设置权限。
mv /opt/dingding.sh /usr/lib/zabbix/alertscripts/
chown zabbix.zabbix /usr/lib/zabbix/alertscripts/dingding.sh
chmod +x /usr/lib/zabbix/alertscripts/dingding.sh
chown zabbix.zabbix /tmp/ding_bash.log
2.添加报警媒介类型
1.设置报警媒介类型是
脚本
2.脚本名称
dingding.sh
3.脚本参数 # 顺序不能乱
{ALERT.SENDTO} -> 获取的值就是在用户设置中,媒介设置的收件人信息
{ALERT.SUBJECT} -> 动作中的消息模板的标题
{ALERT.MESSAGE} -> 动作中的消息模板的消息
3.添加用户的报警媒介
4.修改动作中的消息内容,增加关键字
4-3-7.进行测试.
触发当前设置的简单的触发器。
4-4.SMS短信
短信操作和钉钉和企业微信是相同的操作。也是通过脚本调用发送。
4-5.自定义动作消息内容
# 需要使用到zabbix的宏这个概念,可以理解为zabbix内部的变量。
文档:
https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location
宏是什么:
宏类似于zabbix监控项的key类型,可以根据宏获取想要的字段信息,在发送信息中展示,自定义的消息内容,需要根据需要在zabbix官网上查看宏的信息,通过宏获取想要的内容。
注意问题:
1.发送新的内容,怎么构建需要查阅zabbix 宏的文档
2.发送信息发送给谁,按照群组还是个人,发送的消息是以什么方式 email / sms / jabber
3.发送的操作类型,是信息还是命令
关于这个消息体:
只要在动作中设置了这个消息体,那么只要消息体的介质中没有限制(邮箱/微信/钉钉),那么任何都可以使用这个消息体。
4-4-1.怎么修改消息内容
配置 -> 动作 -> 选择启用的动作点击 -> 修改操作消息内容与恢复的消息内容(点击更新)
4-4-2.自定义消息模版
----------------------------------------------------------------------
# 报警的自定义修改
默认标题:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
报警信息:
告警主机:{HOSTNAME1} {HOST.IP}
告警时间:{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} {HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
5.Zabbix监控核心服务
5-1.对Nginx监控
# 通过 nginx自身的 status 进行监控
# 操作流程
1.开启nginxstatus页面
2.编写zabbix的脚本监控nginxstatus界面
3.在zabbix-ui界面展示添加监控项和触发器。
# 注意
关闭防火墙和selinux
5-1-1.Nginx开启status服务
nginx 需要安装 -with-http_stub_status_module 模块才可以支持 nginx 连接数
1.创建一个虚拟主机配置文件,开启nginx的状态页
vim /etc/nginx/conf.d/nginxstatus.conf
server {
listen 80;
server_name _;
location /nginx_status {
# 开启状态页
stub_status off;
# 关闭日志
access_log off;
}
}
2.重启nginx,在进行访问
nginx -s reload
5-1-2.Nginx的status监控脚本
vim /opt/nginx_status.sh # 文件存储的位置
# 脚本
#!/bin/bash
# 将脚本设置一个通用的,通过传递位置参数获取指定值
NGINX_COMMAND=$1
CACHEFILE="/var/tmp/nginx_status.log" # 日志文件一定要设置zabbix的属主属组权限
CMD="/usr/bin/curl http://127.0.0.1/nginx_status"
# 判断是否有status日志文件
if [ ! -f $CACHEFILE ];then
$CMD > $CACHEFILE 2>/dev/null
fi
# 检查status日志有效期,限定状态文件在60秒内
# 记录最后一次status日志的生成时间(秒)
STATUS_TIME=$(stat -c %Y $CACHEFILE)
# 以unix时间计算,seconds since 1970-01-01 00:00:00 UTC
# 当前系统时间减去日志时间,推算,是否超过60秒,超过就立即重新生成
TIMENOW=$(date +%s)
# 大于60秒,删除文件。
if [ $[ $TIMENOW - $STATUS_TIME ] -gt 60 ];then
rm -f $CACHEFILE
fi
# 重新写入文件
if [ ! -f $CACHEFILE ];then
$CMD > $CACHEFILE 2>/dev/null
fi
# 设置文件权限
owner=$(stat -c "%U" "$CACHEFILE")
group=$(stat -c "%G" "$CACHEFILE")
if [ "$owner" != "zabbix" -o "$owner" != "zabbix" ];then
chown zabbix.zabbix $CACHEFILE > /dev/null
chmod +x $CACHEFILE
fi
nginx_active(){
grep 'Active' $CACHEFILE |awk '{print $NF}'
exit 0;
}
nginx_reading(){
grep 'Reading' $CACHEFILE |awk '{print $2}'
exit 0;
}
nginx_writing(){
grep 'Writing' $CACHEFILE |awk '{print $4}'
exit 0;
}
nginx_waiting(){
grep 'Waiting' $CACHEFILE |awk '{print $6}'
exit 0;
}
nginx_accepts(){
awk NR==3 $CACHEFILE|awk '{print $2}'
exit 0;
}
nginx_handled(){
awk NR==3 $CACHEFILE|awk '{print $2}'
exit 0;
}
nginx_requests(){
awk NR==3 $CACHEFILE|awk '{print $3}'
exit 0;
}
# 监控nginx是否存活
check() {
# 通过ss 或者 netstat 查看端口情况,如果是1说明存活,如果是0说明挂了
nginx_pro_count=`ss -tunlp|grep nginx|wc -l`
echo $nginx_pro_count
}
# 对脚本传入参数判断,需要获取什么值
case $NGINX_COMMAND in
active)
nginx_active ;;
reading)
nginx_reading;;
writing)
nginx_writing;;
waiting)
nginx_waiting;;
accepts)
nginx_accepts;;
handled)
nginx_handled;;
requests)
nginx_requests;;
check)
check;;
*)
echo "Invalid arguments"
exit 2
;;
esac
# 注意:
1.自定义监控内容,也就是自定义key的操作,脚本核心思路就是,提取status页面的数值,交给zabbix。
2.这个脚本时创建日志的时间与当前的时间做对比不能大于60秒,意思就是记录60秒内的nginx的链接数,设置监控项也要设置在60秒,不然数据不同步。
# 验证
bash /opt/nginx_status.sh active
5-1-3.编写agent脚本
1.脚本
echo "UserParameter=nginx_status[*],/bin/bash /opt/nginx_status.sh $1" > /etc/zabbix/zabbix_agentd.d/nginx_status.conf
2.需要对 /opt/nginx_status.sh 设置可执行全部,不然server端调用时出现权限不足
chown zabbix.zabbix /opt/nginx_status.sh
chmod +x /opt/nginx_status.sh
2.重启agent端
systemctl restart zabbix-agent
3.通过server端测试键值是否可用
zabbix_get -s 192.168.85.147 -k nginx_status[active]
5-1-4.添加模版与监控项和主机
# 流程:
1.创建模版,目的为了其他主机也可以使用
2.对新创建的模版添加监控项 # 后续可以根据监控项增加触发器或者图形
3.添加主机 (192.168.85.147)
3.主机关联模版
4.查看最新数据
5-2.对PHP监控
# 基于php实现的状态的监控,基于php-fpm实现的功能,这个操作其实与nginx的相同
1.下载php-fpm
yum install php-fpm -y
2.修改配置,开启php status
vim /etc/php-fpm.d/www.conf
pm.status_path=/php_status # 打开注释,就是一个访问的入口
[root@shell ~]$grep '^pm.status.*' /etc/php-fpm.d/www.conf
pm.status_path = /php_status
3.通过nginx配置,进行转发
# 添加一个location 地址
server {
listen 80;
server_name _;
location /php_status {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name;
include fastcgi_params;
}
}
4.启动fpm,重启nginx
systemctl start php-fpm
systemctl restart nginx
3.访问
http://ip/php_status
5-2-1.解释页面字段
pool: www # 表示当前的 PHP-FPM 池名,通常在 www.conf 配置文件中定义([www])
process manager: dynamic # 标识php-fpm的进程管理方式 1.static:固定数量的子进程 2.dynamic:根据负载自动增减(常用)3.ondemand:按需启动,空闲时销毁子进程
start time: 10/Jun/2025:10:44:20 -0400 # 表示 PHP-FPM 服务启动的时间。
start since: 61 # 表示服务已运行的时间,单位为秒。从启动时间到现在为止的秒数。
accepted conn: 1 # 表示已接受的请求连接总数(连接请求数,不是进程数)。
listen queue: 0 # 当前等待进入的连接数量(未处理的连接)。值大于 0 表示处理不过来。
max listen queue: 0 # 自启动以来观察到的最大等待连接数。
listen queue len: 128 # socket 的最大等待连接队列长度(配置中的 listen.backlog 设置)。
idle processes: 4 # 当前空闲(可用)进程数。
active processes: 1 # 当前正在处理请求的进程数。
total processes: 5 # 当前的总进程数(= idle + active)。
max active processes: 1 # 服务启动以来同时处理请求的最大进程数。
max children reached: 0 # 达到最大子进程数的次数(即请求被拒绝的次数)。如果此数大于 0,说明 pm.max_children 设置可能过小。
slow requests: 0 # 慢请求数量(请求时间超过 request_slowlog_timeout 设置的值)。如果大于 0,需要调查性能瓶颈。
5-2-2.编写php的status脚本
vim /etc/zabbix/zabbix_agentd.d/php_status.sh
#!/bin/bash
# 这是一个简单的监控php-fpm状态值的脚本
comm_para=$1
PHP_URL=$2
cmd="/usr/bin/curl $url"
cachefile=/tmp/php_status.txt
# 先将文件进行创建,不然报错
if [ ! -f ${cachefile} ];then
touch ${cachefile}
fi
port=80
file_time=`stat -c %Y $cachefile`
now_time=`date +%s`
rm_file=$(($now_time-$file_time))
if [ -z $2 ];then
# 路径需要与nginx设置的转发给fastcgi到php-fpm的location要相同
url=http://127.0.0.1:$port/php_status
else
url=$PHP_URL
fi
cmd="/usr/bin/curl $url"
# 文件存在就进行写入,没有就不写
if [ -f $cachefile ];then
$cmd > $cachefile 2>/dev/null
fi
if [ $rm_file -gt 60 ];then
rm -rf $cachefile
fi
start_since() {
#运行时长
cat $cachefile | awk '/since/{print $3}'
exit 0;
}
accepted_conn() {
cat $cachefile | awk '/accepted/{print $3}'
exit 0;
}
listen_queue(){
cat $cachefile | awk '{if(NR==6){print $3}}'
exit 0;
}
max_listen_queue(){
cat $cachefile | awk '{if(NR==7){print $4}}'
exit 0;
}
listen_queue_len() {
cat $cachefile | awk '{if(NR==8){print $4}}'
exit 0;
}
idle_processes() {
cat $cachefile | awk '/idle/{print $3}'
exit 0;
}
active_processes() {
cat $cachefile | awk '{if(NR==10){print $3}}'
exit 0;
}
total_processes() {
cat $cachefile | awk '{if(NR==11){print $3}}'
exit 0;
}
max_active_processes() {
cat $cachefile | awk '{if(NR==12){print $4}}'
exit 0;
}
max_children_reached() {
cat $cachefile | awk '{if(NR==13){print $4}}'
exit 0;
}
slow_requests() {
cat $cachefile | awk '{if(NR==14){print $3}}'
exit 0;
}
check() {
# 通过ss 或者 netstat 查看端口情况,如果是1说明存活,如果是0说明挂了
php_pro_count=`ss -tunlp|grep php-fpm|wc -l`
echo $php_pro_count
}
case "$comm_para" in
start_since)
start_since
;;
accepted_conn)
accepted_conn
;;
listen_queue)
listen_queue
;;
max_listen_queue)
max_listen_queue
;;
listen_queue_len)
listen_queue_len
;;
idle_processes)
idle_processes
;;
active_processes)
active_processes
;;
total_processes)
total_processes
;;
max_active_processes)
max_active_processes
;;
max_children_reached)
max_children_reached
;;
slow_requests)
slow_requests
;;
check)
check
;;
*)
echo "invalid status"
exit 2;
esac
设置执行权限
chmod +x /etc/zabbix/zabbix_agentd.d/php_status.sh
5-2-3.编写agent脚本
1.编写自定义key的配置文件
vim /etc/zabbix/zabbix_agentd.d/php_status.conf
UserParameter=php_status[*],HOME=/bin/bash /etc/zabbix/zabbix_agentd.d/php_status.sh $1
2.重启agent服务
systemctl restart zabbix-agent
3.在server端进行测试
zabbix_get -s 192.168.85.147 -k php_status[active_processes]
zabbix_get -s 192.168.85.147 -k php_status[accepted_conn]
5-2-3.添加模版与监控项和主机
# 流程:
1.创建模版,目的为了其他主机也可以使用
2.对新创建的模版添加监控项 # 后续可以根据监控项增加触发器或者图形
3.添加主机 (192.168.85.147)
3.主机关联模版
4.查看最新数据
5-3.WEB监控
zabbix除了能通过脚本+自定义key,实现服务器数据提取监控以外,也支持对网页的HTTP请求、响应监控。也就是网页的状态进行监控,web监控也就是对web url进行监控,监控他的状态码,也可以使用crul命令进行脚本监控。 # 对某个url进行检测他的状态,或者是网页的字符串是否存在。可以监控网站接口。
web监控需求:
以zabbix-UI页面的登录监控,模拟登录,输入账号密码,实现首页的健康监控。
# 输入账户密码,点击登录,获取响应码根据响应码进行触发器设置,类似一个自动化的操作
1. 模拟登录输入zabbix账号密码,登录后台,如果登录失败就报警
2. 基于响应状态码判断 非200即报警
流程:
1.添加一个模版
2.在添加的模版中,添加一个web场景
3.编写web场景的基本信息
4.编写web场景的步骤
5-3-1.创建一个模版添加web场景
流程:
1.添加一个模版
2.在添加模版中添加一个web监测 # 注意,参数一定要添加全。
5-3-2.主机关联模版
关联到zabbix-server 主机上
5-3-3.查看添加web场景数据
流程:
监测 -> web监测(选择群组,选择主机)
5-4.数据库监控
操作与监控主机是相同,只不过是监控一个软件,无论是监控什么都是一个概念。
操作:
1.安装数据库 # mysql为例,安装mysql,创建mysql的用户并且授权(没有访问表权限)可用就行。
2.安装agent服务,编写agent脚本
3.设置模版,设置监控项,主机即可(运行msylq的机器)
5-4-1.编写agent脚本
1.脚本
vim /etc/zabbix/zabbix_agent.d/userparameter_mysql.conf
UserParameter=mysql.ping,mysqladmin -u zabbix -p'zabbix' ping | grep -c alive
UserParameter=mysql.version,mysql -V
2.重启agent
systemctl restart zabbix-agent
3.server端测试
zabbix_get -s 192.168.85.143 -k mysql.ping
5-4-2.添加模版与监控项和主机
# 流程:
1.创建模版,目的为了其他主机也可以使用
2.对新创建的模版添加监控项 # 后续可以根据监控项增加触发器或者图形
3.添加主机 (192.168.85.143)
3.主机关联模版
4.查看最新数据
6.Zabbix功能
6-1.Zabbix的模式
工作模式:
- 主动模式
- 被动模式
- 理解:
- 被动模式:是server端主动从agent端要数据。
- 主动模式,server端等待agent端主动抛数据。
被动模式:
zabbix-server
发送请求要获取的某个key的值给zabbix-agent
,zabbix-agent
在进行处理,调用对应的脚本执行采集机器的数据,在返回给zabbix-server
,再zabbix-ui
页面进行展示,这个过程是一步一步来的,有多少个监控项,zabbix-server
就会请求zabbix-agent
多少次,执行多少次的脚本。zabbix-server
发送请求,zabbix-agent
也在发送响应数据,zabbix-agen
t 在接受请求,也在响应数据。- 这种工作模式下,如果机器少不会存在什么影响,但是如果机器多效率就比较慢。理解:在上学时期课代表收作业,课代表一个一个从同学那里收取作业,如果是一个班(45个人)还行,如果是一个年级或者说一整个学校,那么效率就低了。
主动模式:
zabbix-agent
主动发送请求(询问server需要哪些数据)到zabbix-server
,由zabbix-server
发送一个需要数据的监控项列表,然后zabbix-server
端等待zabbix-agent
发送数据(zabbix-agent
会根据这些监控列表,区采集当前监控主机的数据),当采集完毕后统一发送给zabbix-server
。zabbix-agent
由被动变为主动,主动的询问,zabbix-server
需要什么数据,在进行发送。- 大量的
zabbix-agent
端存在的情况下,这种zabbix-agent
主动模式效率会很高,明显zabbix-agent
主动发数据,效率要高得多,很适合监控项非常多,以及机器数量规模较大的场景。减轻zabbix-server
端的cpu
和内存
压力,主要提升效率。理解:在上学时期课代表收作业,同学们主动的将作业送到课代表。(将zabbix-server
的所在服务器压力均摊给,每一台监控的zabbix-agent
)
注意: 在agent配置文件中,主动模式和被动模式可以同时存在设置。
6-1-1.主动模式设置
1.在agent配置文件中添加参数
Hostname='zabbix-agent的主机名称' # 因为server需要这个参数来识别是哪个主机的数据
ServerActive='zabbix-server的ip地址' # 开启主动模式的参数
2.查询是否修改
grep -iE 'hostname|serveractive' /etc/zabbix/zabbix_agentd.conf
3.重启agent端
systemctl restart zabbix-agent
4.在ui模式将监控项类型修改为agent主动模式 # 如果不修改,不会生效。
# 注意:
不涉及客户端的就无法修改为主动模式。
只有那些通过 Zabbix Agent(客户端)执行并采集数据的监控项,才能设置为主动模式(active checks)。
1.SNMP、IPMI、JMX、SSH 这类协议监控,都是由 Zabbix Server 或 Proxy 直接去轮询设备或服务,不依赖 Agent,没所谓主动/被动模式。
2.External checks(外部检查),执行在服务器端脚本,也不通过 Agent,没法设置成 Agent 主动模式。
3.Trapper items 是被动接收外部主动推送数据,Agent 不参与采集过程。
6-1-2.被动模式设置
# 默认情况下,是被动模式
1.在agent配置文件中添加参数
Server='zabbix-server的ip地址' # 开启被动模式的参数
2.查询是否修改
grep -i '^Server=.*[0-9]$' /etc/zabbix/zabbix_agentd.conf
3.重启agent端
systemctl restart zabbix-agent
4.在ui模式将监控项类型修改为agent被动模式 # 如果不修改,不会生效。
6-2.Zabbix的自动发现
文档: https://www.zabbix.com/documentation/4.0/zh/manual/discovery/network_discovery/rule
说明:
- 就是发现没有被关联起来的
zabbix-agent
机器,省去了手动进行关联的操作,通过网络方式自动发现并关联。- 被发现的机器必须安装
zabbix-agent
客户端。- 操作:
zabbix-server
端根据网段主动发现zabbix-agent
端,如果多个网段会效率慢。作用:
- 由于机器过多,不能可一个一个进行添加绑定模版,这样会影响效率。通过自动发现,发现主机并且添加主机,添加模版。
- 自动发现可以基于,ip地址、或者ip网段,来自于zabbix-agent的请求,基于SNMP客户端的请求。
可能出现的问题: 网络等待太久(网络不通),就会导致自动发现速度慢。
流程:
- 机器安装
zabbix-agent
,并且修改配置。- 在
zabbix-ui
界面设置自动发现规则。- 在
zbbix-ui
界面设置自动发现的动作(发现机器后,后续的动作【添加模版,加入那个机器组】)注意: 是由
zabbix-serve
端去网络环境中扫描,然后发现目标机器然后监控,此时的zabbix-agent
是被动等待的。
6-2-1.配置机器
1.关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
sed -i "s#SELINUX=enforcing#SELINUX=disabled# " /etc/sysconfig/selinux
2.时间同步
yum install ntp -y
ntpdate -u ntp.aliyun.com
3.下载源
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm
4.配置
vim /etc/zabbix/zabbix_agentd.conf
StartAgents=3
ListenIP=0.0.0.0
ListenPort=10050
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
DebugLevel=3
LogFileSize=0
Server=192.168.85.143
ServerActive=192.168.85.143
Hostname=test-04 # 一定要与主机的名称设置一致。hostnamectl set-hostname test-04
Include=/etc/zabbix/zabbix_agentd.d/*.conf
5.启动
systemctl start zabbix-agent
6-2-2.设置自动发现
流程:配置 -> 自动发现 -> 创建自动发现(输入名称,ip范围,和规则)
ip范围格式:# 也支持ipv6
192.168.1.33 # 单ip
192.168.1-10.1-255 # ip段
192.168.4.0/24 # 子网掩码
192.168.1.1-255, 192.168.2.1-100, 192.168.2.200, 192.168.4.0/24 # 多个ip网段
检查规则:
zabbix客户端"system.uname" # 可以确定客户端是否安装了agent端,安装会执行system.uname的键值,获取值。确保安装了anget
ICMP ping # 确定zabbix-server是否可以ping到agent。保证能连接
设备唯一性:# 保证在发现时机器是唯一的,防止重复。
IP地址 # 选中,因为 ip是唯一的,不会重复。
Zabbix 客户端 "system.uname
6-2-3.查看自动发现是否生效
流程:
监控 -> 自动发现(查看自动发现的状态)
6-2-4.设置自动发现动作
# 当发现了客户端agent,会执行的动作(链接模版,添加到某个用户组中或者其他的操作)
流程:配置->动作->事件源:自动发现 -> 创建新动作
条件:# A and B and C 也就必须满足下面的3个条件,才会触发操作
1. 自动发现状态 等于 上 # 状态为“上(Up在线)” 状态为“下(Down不在线)”
2.服务器类型等于zabbix客户端 # 客户端安装agent
3.接收到的值 包含 linux # 也就是上面设置key system.uname 中需要包含Linux字符在内(注意大小写。)
system.uname key 查询的结果对应的名称 uname -a:
Linux test-04 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
执行操作:
1.添加主机:自动发现->触发动作->添加到主机中
2.添加到主机组:自动发现->触发动作->添加到主机组中
3.关联模版 os linux(已修改为了主动模式):自动发现->触发动作->关联 os linux 模版
6-2-5.查看自动发现的主机
# 注意:
存在延迟,发现机器不会立马添加到主机中,可能会等一会。
6-3.Zabbix的自动注册
**文档:**https://www.zabbix.com/documentation/4.0/zh/manual/discovery/auto_registration
说明:
- 是一种让被监控主机主动向
zabbix-server
报备并自动完成添加、配置的机制,适合大规模环境中自动化管理主机。- 主机(安装了
zabbix-agent
)启动时,会主动向zabbix-server
发送注册请求。zabbix-server
根据预设的自动注册动作
(Auto registration actions)对这些请求进行处理。- 服务器可以自动添加主机到监控、分配主机群组、关联模板,甚至执行自定义操作脚本。
工作流程:
Agent
配置中ServerActive
指向zabbix-server
,Agent 启动时会主动注册。- 服务器(
zabbix-server
)根据自动注册规则(动作)中的条件判断是否接受。- 满足条件的请求会被自动添加为新主机,配置模板和主机群组等。
流程:
- 修改
zabbix-agent
的配置文件。
- 必须设置:
Hostname
设置为唯一标识主机的名称。- 必须启用:
ServerActive
,设置为zabbix-server
地址。- 添加自动注册的动作即可。
- 设置触发条件(如主机名、IP等)。
- 设置执行操作:添加主机、关联模板、加入主机群组等。
注意:
- 是由
zabbix-agent
端主动去zaabix-server
注册,那么zabbix-agent
就是主动,zabbix-server
就是被动。- 使用自动注册,需要先关闭,自动发现的动作,可能会出现冲突(停止自动发现规则与自动发现的动作)。
6-3-1.修改agent配置
1.配置:
StartAgents=3
ListenIP=0.0.0.0
ListenPort=10050
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
DebugLevel=3
LogFileSize=0
Server=192.168.85.143
Hostname=test-04 # 字段也可以配置也可以不配置,如果不配置就会使用agent的系统主机名命名主机
ServerActive=192.168.85.143 # 配置必须有,
Include=/etc/zabbix/zabbix_agentd.d/*.conf
2.添加字段
添加主机元数据的两种方式,只需要一种即可:
HostMetadata
HostMetadataItem
1.HostMetadata
HostMetadata=Linux # 添加一个字符
2.HostMetadataItem
HostMetadataItem=system.uname # 添加键值对
3.重启
systemct restart zabbix-agent
# 注意,一定要添加配置字段:
Hostname:自动注册后,在ui界面显示的主机名称。
ServerActive:主动去zabbix-server机器进行注册。ServerActive设置的就是zabbix-server的ip
HostMetadata:设置的agent主机的元数据,在agent端去注册时设置的触发条件。
6-3-2.添加自动注册
# 自动注册,只需要添加动作即可。
流程:
设置 -> 动作 -> 选择自动注册 -> 创建动作
# 在填写时设置条件
主机源数据包含Linux,对应的就是在配置文件中设置 HostMetadataItem 与 HostMetadata的值
6-3-3.查看自动注册主机
注册速度很快,但是有时候ip无法正常显示。
6-4.自动发现与自动注册区别
自动发现:
zabbix-server主动去网络环境中扫描,然后发现目标机器然后监控,此时的agent是被动等待的。
那如果需要扫描多种网段,且机器数量很大的话,你的zabbix-server服务器可就很难受了速度慢,压力大,效率低。
自动注册:
与agent自动模式性质一样,由agent主动发起,而server端只需要等待agent端发起即可。
极大的降低了zabbix-server的服务器压力,将压力分散到agent端上。
7.Zabbix分布式Proxy
文档地址: https://www.zabbix.com/documentation/4.0/zh/manual/distributed_monitoring/proxies
是什么:
- 临时存储数据,且转发,给
zabbix-server
,也就是采集的监控数据,中转站。zabbix-agent > zabbix-proxy > zabbix-server
。zabbix proxy
可以代替zabbix server
收集性能和可用性数据,然后把数据汇报给zabbix server
,并且在一定程度上分担了zabbix server
的压力。使用场景:
- 监控远程区域设备。
- 监控本地网络不稳定区域。
- 当 zabbix 监控上千设备时,使用它来减轻 server 的压力。
- 简化分布式监控的维护。
流程:
- 安装
zabbix-proxy
端进行配置。- 对
zabbix-agent
进行修改配置,将服务地址修改为zabbix-proxy
地址。- 在UI界面设置proxy代理。
- 在UI界面设置自动注册,将
proxy
端关联的agent
进行注册到server
端。
复杂的架构模式:
7-1.下载安装zabbix-proxy端并配置
# 操作与server端相同,都需要数据库。
# 安装下载流程与server一样,因为proxy是一个中转站的作用,所以需要数据库
1.安装yum源,修改源
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
sed -i 's#repo.zabbix.com#mirrors.tuna.tsinghua.edu.cn/zabbix#g' /etc/yum.repos.d/zabbix.repo
2.安装zabbix-proxy 与 mysql
yum install zabbix-proxy-mysql mariadb-server -y # zabbix-proxy-mysql mysql版
3.初始化安装数据库
systemctl start mariadb # 启动数据库
mysqladmin password 123456789 # 设置数据库密码
msyql -uroot -p123456789 # 登录测试
4.创建数据库与授权的账户
mysql -uroot -p123456789 -e "create database zabbix_proxy character set utf8 collate utf8_bin;"
mysql -uroot -p123456789 -e "grant all privileges on zabbix_proxy.* to zabbix_proxy@localhost identified by 'zabbix_proxy';"
mysql -uroot -p123456789 -e "flush privileges;"
5.将数据导入到创建的mysql数据库中
# 注意自己安装的版本,zabbix-proxy-mysql-4.0.50 文件名是不同的
zcat /usr/share/doc/zabbix-proxy-mysql-4.0.50/schema.sql.gz| mysql -uzabbix_proxy -pzabbix_proxy zabbix_proxy
mysql -uroot -p123456789 -e "show tables from zabbix_proxy;" # 查看数据库
6.修改配置文件
配置文档:https://www.zabbix.com/documentation/4.0/zh/manual/appendix/config/zabbix_proxy
# 设置为主动,将数据给到server端
vim /etc/zabbix/zabbix_proxy.conf
ProxyMode=0
Server=192.168.85.143
ServerPort=10051
Hostname=zabbix-proxy
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
DBHost=localhost
DBName=zabbix_proxy
DBUser=zabbix_proxy
DBPassword=zabbix_proxy
ConfigFrequency=60
DataSenderFrequency=5
7.启动服务
systemctl start zabbix-proxy
7-2.zabbix-proxy配置说明
# 基础
ProxyMode=0 # 代理模式,0 主动, 1 被动
Server=192.168.85.143 # 填入zabbix-server地址
ServerPort=10051 # 填入zabbix-server端口
Hostname=zabbix-proxy # 填入主机名
# 日志相关
LogType=file # 日志写入类型,默认file(写到文件),system(写入syslog),console(控制台输出)。
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
DebugLevel=3 # 日志等级
# 运行相关配置
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix # Zabbix proxy 用于 Unix 域套接字通信的目录,主要用于进程间通信(IPC),比如 Zabbix proxy 与其 agent、外部模块、或者进程之间通信时创建的 socket 文件存放位置。
Timeout=5 # SNMP设备或外部检查的超时时长(单位为秒),网络不稳定或脚本执行慢的环境中,适当增大能提升稳定性。
AllowRoot=0 # 是否允许以 root 运行 proxy。默认关闭,建议保持默认,除非特殊环境,为了降低权限使用普通用户。
# 数据库配置
DBHost=localhost
DBName=zabbix_proxy
DBUser=zabbix_proxy
DBPassword=zabbix_proxy
# 设置同步配置
ConfigFrequency=60 # proxy多久和server同步配置信息,默认600秒
DataSenderFrequency=5 # proxy多久发送一次自己的数据给server
# 性能优化
StartPollers=10 # 询进程的初始实例数量(同时运行的 poller 数量)用于主动轮询被监控主机。默认为5最大1000
StartPollersUnreachable=3 # 包括IPMI 和 Java的轮询进程的初始实例数量(检测 unreachable 主机的 poller 数量,适当提高更容易及时发现主机状态恢复。)。默认1最大1000
StartPingers=3 # CMP pingers进程的初始实例数量,默认1最大1000。如果监控 ICMP 类型较多增加此值。
StartTrappers=10 #rapper进程的初始实例数量, Proxy 接收来自 agent 端主动发送数据的线程数。默认为5最大1000
CacheSize=64M # 内存缓存大小。用于存放 item 配置等信息(用于存储主机、监控项数据的共享内存大小。)。默认8M最大8G
HistoryCacheSize=128M # 历史缓存大小(存储历史数据缓存的内存。)。默认16M最大2G
HistoryIndexCacheSize=32M # 历史数据索引缓存。与 HistoryCacheSize 配合使用以提升性能。默认4M最大2G
7-3.zabbix-agent配置修改
# 修改
1.将zabbix-server地址修改为zabbix-proxy地址
2.修改agent为主动模式,主动给proxy发消息,然后proxy再发给server # 配置为主动模式
3.主机元数据 HostMetadata=Linux
# agent配置
StartAgents=3
ListenIP=0.0.0.0
ListenPort=10050
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
DebugLevel=3
LogFileSize=0
Server=192.168.85.146 # 修改为proxy的地址
ServerActive=192.168.85.146 # 修改为proxy地址
HostMetadata=Linux # 需要使用到 自动注册功能,需要这个值设置触发条件
Hostname=test-03 # 需要根据主机名进行修改
Include=/etc/zabbix/zabbix_agentd.d/*.conf
# 重启agent
systemctl restart zabbix-agnet
7-4.在UI界面设置代理
流程:
管理 -> agent代理程序 -> 创建代理
注意问题:
1.代理的名称不能乱修改,应为在zabbix-proxy中设置的Hostname名称
2.被动式还是主动式,需要根据配置文件的proxymode值进行设置
3.代理的ip地址不能出现问题,不然无法链接(proxy端无法给server端数据)
7-5.在UI界面设置自动注册
流程:
配置 -> 动作 -> 事件源(自动注册)-> 创建
注意:
条件不能设置错误,需要根据元数据进行配置。
7-6.查看主机注册情况
注意:
当自动注册的机器ip是:0.0.0.0 会导致无法使用,需要手动干预或者脚本处理。
8.补充内容
8-1.zabbix-server进程负载超过了75%
# Zabbix discoverer processes more than 75% busy
原因:
这个信息通常意味着Zabbix的发现进程负载超过了75%。在Zabbix中,发现进程用于自动发现网络设备、主机和服务。当发现进程的负载过高时,可能会导致性能下降或延迟
解决方式:
1.优化发现规则:检查你的发现规则,确保它们不会频繁地运行或者执行复杂的操作。优化规则的设置,减少发现的频率或者范围,可以降低发现进程的负载。
2.增加资源:如果可能的话,增加Zabbix服务器的硬件资源,特别是CPU和内存,可以帮助处理更多的发现任务。
3.分布式部署:考虑使用Zabbix的分布式部署方式,将发现任务分散到多个Zabbix服务器上,以减轻单一服务器的压力。
升级版本:有时候问题可能是由于Zabbix版本的bug引起的,尝试升级到最新的稳定版本来解决可能的问题。
4.此外,你也可以通过监控Zabbix服务器的性能指标,比如CPU利用率、内存使用情况等,来找出哪些方面导致了发现进程的负载过高,并据此制定相应的解决方案。
修改配置文件:
# 添加两个参数
StartDiscoverers=50 # 现进程的初始实例数量。在Zabbix 1.8.5版本之前,最大能设置为255。增加zabbixserver进程数量
UnavailableDelay=360 # 资源不可用期间,Zabbix多少秒检查一次资源是否可用,回收资源