Zabbix 介绍和架构

为什么需要监控

运维行业有句话:“无监控、不运维”,监控俗称“第三只眼”。没了监控,基础运维,业务运维都是“瞎子”。所以说监控是运维这个职业的根本。

尤其当前 DevOps 大行其道,用监控数据给自己撑腰,这显得更加必要,有人说运维是背锅侠,那么有了监控,就有了充足的数据,一切以数据说话

所以作为一个运维工程师,如何构建一套监控系统是你的第一件工作。

监控功能

  • 在需要的时刻,提前预警即将出问题,避免故障发生
  • 实时监控系统和业务,当出问题之后,通过发出告警,提醒相关人员,快速可以找到问题的根源,从而及时处理问题
  • 可以实现网站,应用或者服务器的故障自愈,保证高可用性
  • 以图形或易观察的方式呈现当前以及过往的状态,便于分析和预测系统发展趋势

需要监控什么

监控一切需要监控的资源,包括:服务器,网络设备,业务应用,云服务等

1

分类 实例内容
硬件监控 通过远程控制卡: DeLL的iDRAC,HP的ILO和IBM的IMM等
使用IPMI来完成物理设备的监控工作。通常必须要监控包括温度、硬盘故障等路由器,交换机(端口,光衰,日志),打印机等
系统监控 cpu,内存,硬盘使用率,硬盘IO,系统负载,进程数
服务监控 nginx,apache, php-fpm,mysql.memcache,redis ,tomcat,JVM,TCP连接数
性能监控 网站性能,服务器性能,数据库性能,存储性能
日志监控 系统会产生系统日志,应用程序会有应用的访问日志、错误日志,服务有运行日志等,可以使用ELK来进行日志监控
安全监控 用户登录数,passwd文件变化,本地所有文件改动
Nginx+Lua编写一个WAF通过kibana可以图形化的展示不同的攻击类型的统计。
网络监控 IP,端口,URL,DB,ping包,IDC带宽网络流量,网络流出流出速率,网络入流量,网络出流量,网络使用率,SMTP.POP3

监控工具

开源工具: cacti、nagios、zabbix、Prometheus、open-falcon 等,还有一些商业的监控方案

2

Cacti

3

Cacti是基于LAMP平台展现的网络流量监测及分析工具

通过SNMP技术或自定义脚本从目标设备/主机获取监控指标信息

其次还可以进行数据存储,调用模板将数据存到数据库,使用rrdtool存储和更新数据,通过rrdtoo1绘制结果图形

最后进行数据展现,通过web方式将监控结果呈现出来,常用于在数据中心监控网络设备,比如交换机和路由器

cacti是很老的一款监控工具,其实说它是一款流量监控工具更合适,对流量监控比较精准,但缺点很多,出图不好看,不支持分布式,也没有告警功能,所以当前使用的用户越来越少。

缺点:告警不及时

官网: https://www.cacti.net

github: https://github.com/Cacti/cacti

二次开发版: https://cactifans.org/

Nagios

4

5

Nagios是一款开源的免费监控工具,可以有效地监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知。

nagios主要的特征是监控告警,最强大的就是告警功能,可支持多种告警方式,但缺点是没有强大的数据收集机制,并且数据出图也很简陋,当监控的主机越来越多时,添加主机也非常麻烦,配置文件都是基于文本配置的,不支持web方式管理和配置,这样很容易出错,不易维护。

分层告警机制及自定义监控相对薄弱。

监控主机数量有限,承载能力较低

官网: https://www.nagios.org/

猎鹰 Open-falcon

6

open-falcon(猎鹰)是一款用golang和python写的监控系统,由小米公司启动了这个项目

相对zabbix在性能、扩展性、和用户的使用效率方面,都有较大优势

发布时间较短不支持很多基础的服务监控插件,如lTomcat、 apache等

功能不完善,更新较缓慢

无专门运维支撑,社区运营有欠缺。

官网: http://www.open-falcon.org/

github: https://github.com/open-falcon

夜莺 Nightingale

7

夜莺(Nightingale)是滴滴基础平台联合滴滴云研发和开源的企业级监控解决方案。旨在满足云原生时代企业级的监控需求。

Nightingale 在Open-Falcon 的基础上,结合滴滴的最佳实践,在性能、可维护性、易用性方面做了大量的改进

Nightingale 在产品完成度、系统高可用、以及用户体验方面,达到了企业级的要求,可满足不同规模用户的场景,小到几台机器,大到数十万都可以完美支撑。兼顾云原生和裸金属,支持应用监控和系统监控,插件机制灵活,插件丰富完善,具有高度的灵活性和可扩展性。

Nightingale 作为集团统一的监控解决方案,支撑了滴滴内部数十亿监控指标,覆盖了从系统、容器、到应用等各层面的监控需求,周活跃用户数千。五年磨一剑,取之开源,回馈开源。

夜莺监控的核心开发团队,也是Open-Falcon项目原核心研发人员。

当前社区比较活跃,升级较频繁

官网:

1
2
https://n9e.github.io/
http://n9e.didiyun.com/

8

Zabbix

9

zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。功能强大,成熟可靠,使用者众多

官网: https://www.zabbix.com/

Prometheus

10

Prometheus 是一个开源的服务监控系统和时间序列数据库,主要在监控容器领域使用,可以实现容器的动态发现和监控

官网: https://prometheus.io/

商业监控方案

商业监控的方案,可以实现从外部网络,如全国的不同运营商的网络访问指定服务,贴近实际用户的访问感受,了解实现的访问情况.

1
2
3
4
http://ping.chinaz.com/       站长之家
https://www.jiankongbao.com/ 监控宝
https://www.toushibao.com/ 透视宝
https://www.tingyun.com/ 听云

11

1
2
#监控宝
https://www.jiankongbao.com/pic1.html

12

云监控

云监控为云上用户提供开箱即用的企业级开放型一站式监控解决方案。云监控涵盖IT设施基础监控和外网网络质量拨测监控,是基于事件、自定义指标和日志的业务监控,为您全方位提供更高效、全面、省钱的监控服务。使用云监控,不但可以帮助您提升系统服务可用时长,还可以降低企业IT运维监控成本。

云监控通过提供跨云服务和跨地域的应用分组管理模型和报警模板,帮助您快速构建支持几十种云服务、管理数万实例的高效监控报警管理体系。

云监控用于监控各云服务资源的监控指标,探测云服务ECS和运营商站点的可用性,并针对指定监控指标设置报警。使您全面了解阿里云上资源的使用情况和业务运行状况,并及时对故障资源进行处理,保证业务正常运行。

1
2
https://help.aliyun.com/document_detail/35170.html
https://cloud.tencent.com/document/product/248/13466

13

14

Zabbix 概述和架构

Zabbix 介绍

15

zabbix官网: https://www.zabbix.com

Zabbix 是一个企业级分布式开源监控解决方案,支持实时监控数干台服务器,虚拟机和网络设备,采集百万级监控指标,适用于任何IT基础架构、服务、应用程序和资源的解决方案

Zabbix SIA 公司成立于2005年,由CEO兼所有者Alexei Vladishev 创建,Zabbix 目前由此公司积极的持续开发更新维护,并为用户提供技术支持服务。

16

17

Zabbix 软件能够监控众多网络参数和服务器的健康度、完整性。Zabbix 使用灵活的告警机制,允许用户为几乎任何事件配置基于邮件的告警。这样用户可以快速响应服务器问题。Zabbix 基于存储的数据提供出色的报表和数据可视化功能。这些功能使得 Zabbix 成为容量规划的理想选择。

Zabbix 支持主动轮询(polling)和被动捕获(trapping)。Zabbix所有的报表、统计数据和配置参数都可以通过基于 Web 的前端页面进行访问。基于 Web 的前端页面确保您可以在任何地方访问您监控的网络状态和服务器健康状况。适当的配置后,Zabbix 可以在监控 IT 基础设施方面发挥重要作用。无论是对于有少量服务器的小型组织,还是拥有大量服务器的大企业而言,同样适用。

Zabbix 是根据 GPL 通用公共许可证的第二版编写和发布的。这意味着产品源代码是免费发布的,可供公共使用。

Zabbix公司还为全球用户提供专业的技术支持服务。

Zabbix 功能

18

Zabbix 是一个高度成熟完善的网络监控解决方案,包含了多种功能。

19

官方链接:

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/introduction/features
https://www.zabbix.com/documentation/7.0/zh/manual/introduction/features

数据收集

  • 可用性和性能检查
  • 支持 SNMP(trapping 和 polling)、IPMI、JMX、VMware监控
  • 自定义检查
  • 以自定义间隔收集所需数据
  • 由 server/proxy 和 agents 执行

灵活的阈值定义

  • 可以定义非常灵活的问题阈值,称为触发器,从后端数据库引用值

高度可配置的告警

  • 可以针对升级计划、收件人、媒体类型自定义发送通知
  • 使用宏可以使通知变得有意义和友好
  • 自动化操作包括执行远程命令

实时图形

  • 采集到的监控项值可以使用内置的绘图功能立即图形化

网络监控功能

  • Zabbix 可以跟踪网站上的模拟鼠标点击的路径并检查功能和响应时间

丰富的可视化选项

  • 创建自定义图形的能力,可以将多个监控项组合成一个聚合图形
  • 网络拓扑图
  • 在仪表盘中显示幻灯片
  • 报表
  • 被监控资源的高级(业务)视图

历史数据存储

  • 存储在数据库中的数据
  • 可配置的历史数据(保留趋势)
  • 内置管家程序

轻松配置

  • 将受监控的设备添加为主机
  • 一旦主机添加到被数据库,就会开始进行数据采集
  • 将模板应用于受监控的设备

模板的使用

  • 在模板中分组检查
  • 模板可以继承其他模板

网络发现

  • 网络设备自动发现
  • agent 自动注册
  • 发现文件系统、网络接口和 SNMP OID

便捷的 web 界面

  • 基于web的PHP前端
  • 可从任何地方访问
  • 可以通过你的方式点击(到任何页面)
  • 审计日志

Zabbix API

  • Zabbix API 为 Zabbix 提供可编程接口,用于批量操作、第三方软件集成和其他用途。

权限系统

  • 安全用户认证
  • 某些用户可以被限制仅访问某些视图

功能齐全且易于扩展的 agent

  • 部署在被监控目标上
  • Linux 和 Windows 操作系统都适用于

二进制守护进程

  • 用 C 编写,用于提高性能和减少内存占用
  • 轻量级、便携

为复杂环境做好准备

  • 使用 Zabbix proxy 轻松实现远程监控

Zabbix 架构

Zabbix 由如下主要的功能组件组成

20
21

  • SERVER

    Zabbix server 是 Zabbix 软件的核心组件

    Zabbix Agent 向其报告可用性、系统完整性信息和统计信息。

    Zabbix server也是存储所有配置信息、统计信息和操作信息的核心存储库。

    Zabbix server也是Zabbix监控系统的告警中心。在监控的系统中出现任何异常,将发出通知给管理员。

    基本的 Zabbix Server 的功能分解成为三个不同的组件。他们是:Zabbix server、Web前端和数据库。

    Zabbix 的所有配置信息都存储在 Server和Web前端进行交互的数据库中。例如,当你通过Web前端(或者API)新增一个监控项时,它会被添加到数据库的监控项表里。然后,Zabbix server 以每分钟一次的频率查询监控项表中的有效项,接着将它存储在 Zabbix server 中的缓存里。这就是为什么 Zabbix前端所做的任何更改需要花费两分钟左右才能显示在最新的数据段的原因。

  • 数据库

    所有配置信息以及 Zabbix 采集到的数据都被持久存储在数据库中

    可以支持MySQL,PostgreSQL,Oracle 等多种数据库

  • WEB 界面

    WEB 界面是 Zabbix server 的一部分,用于实现展示和配置的界面

    通常(但不一定)和 Zabbix server 运行在同一台物理机器上

    基于 Apache(Nginx)+PHP 实现,早期只支持LAMP架构,从Zabbix5.0开始支持LNMP

  • AGENT

    Zabbix agents 部署在被监控目标上,用于主动监控本地资源和应用程序,并将收集的数据发送给Zabbix server。从Zabbix5.0开始支技Zabbix Agent2 PROXY Zabbix

  • Proxy

    可以代替 Zabbix Server 采集性能和可用性数据

    Zabbix Proxy 在 Zabbix 的部署是可选部分

    Zabbix Proxy 的部署可以很好的分担单个Zabbix server的负载

  • Java 网关

    Zabbix 要监控 tomcat 服务器和其它JAVA程序,需要使用 Java gateway 做为代理,才能从JAVA程序中获取数据

  • 内部配置的数据流程

    Zabbix 内部的数据流对Zabbix的使用也很重要。首先,为了创建一个采集数据的监控项,就必须先创建主机。其次,在任务的另外一端,必须要有监控项才能创建触发器(trigger),必须要有触发器来创建动作(action)。因此,如果您想要收到类似“X个server上CPU负载过高”这样的告警,您必须首先为 Server X 创建一个主机条目,其次创建一个用于监控其 CPU的监控项,最后创建一个触发器,用来触发 CPU负载过高这个动作,并将其发送到您的邮箱里。虽然这些步骤看起来很繁琐,但是使用模板的话,实际操作非常简单。也正是由于这种设计,使得 Zabbix 的配置变得更加灵活易用。

Zabbix Server 启动进程

22
23

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
zabbix server 进程说明

Zabbix服务器端进程有多达二十多种
当在操作系统下用ps aux命令来查看时,往往看到很多zabbix系统进程,而这些系统进程在zabbix内部称
为实例。这些实例各处负责不同的工作,就形成了不同种类型的进程),各种类型进程的说明如下:

报警器(alerter)——该类型的进程是用来发送报警通知的

配置同步器(configuration syncer)——用于将配置文件中的配置信息同步到内存中缓存

数据发送器(data sender)——服务器代理节点用于发送数据的进程(服务器端没有这类进程)

数据库看门狗(db watchdog)——该进程用于监视zabbix系统的数据库状态,当数据库状态变为不可用时,发送警告信息(服务器代理端不支持这类型进程)。

自动发现器(discoverer)——用于自动发现设备的进程

步骤(escalator)——用于处理动作中的步骤的进程

心跳发送器(heartbeat sender)——服务器代理端用于发送心跳信息(服务器端没有这类型的进程)

历史数据同步器(history syncer)——用于写历史数据表

管家(housekeeper)——用于清理过期的历史数据的进程

HTTP 轮询器(http poller)——用于轮询web类的监控项目

Ping检查器(icmp pinger)——用于定期的进行ICMP PING检查

ipmi 轮询器(ipmi poller)——用于定期进行ipmi监控项目的检查

java 轮询器(java poller)——用于轮询java 监控项目

分布式节点看守器(node watcher)——用于在不同的分布式节点发送历史数据和配置信息更新的进程

轮询器(poller)——用于普通的被动监控项目的轮询

服务器代理轮询(proxy poller)——用于服务器代理的被动轮询

自我监控(self-monitoring)——用于收集Zabbix系统内部的监控信息

定时器(timer)——用于处理触发器中也时间相关的函数和维护模式的进程

陷入器(trapper)——用于处理主动采集、陷入以及分布式节点间或服务器代理的通信

不可到达轮询器(unreachable poller)——用于轮询不可到达到的设备

vmware 收集器(vmware collector)——负责从vmware服务进程中收集数据(服务器代理端不支持这种类型的进程);

可用的mode参数包括:
avg——指定类型所有进程的平均值
count——返回创建的指定类型进程的数量
max——最大值
min——最小值
——进程号,含义参见“描述”中所述的;
可用的state参数包括:
繁忙(busy)——表示处于繁忙状态的进程;
空闲(idle)——表示处于空闲状态的进程;

Zabbix 术语

24

被监控:即 Zabbix 监控的主机或设备

监控项item:即 Zabbix 监控的相关指标,比如:CPU利用率,内存使用率,TCP连接数等

应用集Application:为方便管理众多的监控项,可将多个同类型的监控项进行归类,纳入一个集合中,即应用集

触发器Trigger:是一个表达式,或者说一个条件,如磁盘利用率超过80%等,当触发条件后,会导致一个触发事件,这个事件会执行一个或多个动作

动作Action:动作是触发器的条件被触发后的行为,可以是发送一条短信,微信或邮件,或是重启某个服务

告警:当触发器和动作二者结合起来时,就构成了的告警机制,比如cpu的使用率达到80%以上,触发了报警动作,系统将自动发送一封邮件到指定的邮箱。然后运维可以及时的去处理此错误。

Web 监测:对WEB服务进行检测,比如:访问指定网站是否可正常访问

模板 Template: 可以方便地应用于多个主机的一组实体的集合。而这些实体包括:

  • items(监控项)
  • applications(应用集)
  • triggers(触发器)
  • graphs(图形)
  • screens (聚合图形,自Zabbix 2.0起)
  • low-level discovery rules (自动发现规则,自Zabbix 2.0起)
  • web scenarios (web场景,自Zabbix 2.0起)。

由于现实中的许多主机是相同或类似的,所以,为一个主机创建的一组实体(项目,触发器,图形,…)可能对许多人有用。虽然可以将它们复制到每个新的主机上,但过程很繁琐。可以将需要的实体都复制到一个模板,然后根据需要将模板应用于尽可能多的主机。

当模板链接到主机时,模板的所有实体(项目,触发器,图形,…)都将添加到主机。

模板通常用于为特定服务或应用程序(如Apache,MySQL,PostgreSQL,Postfix …)分组实体,然后应用于运行这些服务的主机。

使用模板的另一个好处是当所有主机都需要更改时。只需要在模板上更改某些内容将会将更改应用到所有链接的主机。

创建新模板时,链接的模板选项卡允许将一个或多个“嵌套”模板链接到此模板。所有实体(项目,触发器,图表等)将从链接的模板继承。

因此,使用模板是减少工作量并简化Zabbix配置的好方法。

模板分为内置模板和自定义模板

内置模板参看: https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates

Zabbix 各种组件的关系

25

Zabbix 部署

Zabbix 部署环境准备

Zabbix 版本选择

Zabbix 历史版本

1
https://en.wikipedia.org/wiki/Zabbix

26

Zabbix 产品周期

1
https://www.zabbix.com/cn/life_cycle_and_release_policy

Zabbix 分为两种版本: LTS和标准版本

27

28

Zabbix LTS

LTS代表“长期支持版本”。Zabbix LTS版本每一年半发布一次,且为Zabbix客户提供五年的支持服务

  • 3年全面支持-支持修复基础的、紧急的以及安全性上的问题
  • 2年最低限度支持-仅限支持修复紧急的和安全性上的问题

Zabbix LTS(长期支持)版本没有任何额外的或隐藏的消费成本。Zabbix是一个100%开源软件,每个人都可以下载使用。

Zabbix LTS 特点:

  • 支持期限更长,例如:为潜在的安全问题及bug迭代更新
  • 令人期待的高质量更新以及全新的功能点
  • 快速更新,可适用于多变的复杂环境
  • 在版本升级方面,更容易规划管理

29

Zabbix 部署架构

30

Zabbix 安装要求

安装官方要求

1
2
3
https://www.zabbix.com/documentation/6.0/zh/manual/installation/requirements
https://www.zabbix.com/documentation/5.0/zh/manual/installation/requirements
https://www.zabbix.com/documentation/4.0/zh/manual/installation/requirements

31

32

安装 Zabbix Server

Zabbix Server 安装方法介绍

Zabbix Server 提供了三种安装方法

  • 二进制包安装: 官方提供了二进制包安装的方法,可以支持CentOS和Debian/Ubuntu的安装
  • 源码编译安装: 部署繁琐,生产环境定制安装可以使用
  • 基于容器安装: 测试环境使用,参考链接如下
1
2
3
https://www.zabbix.com/documentation/6.0/zh/manual/installation/containers
https://www.zabbix.com/documentation/5.0/zh/manual/installation/containers
https://www.zabbix.com/documentation/4.0/zh/manual/installation/containers

二进制包安装 Zabbix Server

官方提供对多种OS版本的Zabbix 安装

可以从 ZABBIX 官方的软件仓库或镜像网站安装Zabbix SIA 提供了官方的 RPM 和 DEB 发行包

注意:Ubuntu22.04 不支持 Zabbix Server 5.0,只支持 Zabbix Server 6.0以上版本

二进制包安装Zabbix官方参考文档:

1
2
3
4
5
6
7
8
9
10
#Zabbix6.0
https://www.zabbix.com/documentation/6.0/zh/manual/installation/install_from_packages/
#Zabbix5.0
https://www.zabbix.com/documentation/5.0/zh/manual/installation/install_from_packages
https://www.zabbix.com/documentation/5.0/zh/manual/installation/install_from_packages/rhel_centos
https://www.zabbix.com/documentation/5.0/zh/manual/installation/install_from_packages/debian_ubuntu
#Zabbix4.0
https://www.zabbix.com/documentation/4.0/zh/manual/installation/install_from_packages
https://www.zabbix.com/documentation/4.0/zh/manual/installation/install_from_packages/rhel_centos
https://www.zabbix.com/documentation/4.0/manual/installation/install_from_packages/debian_ubuntu

官方和镜像仓库

1
2
3
4
5
#官方包仓库: 
https://repo.zabbix.com/
#镜像源
https://mirrors.aliyun.com/zabbix/
https://mirrors.tuna.tsinghua.edu.cn/zabbix/

33

Zabbix 相关二进制包介绍

1
2
3
4
5
6
zabbix-server-mysql    #Zabbix Server服务器包
zabbix-frontend-php #Zabbix 前端Web服务包,本质为LAP
abbix-apache-conf #Zabbix 前端Web服务配置包,本质为LAP
zabbix-agent #Zabbix 客户端包
zabbix-agent2 #Zabbix 客户端包
zabbix-get #Zabbix 服务测试包

安装 Zabbix Server 包

访问链接: https://www.zabbix.com/download 找到仓库的源

1
2
3
4
5
6
7
8
#CentOS8安装Zabbix5.0
https://www.zabbix.com/download?zabbix=5.0&os_distribution=centos&os_version=8&db=mysql&ws=apache
#Ubuntu18.04安装Zabbix5.0
https://www.zabbix.com/download?zabbix=5.0&os_distribution=ubuntu&os_version=18.04_bionic&db=mysql&ws=apache
#CentOS8安装Zabbix4.0
https://www.zabbix.com/download?zabbix=4.0&os_distribution=centos&os_version=8&db=mysql&ws=apache
#Ubuntu18.04安装Zabbix4.0
https://www.zabbix.com/download?zabbix=4.0&os_distribution=ubuntu&os_version=18.04_bionic&db=mysql&ws=apache

34

35

范例: 在ubuntu18.04 安装 Zabbix Server 5.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#官网下载
[root@zabbix-server ~]# wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+bionic_all.deb

#镜像下载
[root@zabbix-server ~]# wget https://mirrors.aliyun.com/zabbix/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+bionic_all.deb

[root@zabbix-server ~]# dpkg -L zabbix-release
/.
/etc
/etc/apt
/etc/apt/sources.list.d
/etc/apt/sources.list.d/zabbix.list
/etc/apt/trusted.gpg.d
/etc/apt/trusted.gpg.d/zabbix-official-repo.gpg
/usr
/usr/share
/usr/share/doc
/usr/share/doc/zabbix-release
/usr/share/doc/zabbix-release/README.Debian
/usr/share/doc/zabbix-release/changelog.Debian
/usr/share/doc/zabbix-release/copyright

[root@zabbix-server ~]# cat /etc/apt/sources.list.d/zabbix.list
deb http://repo.zabbix.com/zabbix/5.0/ubuntu bionic main
deb-src http://repo.zabbix.com/zabbix/5.0/ubuntu bionic main

#镜像加速
[root@zabbix-server ~]# sed -i.bak 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/apt/sources.list.d/zabbix.list
[root@zabbix-server ~]# cat /etc/apt/sources.list.d/zabbix.list
deb https://mirrors.aliyun.com/zabbix/zabbix/5.0/ubuntu bionic main
deb-src https://mirrors.aliyun.com/zabbix/zabbix/5.0/ubuntu bionic main

[root@zabbix-server ~]# apt update

#安装包
[root@zabbix-server ~]# apt -y install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent zabbix-get

#安装MySQL
[root@zabbix-server ~]# apt install mysql-server -y

#如果MySQL和ZabbixServer在同一台主机,此项可不改
[root@zabbix-server ~]# vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0

[root@zabbix-server ~]# systemctl restart mysql.service

#准备数据库和用户
[root@zabbix-server ~]# mysql -uroot
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by '123456';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;

#初绐化数据库的表
[root@zabbix-server ~]# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p123456 zabbix

#修改Zabbix Server 连接MySQL
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
DBPassword=123456

#修改PHP配置
[root@zabbix-server ~]# vim /etc/zabbix/apache.conf
php_value date.timezone Asia/Shanghai

[root@zabbix-server ~]# systemctl restart zabbix-server zabbix-agent apache2
[root@zabbix-server ~]# systemctl is-active zabbix-server zabbix-agent apache2
active
active
active

[root@zabbix-server ~]# systemctl enable zabbix-server zabbix-agent apache2

#安装中文包
[root@zabbix-server ~]# apt -y install language-pack-zh-hans

#安装日文包
[root@zabbix-server ~]# apt install language-pack-ja
[root@zabbix-server ~]# systemctl restart apache2

#浏览器访问
http://server_ip_or_name/zabbix

范例:在 CentOS 8上实现安装Zabbix Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#Zabbix5.0
[root@zabbix-server ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm

#Zabbix4.0
[root@zabbix-server ~]# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/8/x86_64/zabbix-release-4.0-2.el8.noarch.rpm

#修改为阿里云源
[root@zabbix-server ~]# vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/8/x86_64/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

#或者sed修改
[root@zabbix-server ~]# sed -i.bak 's/repo.zabbix.com/mirrors.aliyun.com\/zabbix/' /etc/yum.repos.d/zabbix.repo
[root@zabbix-server ~]# dnf clean all
[root@zabbix-server ~]# dnf install zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get
[root@zabbix-server ~]# zabbix_server -V
zabbix_server (Zabbix) 5.0.14
Revision 892ce506db 16 July 2021, compilation time: Jul 16 2021 14:45:07

Copyright (C) 2021 Zabbix SIA
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it according to
the license. There is NO WARRANTY, to the extent permitted by law.

This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/).

Compiled with OpenSSL 1.1.1 11 Sep 2018
Running with OpenSSL 1.1.1 11 Sep 2018

准备数据库和数据表

准备数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@zabbix-server ~]# yum -y install mysql-server
[root@zabbix-server ~]# systemctl enable --now mysqld
[root@zabbix-server ~]# mysql -uroot -p
Enter password:
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by '123456';
mysql> grant all privileges on zabbix.* to zabbix@localhost;

#如果MySQL 和 Zabbix Server不在同一台主机
mysql> create user zabbix@'10.0.0.%' identified by '123456';
mysql> grant all privileges on zabbix.* to zabbix@'10.0.0.%';

#注意:如果使用MySQL8.0还需要执行下面
mysql>ALTER USER zabbix@'10.0.0.%' IDENTIFIED WITH mysql_native_password BY '123456';

#或者执行下面
[root@zabbix-server ~]# echo 'default-authentication-plugin=mysql_native_password' >> /etc/my.cnf.d/mysql-server.cnf
[root@zabbix-server ~]# systemctl enable --now mysqld
导入数据表
1
2
3
4
5
6
7
8
9
10
11
12
[root@zabbix-server ~]# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p123456 zabbix
[root@zabbix-server ~]# mysql -uzabbix -p123456 zabbix -e 'show tables;'
+----------------------------+
| Tables_in_zabbix |
+----------------------------+
| acknowledges |
| actions |
| alerts |
| application_discovery |
| application_prototype |
| application_template |
| applications |

修改 zabbix 的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf

[root@zabbix-server ~]# grep '^[^#]' /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBName=zabbix
DBUser=zabbix
DBPassword=123456
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000

修改 php 相关配置文件

修改正确的时区信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@zabbix-server ~]# vim /etc/php-fpm.d/zabbix.conf
[root@zabbix-server ~]# cat /etc/php-fpm.d/zabbix.conf
[zabbix]
user = apache
group = apache

listen = /run/php-fpm/zabbix.sock
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

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[date.timezone] = Asia/Shanghai #只需要修改此行

启动 Zabbix 相关服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@zabbix-server ~]# systemctl enable --now zabbix-server zabbix-agent httpd php-fpm
[root@zabbix-server ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10051 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 [::]:10050 [::]:*
LISTEN 0 128 [::]:10051 [::]:*
LISTEN 0 70 *:33060 *:*
LISTEN 0 128 *:3306 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*

#查看进程
[root@zabbix-server ~]# ps -ef |grep zabbix
abbix 767 1 0 15:32 ? 00:00:00 /usr/sbin/zabbix_server -c /apps/zabbix-server/etc/zabbix_server.conf
zabbix 2791 1 0 17:14 ? 00:00:00 zabbix_server -c /apps/zabbix-server/etc/zabbix_server.conf

访问 Zabbix 的 Web 管理页面完成配置向导

访问下面链接

1
http://server_ip_or_name/zabbix

36
37

输入数据库信息

38
39

上面所填写的内容保存在下面文件中

1
2
3
4
#如果是CentOS下面文件
/etc/zabbix/web/zabbix.conf.php
#如果是Ubuntu则下面文件
/usr/share/zabbix/conf/zabbix.conf.php 实质也是/etc/zabbix/web/zabbix.conf.php软链接

40

完成安装

41

Zabbix 前端已经就绪!第一次登录, 默认的用户名是 Admin,密码是zabbix

42

中文及乱码

默认为英文,可修改为中文

1
2
3
4
5
#CentOS安装中文包,再修改语言,否则无法选择
[root@zabbix-server ~]# yum -y install langpacks-zh_CN

#Ubuntu安装下面中文包
[root@zabbix-server ~]# apt -y install language-pack-zh-hans

43

因为字体兼容性的原因,在显示中文时可能会有乱码出现

注意:乱码和语言环境无关,英语环境也支持中文显示,但会有乱码

44

将中文字体上传到 Zabbix Server 的目录 /usr/share/zabbix/assets/fonts 下

1
2
#开源字体网站
http://fonts.top/

45

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@zabbix-server fonts]# pwd
/usr/share/zabbix/assets/fonts

#支持ttf和ttc后缀的字体文件
[root@zabbix-server fonts]# mv graphfont.ttf graphfont.ttf.bak
[root@zabbix-server fonts]# mv SIMYOU.TTF graphfont.ttf
[root@zabbix-server fonts]# ls
graphfont.ttf graphfont.ttf.bak

#注意:字体文件路径和名称的定义在文件/usr/share/zabbix/include/defines.inc.php中配置
#可以修改下面FONT_NAME指定新字体件,注意不需加文件后缀
[root@zabbix-server ~]# grep FONT_NAME /usr/share/zabbix/include/defines.inc.php
define('ZBX_GRAPH_FONT_NAME', 'graphfont'); // font file name
define('ZBX_FONT_NAME', 'graphfont');

再次刷新页面,乱码问题解决

46

案例: 在Ubuntu20.04 安装 Zabbix Server 6.0

官方链接

1
https://www.zabbix.com/cn/download?zabbix=6.0&os_distribution=ubuntu&os_version=20.04_focal&db=mysql&ws=nginx

![47](../../../../images/SRE/day38/47.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#Install Zabbix repository
[root@ubuntu2004 ~]# wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-1+ubuntu20.04_all.deb
[root@ubuntu2004 ~]# dpkg -i zabbix-release_6.0-1+ubuntu20.04_all.deb
[root@ubuntu2004 ~]# cat /etc/apt/sources.list.d/zabbix.list
deb https://repo.zabbix.com/zabbix/6.0/ubuntu focal main
deb-src https://repo.zabbix.com/zabbix/6.0/ubuntu focal main

#加速,更新为国内源(可选)
[root@ubuntu2004 ~]# sed -i.bak 's#https://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/apt/sources.list.d/zabbix.list
[root@ubuntu2004 ~]# cat /etc/apt/sources.list.d/zabbix.list
deb https://mirrors.aliyun.com/zabbix/zabbix/6.0/ubuntu focal main
deb-src https://mirrors.aliyun.com/zabbix/zabbix/6.0/ubuntu focal main

[root@ubuntu2004 ~]# apt update

#安装Zabbix server,Web前端,agent2
[root@ubuntu2004 ~]# apt -y install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent2 zabbix-get

#安装nginx
[root@ubuntu2004 ~]# nginx -v
nginx version: nginx/1.18.0 (Ubuntu)

#安装php-fpm
[root@ubuntu2004 ~]# php-fpm7.4 -v
PHP 7.4.3 (fpm-fcgi) (built: May 6 2022 00:16:42)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

#安装zabbix_agent2
[root@ubuntu2004 ~]# zabbix_agent2 -V
zabbix_agent2 (Zabbix) 6.0.5
.......

#创建初始数据库
[root@ubuntu2004 ~]# apt -y install mysql-server
[root@ubuntu2004 ~]# mysql
Server version: 8.0.29-0ubuntu0.20.04.3 (Ubuntu)
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
mysql> create user zabbix@localhost identified by '123456';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;

#导入初始架构和数据,系统将提示您输入新创建的密码。
[root@ubuntu2004 ~]# zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p123456 zabbix

#验证数据库和表
[root@ubuntu2004 ~]#mysql -uzabbix -p123456 zabbix -e 'show tables;' |head
mysql: [Warning] Using a password on the command line interface can be insecure.
Tables_in_zabbix
acknowledges
actions
alerts
auditlog
autoreg_host
conditions
config
config_autoreg_tls
corr_condition

#为Zabbix server配置数据库
[root@ubuntu2004 ~]# vim /etc/zabbix/zabbix_server.conf
DBPassword=123456

#确认数据库配置
[root@ubuntu2004 ~]# grep -E '^DB|DBHost=' /etc/zabbix/zabbix_server.conf
# DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=123456

#为Zabbix前端配置PHP
[root@ubuntu2004 ~]# vim /etc/zabbix/nginx.conf
#取消下面两行的注释并修改
listen 80;
server_name zabbix.wang.org;

#默认安装apache2和nginx冲突,禁用apache2
[root@ubuntu2004 ~]# systemctl disable --now apache2.service

#重启服务
[root@ubuntu2004 ~]# systemctl restart zabbix-server zabbix-agent2 nginx php7.4-fpm
[root@ubuntu2004 ~]# systemctl enable zabbix-server zabbix-agent2 nginx php7.4-fpm
[root@ubuntu2004 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:6010 0.0.0.0:*
LISTEN 0 128 127.0.0.1:6011 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:10051 0.0.0.0:*
LISTEN 0 70 127.0.0.1:33060 0.0.0.0:*
LISTEN 0 151 127.0.0.1:3306 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 [::1]:6010 [::]:*
LISTEN 0 128 [::1]:6011 [::]:*
LISTEN 0 4096 *:10050 *:*
LISTEN 0 4096 [::]:10051 [::]:*
LISTEN 0 511 [::]:80 [::]:*

#配置Zabbix前端
#连接到新安装的Zabbix前端: http://server_ip_or_name
#根据Zabbix文件里步骤操作: Installing frontend

初始页面,可以修改语言

48

条件检测

49

输入MySQL数据库相关连接信息

50

指定主机名称和时区

51

汇总信息

52

最后完成

53

登录Web 管理页面,第一次登录, 默认的用户名是Admin,密码是zabbix

54
55

上面所填写的内容保存在下面文件中

1
2
3
4
#如果是CentOS下面文件
/etc/zabbix/web/zabbix.conf.php
#如果是Ubuntu则下面文件
/usr/share/zabbix/conf/zabbix.conf.php 实质也是/etc/zabbix/web/zabbix.conf.php软链接

因为字体的原因乱码

56

在Windows中找一个中文字体

57
58

将字体上传到 Zabbix Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@ubuntu2004 ~]# ls
MSYHBD.TTC MSYHL.TTC MSYH.TTC

[root@ubuntu2004 ~]# dpkg -L zabbix-frontend-php |grep fonts
/usr/share/zabbix/assets/fonts
/usr/share/zabbix/fonts

[root@ubuntu2004 ~]# ll /usr/share/zabbix/assets/fonts/graphfont.ttf
lrwxrwxrwx 1 root root 38 6月 9 21:13
/usr/share/zabbix/assets/fonts/graphfont.ttf -> /etc/alternatives/zabbix-frontend-font

[root@ubuntu2004 ~]# ll /etc/alternatives/zabbix-frontend-font
lrwxrwxrwx 1 root root 47 6月 9 21:13 /etc/alternatives/zabbix-frontend-font -> /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf

[root@ubuntu2004 ~]# ll /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
-rw-r--r-- 1 root root 757076 7月 30 2016
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf

[root@ubuntu2004 ~]# ls /usr/share/fonts/truetype/dejavu/

[root@ubuntu2004 ~]# mv /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf{,.bak}
[root@ubuntu2004 ~]# ls
MSYHBD.TTC MSYHL.TTC MSYH.TTC

#找一个字体替换默认字体
root@ubuntu2004 ~]# mv MSYH.TTC /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf

再次查看Web 显示正常

59

编译安装 Zabbix Server

官方源码编译安装参考文档:

1
2
3
https://www.zabbix.com/documentation/6.0/zh/manual/installation/install
https://www.zabbix.com/documentation/5.0/zh/manual/installation/install
https://www.zabbix.com/documentation/4.0/zh/manual/installation/install

安装相关包

CentOS 安装相关包

1
2
3
[root@zabbix-server ~]# yum -y install gcc pcre-devel libxml2-devel php-bcmath \
php-mbstring net-snmp net-snmp-devel curl-devel php php-gd php-xml libevent-devel \
java-1.8.0-openjdk-devel mariadb mariadb-devel

Ubuntu 安装相关包

1
2
3
4
5
6
7
8
9
[root@ubuntu1804 ~]# apt update 
[root@ubuntu1804 ~]# apt -y install apache2 apache2-bin apache2-data apache2-utils fontconfig-config fonts-dejavu-core fping libapache2-mod-php \
libapache2-mod-php7.2 libapr1 libapruti11 1ibaprutil1-dbd-sq7ite3 libaprutil1-ldap \
1ibfontconfig1 libgd3 libikseme13 libjbig0 libjpeg-turbo8 libjpeg8 liblua5.2-0 \
libodbc1 libopenipmi0 libsensors4 libsnmp-base libsnmp30 libsodium23 1ibssh2-1 \
1ibtiff5 7ibwebp6 1ibxpm4 php-bcmath php-common php-gd php7.2-common php7.2-gd \
php7.2-json php7.2-1dap php7.2-mbstring php7.2-mysq1 php7.2-opcache php7.2-read1ine \
libxm12-dev libxm12 snmp libsnmp-dev libevent-dev openjdk-8-jdk \
libcurl4-openss1-dev php7.2-xm7 snmpd ss1-cert ttf-dejavu-core libmysqlclient-dev

创建用户和组

1
2
[root@zabbix-server ~]# groupadd zabbix
[root@zabbix-server ~]# useradd -g zabbix zabbix

下载源码包

下载链接:

1
https://www.zabbix.com/download_sources

60
61

62

1
2
3
4
5
6
[root@zabbix-server ~]# cd /usr/local/src
[root@zabbix-server src]# wget https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.4.tar.gz
[root@zabbix-server src]# wget https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.14.tar.gz
[root@zabbix-server src]# wget https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.24.tar.gz
[root@zabbix-server src]# ll zabbix-4.0.24.tar.gz -h
-rw-r--r-- 1 root root 17M Aug 24 15:47 zabbix-4.0.24.tar.gz

编译安装

官方链接

1
2
3
https://www.zabbix.com/documentation/6.0/zh/manual/installation/install
https://www.zabbix.com/documentation/5.0/zh/manual/installation/install
https://www.zabbix.com/documentation/4.0/zh/manual/installation/install

63

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[root@zabbix-server src]# ls
zabbix-4.0.24.tar.gz

[root@zabbix-server src]# tar xf zabbix-4.0.24.tar.gz
[root@zabbix-server zabbix-4.0.24]# ./configure --prefix=/apps/zabbix_server \
--enable-server --enable-agent --enable-java --with-mysql --with-net-snmp \
--with-libcurl --with-libxml

#选项说明
--prefix=/apps/zabbix #指定安装目录
--enab1e-server #启用zabbix server
--enab1e-agent #启用zabbix agent
--enable-agent2 #启用zabbix agent2(需要go环境)
--enab1e-proxy #启用proxy的支持
--enable-java #启用java-gateway支持
--with-mysql #使用 MySQL 客户端库
--with-net-snmp #启用Net-SNMP包
--with-libcurl #启用curl包
--with-libxml #启用libxml2客户端库

......
Enable Java gateway: yes
Java gateway details:
Java compiler: javac
Java archiver: jar

LDAP support: no
IPv6 support: no
***********************************************************
* Now run 'make install' *
* *
* Thank you for using Zabbix! *
* <http://www.zabbix.com> *
***********************************************************

[root@zabbix-server zabbix-4.0.24]# make -j 2
[root@zabbix-server zabbix-4.0.24]# make install

[root@zabbix-server ~]# ls /apps/zabbix_server/
bin etc lib sbin share

#创建软链接
[root@zabbix-server ~]# ln -s /apps/zabbix_server/sbin/* /usr/sbin/
[root@zabbix-server ~]# ln -s /apps/zabbix_server/bin/* /usr/bin/
[root@zabbix-server ~]# zabbix_<TAB><TAB>
zabbix_agentd zabbix_get zabbix_sender zabbix_server

#或者
[root@zabbix-server ~]# echo 'PATH=/apps/zabbix_server/bin:$PATH' > /etc/profile.d/zabbix.sh
[root@zabbix-server ~]# . /etc/profile.d/zabbix.sh

准备数据库和相关表

注意: 生产环境监控数据比较多,占用空间可能会达到T级别以上,数据库的磁盘需要预留足够的空间

安装MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#安装MySQL8.0
[root@zabbix-mysql-master ~]# yum -y install mysql-server
[root@zabbix-mysql-master ~]# systemctl enable --now mysqld
[root@zabbix-mysql-server ~]# mysql -uroot -p
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user 'zabbix'@'10.0.0.%' identified by '123456';
mysql> grant all privileges on zabbix.* to 'zabbix'@'10.0.0.%';

#注意: 如果使用MySQL8.0和Zabbix不在同一主机,还需要执行下面
mysql>ALTER USER zabbix@'10.0.0.%' IDENTIFIED WITH mysql_native_password BY '123456';

#或者执行下面
[root@zabbix-mysql-master ~]# echo 'default-authentication-plugin=mysql_native_password' >> /etc/my.cnf.d/mysql-server.cnf

[root@zabbix-mysql-master ~]# systemctl restart mysqld
初始化数据库
1
2
3
4
5
6
7
8
[root@zabbix-server ~]# ls /usr/local/src/zabbix-4.0.24/database/mysql/*.sql -1
/usr/local/src/zabbix-4.0.24/database/mysql/data.sql
/usr/local/src/zabbix-4.0.24/database/mysql/images.sql
/usr/local/src/zabbix-4.0.24/database/mysql/schema.sql

[root@zabbix-server ~]# mysql -uzabbix -p123456 -h10.0.0.101 zabbix < /usr/local/src/zabbix-4.0.24/database/mysql/schema.sql
[root@zabbix-server ~]# mysql -uzabbix -p123456 -h10.0.0.101 zabbix < /usr/local/src/zabbix-4.0.24/database/mysql/images.sql
[root@zabbix-server ~]# mysql -uzabbix -p123456 -h10.0.0.101 zabbix < /usr/local/src/zabbix-4.0.24/database/mysql/data.sql

注意: 在CentOS8 安装Mariadb-10.3在导入schema.sql 出下面提示错误,而在CentOS7 安装Mariadb-5.5 无错误

1
2
Row size too large. The maximum row size for the used table type, not counting 
BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
验证数据库和相关表
1
2
3
4
5
6
7
8
9
10
[root@zabbix-server ~]# mysql -uzabbix -p123456 -h10.0.0.101 zabbix -e 'show tables;'
+----------------------------+
| Tables_in_zabbix |
+----------------------------+
| acknowledges |
| actions |
| alerts |
| application_discovery |
| application_prototype |
| application_template |

修改 Zabbix Server 配置文件

1
2
3
4
5
6
7
8
9
10
[root@zabbix-server ~]# vim /apps/zabbix-server/etc/zabbix_server.conf
[root@zabbix-server ~]# grep '^[^#]' /apps/zabbix-server/etc/zabbix_server.conf
LogFile=/tmp/zabbix_server.log
DBHost=10.0.0.101
DBName=zabbix
DBUser=zabbix
DBPassword=123456
DBPort=3306
#Timeout=4
#LogSlowQueries=3000

启动相关服务

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@zabbix-server ~]# zabbix_server -c /apps/zabbixserver/etc/zabbix_server.conf
[root@zabbix-server ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10051 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*

[root@zabbix-server ~]# tail /tmp/zabbix_server.log
31096:20200825:144614.763 server #31 started [preprocessing worker #1]
31098:20200825:144614.764 server #33 started [preprocessing worker #3]
31097:20200825:144614.771 server #32 started [preprocessing worker #2]

启动httpd服务

1
[root@zabbix-server ~]#systemctl enable --now httpd

查看进程

1
2
3
4
5
6
7
8
9
10
11
12
[root@zabbix-server ~]# ps -ef|grep zabbix
zabbix 765 1 0 19:33 ? 00:00:00 /apps/zabbix-server/sbin/zabbix_server -c /apps/zabbix-server/etc/zabbix_server.conf
......

[root@zabbix-server ~]# pstree -p |grep zabbix
`-zabbix_server(765)-+-zabbix_server(1173)
|-zabbix_server(1174)
|-zabbix_server(1175)
|-zabbix_server(1176)
|-zabbix_server(1177)
|-zabbix_server(1178)
...... ......

配置php和初始化登录WEB页面

1
2
3
4
5
[root@zabbix-server ~]# mkdir /var/www/html/zabbix
[root@zabbix-server ~]# cp -a /usr/local/src/zabbix-4.0.24/frontends/php/. /var/www/html/zabbix/
[root@zabbix-server ~]# ls /var/www/html/zabbix/
actionconf.php assets correlation.php
image.php overview.php srv_status.php

64

缺失相关包和配置,提示下面失败

65

安装配置后再访问

1
2
3
4
5
6
7
[root@zabbix-server ~]# yum -y install   php-gd php-xml php-json php-mysqlnd
[root@zabbix-server ~]# vim /etc/php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Shanghai
[root@zabbix-server ~]# systemctl restart httpd

66

连接数据库信息

67
68
69

创建配置文件

70

下载配置文件并上传至目录/var/www/html/zabbix/conf/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@zabbix-server ~]# cat /var/www/html/zabbix/conf/zabbix.conf.php
<?php
// Zabbix GUI configuration file.
global $DB;

$DB['TYPE'] = 'MYSQL';
$DB['SERVER'] = '10.0.0.101';
$DB['PORT'] = '0';
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = '123456';

// Schema name. Used for IBM DB2 and PostgreSQL.
$DB['SCHEMA'] = '';

$ZBX_SERVER = '10.0.0.100';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'Zabbix Server';

$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;

再次刷新页面,可以看到成功

71

Zabbix 前端已经就绪!第一次登录, 默认的用户名是 Admin,密码是zabbix

72
73

修改PHP文件,防止重复安装

1
2
3
4
[root@zabbix-server zabbix]# pwd
/var/www/html/zabbix

[root@zabbix-server zabbix]# mv setup.php setup.php.bak

启动zabbix agent

1
2
3
4
5
6
7
8
9
10
11
12
[root@zabbix-server ~]# zabbix_agentd 
[root@zabbix-server ~]# ss -ntl
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*

[root@zabbix-server ~]# lsof -i:10050
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
zabbix_ag 2912 zabbix 7u IPv4 43326 0t0 TCP *:zabbix-agent (LISTEN)
zabbix_ag 2913 zabbix 7u IPv4 43326 0t0 TCP *:zabbix-agent (LISTEN)
zabbix_ag 2914 zabbix 7u IPv4 43326 0t0 TCP *:zabbix-agent (LISTEN)
zabbix_ag 2915 zabbix 7u IPv4 43326 0t0 TCP *:zabbix-agent (LISTEN)
zabbix_ag 2916 zabbix 7u IPv4 43326 0t0 TCP *:zabbix-agent (LISTEN)
zabbix_ag 2917 zabbix 7u IPv4 43326 0t0 TCP *:zabbix-agent (LISTEN)

验证监控数据

74

创建 service 文件

Zabbix Server 的 service 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@zabbix-server ~]# killall zabbix_server
[root@zabbix-server ~]# cat /lib/systemd/system/zabbix-server.service
[Unit]
Description=Zabbix Server
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/apps/zabbix_server/etc/zabbix_server.conf"
EnvironmentFile=-/etc/sysconfig/zabbix-server
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_server.pid
KillMode=control-group
ExecStart=/apps/zabbix_server/sbin/zabbix_server -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
TimeoutSec=0

[Install]
WantedBy=multi-user.target

[root@zabbix-server ~]# systemctl daemon-reload
[root@zabbix-server ~]# systemctl enable --now zabbix-server.service
Zabbix agent 的 service 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@zabbix-server ~]# killall zabbix_agentd
[root@zabbix-server ~]# vim /lib/systemd/system/zabbix-agent.service
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/apps/zabbix_server/sbin/zabbix_agentd -c /apps/zabbix_server/etc/zabbix_agentd.conf
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target

[root@zabbix-server ~]# systemctl daemon-reload
[root@zabbix-server ~]# systemctl enable --now zabbix-agent.service

实现中文界面

默认是英文界面,不支持中文

75

安装相关中文包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@zabbix-server ~]# localectl list-locales |grep zh
[root@zabbix-server ~]# yum -y install langpacks-zh_CN
[root@zabbix-server ~]# localectl list-locales |grep zh
zh_CN
zh_CN.gb18030
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.utf8
zh_SG
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.euctw
zh_TW.utf8
.......

再次刷新页面可以选择中文

76

77

解决乱码问题

当前系统有些监控项部分显示有乱码,是由于web界面显示为中文但是系统没有相关字体,因此需要准备相关字体文件才能正常显示,

78
79
80

1
2
3
4
5
6
7
8
9
10
11
12
#注意: 文件名一定是小写
[root@zabbix-server ~]# ll /var/www/html/zabbix/assets/fonts/
total 66276
-rw-r--r-- 1 wang wang 756072 Aug 24 15:46 DejaVuSans.ttf
-rw-r--r-- 1 root root 11787328 Mar 2 2019 simkai.ttf
-rw-r--r-- 1 root root 6700204 May 17 13:28 simyou.ttf

[root@zabbix-server ~]# sed -i.bak 's/DejaVuSans/simyou/' /var/www/html/zabbix/include/defines.inc.php

#修改下面两行
define('ZBX_GRAPH_FONT_NAME', 'simyou'); // font file name
define('ZBX_FONT_NAME', 'simyou');

再次刷新页面,乱码消失

81

容器安装 Zabbix Server

官方文档:

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/installation/containers
注意:官方文档有bug

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#先安装docker,此步略
#1.创建专用于Zabbix组件容器的网络:
[root@ubuntu1804 ~]# docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

#2.启动空的MySQL服务器实例
#注意:此步官方文档有bug
[root@ubuntu1804 ~]# docker run --name mysql-server -t \
--restart=unless-stopped \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--network=zabbix-net \
-d mysql:8.0 \
--character-set-server=utf8 --collation-server=utf8_bin \
--default-authentication-plugin=mysql_native_password

#3.启动Zabbix Java gateway实例
[root@ubuntu1804 ~]# docker run --name zabbix-java-gateway -t \
--network=zabbix-net \
--restart=unless-stopped \
-d zabbix/zabbix-java-gateway:alpine-5.0-latest

#4.启动Zabbix server实例并将该实例与创建的MySQL服务器实例链接
[root@ubuntu1804 ~]# docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--network=zabbix-net \
-p 10051:10051 \
--restart=unless-stopped \
-d zabbix/zabbix-server-mysql:alpine-5.0-latest

#5.启动Zabbix Web界面,并将实例与创建的MySQL服务器和Zabbix server实例链接
[root@ubuntu1804 ~]# docker run --name zabbix-web-nginx-mysql -t \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--network=zabbix-net \
-p 80:8080 \
--restart=unless-stopped \
-d zabbix/zabbix-web-nginx-mysql:alpine-5.0-latest

[root@ubuntu1804 ~]# docker ps
72a464ea73a8 zabbix/zabbix-web-nginx-mysql:alpine-5.0-latest "docker-entrypoint.sh" 5 minutes ago Up 5 minutes 8443/tcp, 0.0.0.0:80->8080/tcp zabbix-web-nginx-mysql
9d239229ebfe mysql:8.0 "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 3306/tcp, 33060/tcp mysql-server
6d05971c8622 zabbix/zabbix-server-mysql:alpine-5.0-latest "/sbin/tini-- /usr/…" 8 minutes ago Up 8 minutes 0.0.0.0:10051->10051/tcp zabbix-server-mysql
dc77a1cf1ca0 zabbix/zabbix-java-gateway:alpine-5.0-latest "docker-entrypoint.s…" 19 minutes ago Up 19 minutes 10052/tcp
zabbix-java-gateway

[root@ubuntu1804 ~]# docker images
zabbix/zabbix-web-nginx-mysql alpine-5.0-latest a3fb50be95b6
zabbix/zabbix-java-gateway alpine-5.0-latest 0814670cd5ac
mysql 8.0 c60d96bd2b77
zabbix/zabbix-server-mysql alpine-5.0-latest 6c3836e6aa39

#6.启动Zabbix agent
docker run --name zabbix-agent \
-e ZBX_HOSTNAME="Zabbix server" \
-e ZBX_SERVER_HOST="127.0.0.1" \
--network container:zabbix-server-mysql \
--restart=unless-stopped \
-d zabbix/zabbix-agent:${TAG}

#访问本机的http服务即可,默认用户Admin,密码:zabbix,直接登录无需初始化过程
http://zabbix-server-ip/

82
83

安装 Zabbix Agent

Zabbix Agent 需要安装到被监控的主机上,它负责定期收集各项数据,并发送到zabbix server端,

zabbix server将数据存储到数据库中,zabbix web 访问数据库在前端进行展现和绘图。

84

安装Zabbix Agent 有三种方式

  • 包安装
  • 二进制安装
  • 编译安装

包安装 Zabbix Agent

Linux 安装 Zabbix Agent

可以从官方或国内镜像站点下载

1
2
3
https://repo.zabbix.com/zabbix/
https://mirrors.aliyun.com/zabbix/zabbix/
https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/

范例:在ubuntu22.04 安装 Zabbix Agent2 6.0

1
2
3
4
5
6
7
8
9
10
11
[root@ubuntu2204 ~]# wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4%2Bubuntu22.04_all.deb
[root@ubuntu2204 ~]# dpkg -i zabbix-release_6.0-4+ubuntu22.04_all.deb
[root@ubuntu2204 ~]# apt update
[root@ubuntu2204 ~]# apt install zabbix-agent2 zabbix-agent2-plugin-*

#修改配置
[root@ubuntu2204 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=zabbix.wang.org

[root@ubuntu2204 ~]# systemctl restart zabbix-agent2
[root@ubuntu2204 ~]# systemctl enable zabbix-agent2

范例: 在ubuntu20.04 安装 Zabbix Agent2 6.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@ubuntu2004 ~]# wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-1+ubuntu20.04_all.deb
[root@ubuntu2004 ~]# dpkg -i zabbix-release_6.0-1+ubuntu20.04_all.deb
[root@ubuntu2004 ~]# apt update

#安装agent2
[root@ubuntu2004 ~]# apt install zabbix-agent2

#修改配置
[root@ubuntu2004 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=zabbix.wang.org

[root@ubuntu2004 ~]# systemctl restart zabbix-agent2.service

[root@ubuntu2004 ~]# ss -ntlp|grep zabbix
LISTEN 0 128 *:10050 *:* users:(("zabbix_agent2",pid=1317,fd=8))

#注意: 后续还需要在Zabbix Server 添加此主机才能实现监控

范例: 在Rocky8上安装直接安装Zabbix agent 2包

1
2
3
4
5
6
7
8
9
10
11
12
[root@rocky8 ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/8/x86_64/zabbix-agent2-6.0.5-1.el8.x86_64.rpm

#修改配置
[root@rocky8 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=zabbix.wang.org

[root@rocky8 ~]# systemctl restart zabbix-agent2.service

[root@rocky8 ~]# ss -ntlp|grep zabbix
LISTEN 0 128 *:10050 *:* users:(("zabbix_agent2",pid=1317,fd=8))

#注意: 后续还需要在Zabbix Server 添加此主机才能实现监控

范例: Rocky8 通过配置仓库进行安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[root@rocky8 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
[root@centos8 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
[root@centos8 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/8/x86_64/zabbix-release-4.0-2.el8.noarch.rpm

#修改为阿里云源
[root@zabbix-server ~]# vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/8/x86_64/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

#或者sed修改
[root@centos8 ~]# sed -i.bak 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo
[root@centos8 ~]# yum -y install zabbix-agent
[root@centos8 ~]# rpm -ql zabbix-agent
/etc/logrotate.d/zabbix-agent
/etc/zabbix/zabbix_agentd.conf
/etc/zabbix/zabbix_agentd.d
/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
/usr/lib/.build-id
/usr/lib/.build-id/0e
/usr/lib/.build-id/0e/5b09aaf28432877d1fb9885bb527d6215463d3
/usr/lib/systemd/system/zabbix-agent.service
/usr/lib/tmpfiles.d/zabbix-agent.conf
/usr/sbin/zabbix_agentd
/usr/share/doc/zabbix-agent
/usr/share/doc/zabbix-agent/AUTHORS
/usr/share/doc/zabbix-agent/COPYING
/usr/share/doc/zabbix-agent/ChangeLog
/usr/share/doc/zabbix-agent/NEWS
/usr/share/doc/zabbix-agent/README
/usr/share/man/man8/zabbix_agentd.8.gz
/var/log/zabbix
/var/run/zabbix

#修改配置
[root@centos8 ~]# vim /etc/zabbix/zabbix_agentd.conf
[root@centos8 ~]# grep '^[^#]' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.100 #必须指向Zabbix Server,此为必须项
ServerActive=127.0.0.1 #主动模式才需要指向Zabbix Server,此处无需修改
Hostname=10.0.0.104 #修改为当前主机的IP,主动模式才需要,此处可选
Timeout=30 #建议修改此值
Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@centos8 ~]# systemctl enable --now zabbix-agent.service
[root@centos8 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:10050 [::]:*

#查看版本
[root@centos8 ~]# zabbix_agentd -V
zabbix_agentd (daemon) (Zabbix) 5.0.14
Revision 892ce506db 16 July 2021, compilation time: Jul 19 2021 10:33:38

Windows 上安装 Agent2

官方下载链接

1
https://www.zabbix.com/cn/download_agents?version=6.0+LTS&release=6.0.5&os=Windows&os_version=Any&hardware=amd64&encryption=OpenSSL&packaging=MSI&show_legacy=0

85
86
87
88
89
90
91
92

验证端口

1
2
3
C:\Users\lbtoo>netstat -an| find "10050"
TCP 0.0.0.0:10050 0.0.0.0:0 LISTENING
TCP [::]:10050 [::]:0 LISTENING

二进制安装 Zabbix Agent

官方提供了针对不同的OS编译好的程序,进行配置后即可直接使用

注意: 此方式在CentOS 8 上存在问题

官方下载链接:

1
https://www.zabbix.com/download_agents?version=4.0+LTS&release=4.0.24&os=Linux&os_version=3.0&hardware=amd64&encryption=No+encryption&packaging=Archive

93

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
[root@centos7 ~]# wget https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.14/zabbix_agent-5.0.14-linux-3.0-amd64-static.tar.gz
[root@centos7 ~]# wget https://www.zabbix.com/downloads/4.0.24/zabbix_agent-4.0.24-linux-3.0-amd64-static.tar.gz
[root@centos7 ~]# mkdir -p /apps/zabbix_agent
[root@centos7 ~]# tar xf zabbix_agent-4.0.24-linux-3.0-amd64-static.tar.gz -C /apps/zabbix_agent/
[root@centos7 ~]# tree /apps/zabbix_agent/
/apps/zabbix_agent/
├── bin
│ ├── zabbix_get
│ └── zabbix_sender
├── conf
│ ├── zabbix_agentd
│ │ ├── userparameter_examples.conf
│ │ └── userparameter_mysql.conf
│ └── zabbix_agentd.conf
└── sbin
└── zabbix_agentd
4 directories, 6 files

[root@centos7 ~]# echo 'PATH=/apps/zabbix_agent/bin:/apps/zabbix_agent/sbin:$PATH' > /etc/profile.d/zabbix_agent.sh
[root@centos7 ~]# . /etc/profile.d/zabbix_agent.sh

#修改配置
[root@centos7 ~]# HOST=`hostname -I`
[root@centos7 ~]# sed -i.bak -e "s/Server=127.0.0.1/Server=10.0.0.100/" \
-e "s/Hostname=Zabbix server/Hostname=$HOST/" /apps/zabbix_agent/etc/zabbix_agentd.conf

#启动服务
[root@centos7 ~]# /apps/zabbix_agent/sbin/zabbix_agentd -c /apps/zabbix_agent/conf/zabbix_agentd.conf
zabbix_agentd [1370]: user zabbix does not exist
zabbix_agentd [1370]: cannot run as root!

[root@centos7 ~]# useradd zabbix
[wang@centos7 ~]$ /apps/zabbix_agent/sbin/zabbix_agentd -c /apps/zabbix_agent/conf/zabbix_agentd.conf

[root@centos7 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:10050 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*

[root@centos7 ~]# killall zabbix_agentd
[root@centos7 ~]# vim /lib/systemd/system/zabbix-agent.service
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/apps/zabbix_agent/sbin/zabbix_agentd -c /apps/zabbix_agent/conf/zabbix_agentd.conf
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target

[root@zabbix-server ~]# systemctl daemon-reload
[root@zabbix-server ~]# systemctl enable --now zabbix-agent.service

编译安装 Zabbix Agent

编译安装 zabbix agent 和 zabbix server 是同一个源码包,只需指定不同的编译选项即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[root@centos8 ~]# yum -y install gcc pcre-devel
[root@centos8 ~]# useradd zabbix
[root@centos8 ~]# wget https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.24.tar.gz
[root@centos8 ~]# tar xf zabbix-4.0.24.tar.gz
[root@centos8 ~]# cd zabbix-4.0.24/
[root@centos8 zabbix-4.0.24]# ./configure --prefix=/apps/zabbix_agent --enableagent
[root@centos8 zabbix-4.0.24]# make && make install
[root@centos8 zabbix-4.0.24]# tree /apps/zabbix_agent/
/apps/zabbix_agent/
├── bin
│ ├── zabbix_get
│ └── zabbix_sender
├── etc
│ ├── zabbix_agentd.conf
│ └── zabbix_agentd.conf.d
├── lib
│ └── modules
├── sbin
│ └── zabbix_agentd
└── share
└── man
├── man1
│ ├── zabbix_get.1
│ └── zabbix_sender.1
└── man8
└── zabbix_agentd.8
10 directories, 7 files

#修改配置
[root@centos8 ~]# HOST=`hostname -I`
[root@centos8 ~]# sed -i.bak -e "s/Server=127.0.0.1/Server=10.0.0.100/" \
-e "s/Hostname=Zabbix server/Hostname=$HOST/" /apps/zabbix_agent/etc/zabbix_agentd.conf

#创建service文件
[root@centos8 ~]# vim /lib/systemd/system/zabbix-agent.service
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/apps/zabbix_agent/sbin/zabbix_agentd -c /apps/zabbix_agent/etc/zabbix_agentd.conf
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target

[root@centos8 ~]# systemctl daemon-reload
[root@centos8 ~]# systemctl enable --now zabbix-agent.service
[root@centos8 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*

一键编译安装 Zabbix Agent 脚本

范例1: CentOS和Ubuntu 通用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
[root@ubuntu1804 ~]# cat install_zabbix_agent_src.sh 
#!/bin/bash
ZABBIX_VER=5.0.13
FILE=zabbix-${ZABBIX_VER}.tar.gz
INSTALL_DIR=/apps/zabbix_agent
SERVER=10.0.0.100
HOST=`hostname -I`
. /etc/os-release

color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}

check(){
wget https://cdn.zabbix.com/zabbix/sources/stable/${ZABBIX_VER%.*}/zabbix-$ZABBIX_VER.tar.gz
[ -e ${FILE} ] || { color "$FILE 文件不存在,请检查" 1 ; exit 1; }
}

prepare (){
if [ $ID = "centos" $ID = "rocky" ];then
yum -y install gcc make pcre-devel || { color "zabbix agent 相关包安装失败,请检查" 1 ;exit; }
else
apt -y install gcc make || { color "zabbix agent 相关包安装失败,请检查" 1 ;exit; }
fi
id zabbix &> /dev/null || useradd -r zabbix
}

install() {
tar xf $FILE
cd zabbix-$ZABBIX_VER
./configure --prefix=${INSTALL_DIR} --enable-agent
make && make install
}

config () {
sed -i.bak -e "s/Server=127.0.0.1/Server=$SERVER/" -e "s/Hostname=Zabbix server/Hostname=$HOST/" ${INSTALL_DIR}/etc/zabbix_agentd.conf
echo 'PATH=${INSTALL_DIR}/bin/:${INSTALL_DIR}/sbin/:$PATH' > /etc/profile.d/zabbix_agent.sh
}

service (){
cat > /lib/systemd/system/zabbix-agent.service << -EOF
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=${INSTALL_DIR}/sbin/zabbix_agentd -c ${INSTALL_DIR}/etc/zabbix_agentd.conf
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target

EOF

systemctl daemon-reload
systemctl enable --now zabbix-agent.service
systemctl is-active zabbix-agent.service && color "Zabbix Agent 安装完成并启动" 0
}

check
prepare
install
config
service

范例2: 只针对CentOS系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[root@centos8 ~]# cat install_zabbix_agent_for_centos.sh 
#!/bin/bash
. /etc/init.d/functions
VERSION=zabbix-4.0.24
FILE=${VERSION}.tar.gz
SERVER=10.0.0.100
HOST=`hostname -I`

check(){
[ -e ${FILE} ] || { action "$FILE 文件不存在,请检查" false ; exit 1; }
}

prepare (){
yum -y install gcc pcre-devel || { action "zabbix agent 相关包安装失败,请检查" false ;exit; }
id zabbix &> /dev/null || useradd -r zabbix
}

install() {
tar xf $FILE
cd $VERSION
./configure --prefix=/apps/zabbix_agent --enable-agent
make && make install
}

config () {
sed -i.bak -e "s/Server=127.0.0.1/Server=$SERVER/" -e "s/Hostname=Zabbix server/Hostname=$HOST/" /apps/zabbix_agent/etc/zabbix_agentd.conf
}

service (){
cat > /lib/systemd/system/zabbix-agent.service <<-EOF
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/apps/zabbix_agent/sbin/zabbix_agentd -c /apps/zabbix_agent/etc/zabbix_agentd.conf
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now zabbix-agent.service && action "Zabbix Agent 安装完成并启动"
}

env(){
echo 'PATH=/apps/zabbix_agent/bin/:/apps/zabbix_agent/sbin/:$PATH' > /etc/profile.d/zabbix_agent.sh
}

check
prepare
install
config
service
env

利用 Ansible 批量部署 Zabbix Agent

范例: 部署Zabbix agent2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
[root@ubuntu2004 ~]# cat install_zabbix_agent2.yaml
---
- name: install zabbix_agent2
hosts: all
serial: 2
vars:
- ZX_SERVER: "zabbix.wang.org"
- ZX_VER: "5.0"
- ZX_URL: "https://mirror.tuna.tsinghua.edu.cn/zabbix"
tasks:
- name: rocky8
block:
- name: rocky repo
shell: "rpm -Uvh {{ ZX_URL }}/zabbix/{{ ZX_VER }}/rhel/8/x86_64/zabbix-release-{{ ZX_VER }}-1.el8.noarch.rpm"
ignore_errors: yes
- name: replace uri
replace:
path: /etc/yum.repos.d/zabbix.repo
regexp: "http://repo.zabbix.com"
replace: "{{ ZX_URL }}"
- name: rocky install
yum:
name: zabbix-agent2
state: present
when: ansible_distribution_file_variety == "RedHat"
- name: ubuntu2004
block:
- name: ubuntu apt
shell: "wget {{ ZX_URL }}/zabbix/{{ ZX_VER }}/ubuntu/pool/main/z/zabbix-release/zabbix-release_{{ ZX_VER }}-1+focal_all.deb"
- name: dpkg
shell: "dpkg -i zabbix-release_{{ ZX_VER }}-1+focal_all.deb"
- name: replace uri
replace:
path: /etc/apt/sources.list.d/zabbix.list
regexp: "http://repo.zabbix.com"
replace: "{{ ZX_URL }}"
- name: apt
apt:
update_cache: yes
name: zabbix-agent2
state: present
when: ansible_distribution_file_variety == "Debian"
- name: config hostname
replace:
path: /etc/zabbix/zabbix_agent2.conf
regexp: "Hostname=Zabbix server"
replace: "Hostname={{ ansible_eth0.ipv4.address }}"
notify:
- restart agent2
- name: config Server
replace:
path: /etc/zabbix/zabbix_agent2.conf
regexp: "Server=127.0.0.1"
replace: "Server={{ ZX_SERVER }}"
notify:
- restart agent2
- name: service
service:
name: zabbix-agent2.service
state: started
enabled: yes
handlers:
- name: restart agent2
service:
name: zabbix-agent2.service
state: restarted

范例: 部署Zabbix agent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#先实现所有被监控主机的ssh key 验证过程略
#由于ansible是在Ubuntu上安装,需要在所有Zabbix Agent上安装python环境
[root@ubuntu1804 ~]# ln -s python3 /usr/bin/python
[root@centos8 ~]# yum -y install python3 && ln -s python3 /usr/bin/python

#安装ansible
[root@zabbix-server ~]# apt -y install ansible
[root@zabbix-server ~]# grep -Ev "^$|#" /etc/ansible/hosts
[web]
10.0.0.[7:9]

#检查环境
[root@zabbix-server ~]# ansible web -m ping
10.0.0.7 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.8 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.9 | SUCCESS => {
"changed": false,
"ping": "pong"
}

[root@zabbix-server ~]# ls /opt
install_zabbix_agent.yml templates

[root@zabbix-server ~]# grep -Ev '^$|#' /opt/templates/zabbix_agentd.conf.j2
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server={{ zabbix_server }}
ServerActive={{ zabbix_server }}
Hostname={{ ansible_eth0.ipv4.address }}
Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@zabbix-server ~]# cat /opt/install_zabbix_agent.yml
---
#install zabbix agent
- hosts: web
remote_user: root
serial: 1
vars:
zabbix_server: "10.0.0.100"
zabbix_ver: "5.0"

tasks:
- name: install repo package for CentOS 7
yum:
name: https://repo.zabbix.com/zabbix/{{ zabbix_ver }}/rhel/{{ ansible_distribution_major_version }}/x86_64/zabbix-release-{{ zabbix_ver }}-1.el{{ ansible_distribution_major_version }}.noarch.rpm
when:
- ansible_facts['distribution'] == "CentOS"
- ansible_facts['distribution_major_version'] == "7"
- name: install repo package for CentOS 8
dnf:
name: https://repo.zabbix.com/zabbix/{{ zabbix_ver }}/rhel/{{ ansible_distribution_major_version }}/x86_64/zabbix-release-{{ zabbix_ver }}-1.el{{ ansible_distribution_major_version }}.noarch.rpm
when:
- ansible_facts['distribution'] == "CentOS"
- ansible_facts['distribution_major_version'] == "8"
- name: download repo package for Ubuntu 18.04
get_url:
url: https://repo.zabbix.com/zabbix/{{ zabbix_ver }}/ubuntu/pool/main/z/zabbix-release/zabbix-release_{{ zabbix_ver }}-1+{{ ansible_distribution_release }}_all.deb
dest: /opt/
when:
- ansible_facts['distribution'] == "Ubuntu"
- ansible_facts['distribution_major_version'] == "18"

- name: install repo package for ubuntu 18.04
shell: dpkg -i /opt/zabbix-release_{{ zabbix_ver }}-1+{{ ansible_distribution_release }}_all.deb
when:
- ansible_facts['distribution'] == "Ubuntu"
- ansible_facts['distribution_major_version'] == "18"

- name: aliyun repo for CentOS
replace:
path: /etc/yum.repos.d/zabbix.repo
regexp: 'repo.zabbix.com'
replace: 'mirrors.aliyun.com/zabbix'
when: ansible_facts['distribution'] == "CentOS"

- name: aliyun repo for Ubuntu 18.04
replace:
path: /etc/apt/sources.list.d/zabbix.list
regexp: 'repo.zabbix.com'
replace: 'mirrors.aliyun.com/zabbix'
when:
- ansible_facts['distribution'] == "Ubuntu"
- ansible_facts['distribution_major_version'] == "18"

- name: install zabbix agent packages for CentOS 7
yum: name=zabbix-agent
when:
- ansible_facts['distribution'] == "CentOS"
- ansible_facts['distribution_major_version'] == "7"
- name: install zabbix agent packages for CentOS 8
dnf: name=zabbix-agent
when:
- ansible_facts['distribution'] == "CentOS"
- ansible_facts['distribution_major_version'] == "8"
- name: install zabbix agent packages for ubuntu 18.04
apt:
name: zabbix-agent
update_cache: yes
when:
- ansible_facts['distribution'] == "Ubuntu"
- ansible_facts['distribution_major_version'] == "18"

- name: zabbix agent config file
template: src=zabbix_agentd.conf.j2 dest=/etc/zabbix/zabbix_agentd.conf

- name: start zabbix agent service
service: name=zabbix-agent state=restarted enabled=yes

#开始批量部署
[root@zabbix-server ~]# ansible-playbook /opt/install_zabbix_agent.yml

#验证安装是否成功
[root@ubuntu1804 ~]# zabbix_agentd -V
zabbix_agentd (daemon) (Zabbix) 5.0.14
Revision 892ce506db 16 July 2021, compilation time: Jul 16 2021 14:45:07

[root@ubuntu1804 ~]# systemctl is-active zabbix-agent.service
active

利用 zabbix_get 工具测试 Zabbix Agent 是否正常

利用 zabbix_get 工具可以测试 Zabbix Agent 是否正常

Zabbix Agent 内置的监控项

1
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/itemtypes/zabbix_agent

不同平台支持 Zabbix agent监控项:

1
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/items/supported_by_platform

范例: Ubuntu20.04安装 Zabbix_get

1
2
3
4
5
6
7
[root@ubuntu2004 ~]# wget wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-1+ubuntu20.04_all.deb
[root@ubuntu2004 ~]# dpkg -i zabbix-release_6.0-1+ubuntu20.04_all.deb
[root@ubuntu2004 ~]# apt update
[root@ubuntu2004 ~]# apt -y install zabbix-get
[root@ubuntu2004 ~]# zabbix_get -V
zabbix_get (Zabbix) 6.0.5
Revision 8da3e1f8419 30 May 2022, compilation time: May 30 2022 06:40:36

范例: Rocky8 安装 zabbix_get

1
2
3
4
[root@rocky8 ~]# rpm -ivh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/8/x86_64/zabbix-get-6.0.5-1.el8.x86_64.rpm
[root@rocky8 ~]# zabbix_get -V
zabbix_get (Zabbix) 6.0.5
Revision 8da3e1f8419 30 May 2022, compilation time: May 30 2022 13:41:39

范例: 使用zabbix_get 工具查看验证agent是否正常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#返回1表示正常
[root@zabbix-server ~]#/apps/zabbix_server/bin/zabbix_get -s 10.0.0.103 -p 10050 -k "agent.ping"
1

[root@zabbix-server ~]#/apps/zabbix_server/bin/zabbix_get -s 127.0.0.1 -p 10050 -k "agent.ping"
1

#故障现象,可能为agent主机的网络不通导致,agent服务没有启动,配置错误如:Server错误地址,StartAgents=0等
[root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get -s 10.0.0.102 -p 10050 -k "agent.ping"
zabbix_get [9147]: Get value error: cannot connect to [[10.0.0.102]:10050]: [113]
No route to host

#故障现象,一般为主标主机没有启动agent
[root@zabbix-server ~]# zabbix_get -s 10.0.0.7 -p 10050 -k "agent.ping"
zabbix_get [19982]: Get value error: cannot connect to [[10.0.0.7]:10050]: [111]
Connection refused

#故障现象,agent 没有将server指令指向server的地址,导致server无法获取agent的信息
[root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get -s 10.0.0.100 -p 10050 -k "agent.ping"
zabbix_get [9162]: Check access restrictions in Zabbix agent configuration

范例: 利用zabbix_get 获取指定的监控项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "system.hostname"
centos8.magedu.org

[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "system.uname"
Linux centos8.magedu.org 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64

[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "system.users.num"
2

#检查端口是否打开
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "net.tcp.port[,22]"
1

#查看sshd进程数
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "proc.num[sshd,,,]"
3

#查看zabbix_agentd进程数
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k 'proc.num[zabbix_agentd]'
6

范例: 使用Zabbix WEB 测试是否agent 正常

94

Zabbix Agent2 安装和配置

Zabbix agent 2 是新一代的 Zabbix agent,在Zabbix 4.4的版本时已经推出. 未来可能会代替 Zabbix agent

官方说明

1
https://www.zabbix.com/documentation/5.0/manual/concepts/agent2

Zabbix Agent2 特点

  • 减少 TCP 连接的数量
  • 基于 go 开发,支持更大的并发性检查
  • 插件易于扩展。插件应该能够:
    • 提供琐碎的检查,包括只有几个简单的代码行
    • 提供复杂的检查,包括长期运行的脚本和独立的数据收集,并定期发回数据
  • 是 Zabbix agent 的替代版版本(因为它支持所有以前的功能)
  • agent2是多线程模式,agent是多进程模式

对比 Agent和Agent2 官方链接

1
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/agent_comparison

Agent2 使用说明

1
https://www.zabbix.com/documentation/5.0/zh/manpages/zabbix_agent2

范例: Rocky8 安装Zabbix Agent2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#从国内镜像下载
[root@rocky8 ~]# rpm -ivh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/8/x86_64/zabbix-agent2-6.0.5-1.el8.x86_64.rpm
[root@rocky8 ~]# rpm -ql https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/8/x86_64/zabbix-agent2-6.0.5-1.el8.x86_64.rpm
warning:
https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/8/x86_64/zabbix-agent2-6.0.5-1.el8.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
/etc/logrotate.d/zabbix-agent2
/etc/zabbix/zabbix_agent2.conf
/etc/zabbix/zabbix_agent2.d
/etc/zabbix/zabbix_agent2.d/plugins.d/ceph.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/docker.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/memcached.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/modbus.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/mongodb.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/mqtt.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/mysql.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/oracle.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/postgres.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/redis.conf
/etc/zabbix/zabbix_agent2.d/plugins.d/smart.conf
/usr/lib/.build-id
/usr/lib/.build-id/88
/usr/lib/.build-id/88/e20f765be60a306e65225d3110fae01371ddee
/usr/lib/systemd/system/zabbix-agent2.service
/usr/lib/tmpfiles.d/zabbix_agent2.conf
/usr/sbin/zabbix_agent2
/usr/share/doc/zabbix-agent2
/usr/share/doc/zabbix-agent2/AUTHORS
/usr/share/doc/zabbix-agent2/COPYING
/usr/share/doc/zabbix-agent2/ChangeLog
/usr/share/doc/zabbix-agent2/NEWS
/usr/share/doc/zabbix-agent2/README
/usr/share/man/man8/zabbix_agent2.8.gz
/var/log/zabbix
/var/run/zabbix

[root@rocky8 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=zabbix.wang.org

[root@rocky8 ~]# systemctl enable --now zabbix-agent2.service
[root@rocky8 ~]# ss -ntlp|grep zabbix
LISTEN 0 128 *:10050 *:* users:(("zabbix_agent2",pid=22792,fd=8))

#Zabbix Server 测试连接
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -k agent.ping
1

95
96

过一会儿会变绿

97
98

范例: 安装和配置Zabbix agent2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#停止agent 防止端口10050/tcp冲突
[root@ubuntu1804 ~]# systemctl disable --now zabbix-agent

#安装
[root@ubuntu1804 ~]# apt -y install zabbix-agent2
[root@centos8 ~]# yum -y install zabbix-agent2

#配置文件和agent相同
[root@ubuntu1804 ~]# grep -vE '^$|#' /etc/zabbix/zabbix_agent2.conf
PidFile=/var/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=10.0.0.100 #修改此行
ServerActive=127.0.0.1
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agent2.d/*.conf
ControlSocket=/tmp/agent.sock

[root@ubuntu1804 ~]# systemctl restart zabbix-agent2

#在Zabbix Server测试
[root@zabbix-server ~]# zabbix_get -s 10.0.0.9 -k 'agent.ping'
1

#agent2是多线程
[root@rocky8 ~]# pstree -p|grep zabbix_agent2
`-zabbix_agent2(1825)-+-{zabbix_agent2}(1826)
|-{zabbix_agent2}(1827)
|-{zabbix_agent2}(1828)
|-{zabbix_agent2}(1829)
|-{zabbix_agent2}(1830)
|-{zabbix_agent2}(1831)
`-{zabbix_agent2}(1833)
#agent是多进程
[root@rocky8 ~]# pstree -p | grep zabbix_agent
`-zabbix_agentd(1448)-+-zabbix_agentd(1449)
|-zabbix_agentd(1450)
|-zabbix_agentd(1451)
|-zabbix_agentd(1452)
`-zabbix_agentd(1453)

案例: 将Zabbix Server的MySQL 数据库迁移到独立的MySQL服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#停止 Zabbix 服务
[root@zabbix-server ~]# systemctl stop zabbix-server.service

#备份数据库
[root@zabbix-server ~]# mysqldump -uroot -A -F --single-transaction > /data/all.sql
[root@zabbix-server ~]# systemctl disable --now mysql

#在独立数据库服务器上安装并恢复数据库
[root@mysql-server ~]# apt -y install mysql-server
[root@mysql-server ~]# vim /etc/mysql/mysql.conf.d/mysqld.cnf
#注释两行
#bind-address = 127.0.0.1
#mysqlx-bind-address = 127.0.0.1

[root@mysql-server ~]# systemctl restart mysql
[root@mysql-server ~]# mysql < all.sql

#重新授权用户允许远程连接zabbix数据库
[root@mysql-server ~]# mysql
mysql>create user zabbix@'10.0.0.%' identified by '123456';
mysql>grant all privileges on zabbix.* to zabbix@'10.0.0.%';

#将php的配置指向新的数据库服务器IP
[root@zabbix-server ~]# vim /usr/share/zabbix/conf/zabbix.conf.php
$DB['SERVER'] = '10.0.0.101';

#将Zabbix Server的配置指向新的数据库服务器IP
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=10.0.0.101
DBPort=3306

#重启服务生效
[root@zabbix-server ~]# systemctl start zabbix-server.service

Zabbix 核心功能

使用现有模板和监控项监控主机和应用

内置模板参考链接:

1
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates

使用现有模板和监控项监控主机流程

  • 在被监控的主机上安装Zabbix Agent ,建议和 Zabbix Server 同一个版本
  • 配置 Zabbix agent的配置文件关键两项,并重启服务生效
1
2
Server = <Zabbix_Server_IP>
Hostname=<本机IP>
  • 在Zabbix Server 上使用 zabbix_get 工具测试是否正常连接被监控主机
  • 在Zabbix Server 添加被监控主机
  • 在Zabbix WEB 添加已有的模板至被监控的主机
  • 在Zabbix WEB 观察是否有新数据生成

监控 Linux 主机

监控前先确保被监控主机已经安装好 Zabbix agent 并启动

LInux 主机模板参考链接:

1
2
监控前先确保被监控主机已经安装好 Zabbix agent 并启动
LInux 主机模板参考链接:

添加主机

Zabbix Server 5.0 以上版本

99

Zabbix Server 4.0 以上版本

100

101

关联内置模板

模板是一些事先定义好的相关监控项的集合,直接关联模板,比一个一个加入监控项要方便很多

模板分为内置模板和自定义模板

内置模板参看:

1
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates

内置的监控项

1
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/itemtypes/zabbix_agent

关联内置模板: Template OS linux

102
103
104

确认成功

等一会儿可以看到下面 ZBX 变绿色,表示成功

105

查看监控数据

106

修改自动发现的时间间隔

默认分区和网络的监控间隔较长,修改间隔到合适时长

通常生产中一个主机的监控项可能有100个左右,为了控制监控压力,在实现高可用的情况下,时间间隔也不宜太短,一般使用5分钟的时间间隔较常见

107
108
109
110
111

过一会可以看到磁盘的数据

112

可以观察到网卡的流量

113

监控 Windows 主机

注意: 要监控 Windows 需要提前关掉 Windows 防火墙和其它防火墙软件,如火绒等,否则可能会失败

安装 Zabbix Agent2

1
https://www.zabbix.com/cn/download_agents?version=6.0+LTS&release=6.0.5&os=Windows&os_version=Any&hardware=amd64&encryption=OpenSSL&packaging=Archive&show_legacy=0

下载链接

1
2
3
4
https://cdn.zabbix.com/zabbix/binaries/stable/6.0/6.0.5/zabbix_agent2-6.0.5-windows-amd64-openssl.msi
https://cdn.zabbix.com/zabbix/binaries/stable/6.0/6.0.5/zabbix_agent2-6.0.5-windows-amd64-openssl-static.zip
https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.24/zabbix_agent-5.0.24-windows-amd64-openssl.msi
https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.24/zabbix_agent2-5.0.24-windows-amd64-openssl.msi

114
115
116
117
118
119
120
121
122
123
124

验证端口

1
2
3
C:\Users\lbtoo>netstat -an| find  "10050"
TCP 0.0.0.0:10050 0.0.0.0:0 LISTENING
TCP [::]:10050 [::]:0 LISTENING

如果下载的 Archive 包,解压缩,修改zabbix_agent2.conf

1
2
3
4
5
6
7
8
9
10
11
12
#修改配置文件 c:\zabbix_agents2\conf\zabbix_agent2.conf
...
Server=zabbix.wang.org
ServerActive=zabbix.wang.org
Hostname=windows10

#以管理员身份运行cmd,将zabbix命令注册为服务、然后启动该服务;
c:\zabbix_agent2\bin\zabbix_agentd.exe -c
c:\zabbix_agent2\conf\zabbix_agent2.conf --install

#查看端口
netstat -an|find "10050"

在Zabbix Server 测试连接agent

1
2
[root@zabbix-server ~]# zabbix_get -s 10.0.0.1 -k agent.ping
1

通过Web 配置 Zabbix Server 监控 Windows 主机

125

关联内置模板 windows by Zabbix agent126
127

稍等一分钟, ZBX字体变绿

128

查看最新数据

129

查看图形显示

130

监控 Nginx 服务

nginx 模板参考:

1
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/app/nginx_http

查看 nginx 内置模板和修改宏定义

使用内置模板: Template App Nginx by HTTP 或者 Nginx by Zabbix agent

131
132
133

修改模板中的宏定义值status页面的URL

134

修改模板的时间间隔

为方便观察结果,修改模板中监控项的更新的时间间隔为1m

135
136
137
138

安装和配置nginx服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@centos8 ~]# yum -y install nginx 
[root@centos8 ~]# vim /etc/nginx/nginx.conf
http {
server {
location / {
}
#添加下面三行,修改basic_status为/status和前面zabbix的模板定义的路径要保持一致
location = /status {
stub_status;
}
}
}

[root@centos8 ~]# systemctl enable --now nginx

139

添加监控的主机并关联模板

使用内置模板: Template App Nginx by HTTP

140
141
142
143

查看监控数据

144
145
146

监控 Php-fpm 服务

php-fpm 模板参考:

1
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/app/php-fpm_agent

在前面nginx基础上实现php-fpm服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@centos8 ~]# yum -y install php-fpm
[root@centos8 ~]# vim /etc/php-fpm.d/www.conf
listen=127.0.0.1:9000
pm.status_path = /php_status
ping.path = /ping

[root@centos8 ~]# systemctl enable --now php-fpm.service

#修改nginx的配置
[root@centos8 ~]# vim /etc/nginx/nginx.conf
.....
location / {
}
location = /status {
stub_status;
}
location ~ ^/(ping|php_status)$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
.......

[root@centos8 ~]# systemctl restart nginx
#浏览器测试访问可以看到下面页面

147
148

修改内置模板

注意: 选择正确的模板

使用 Zabbix 内置模板 Template App PHP-FPM by Zabbix agent

149

修改内置模板的监控间隔

150
151

修改内置模板的宏定义,注意要和前面php-fpm的路径相匹配

152

关联内置模板到监控的主机

使用 Zabbix 内置模板 Template App PHP-FPM by Zabbix agent

153
154
155

查看监控结果

156
157

自定义模板 Templates 和监控项 Items

上面对Linux系统的监控是使用系统内置模板的监控项,虽然 Zabbix 内置的模板及其包括的监控项已经很丰富

但是内置的监控项可能不一定适合当前环境,或者有些不需要的监控项,或者需要的监控项并没有提供

因此实际生产中仍可能需要通过自定义监控项来满足当前环境的监控需求

自定义模板和监控项实现过程

  • 在Zabbix 被监控主机上编写自定义监控项的取值的脚本,并加执行权限
  • 在Zabbix 被监控主机上的配置文件中添加自定义监控项,指定 key 和 对 key 赋值的脚本及参数
  • 在Zabbix Server 上使用 zabbix_get 工具测试是否能取到自定义监控项信息
  • 在Zabbix Web 创建模板,在模板中添加自定义监控项
  • 在Zabbix Web 将模板关联至被监控的主机
  • 导出自定义模板可以在其它 Zabbix Server 复用

除了自定义模板,也可以从zabbix网站查找适合自已的模板

1
https://share.zabbix.com/

158

自定义监控项

系统内置的监控项如下

1
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/itemtypes/zabbix_agent

内置的监控项无法满足要求,可以自定义监控项

自定义监控项配置

监控项键值的格式

1
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/item/key

159

客户端可以自定义监控项,在Zabbix Agent 配置文件添加内容,格式如下

1
2
3
4
5
6
7
8
9
#cat /etc/zabbix/zabbix_agentd.conf
#cat /etc/zabbix/zabbix_agent2.conf
UserParameter=<key>,<shell command>
Include=/etc/zabbix/zabbix_agentd.d/*.conf

#或者创建独立的自定义文件
#cat /etc/zabbix/zabbix_agentd.d/*.conf
#cat /etc/zabbix/zabbix_agent2.d/*.conf
UserParameter=<key>,<shell command>

说明:

  • key 必须整个系统唯一。注意大小写是敏感的, Key名允许的字符如下
1
0-9a-zA-Z_-.

key使用 [*] 用于定义该key接受括号内的参数。参数需在配置监控项时给出;参数禁止使用下列字符:\ ’ ” ` * ? [ ] { } ~ $ ! & ; ( ) <>

  • Command:命令用于生成key对应的值。可以在命令中使用位置引用$1 … $9来引用监控项Key中的相应参数。Zabbix解析监控项Key的[]中包含的参数,并相应地替换$1,…,$9。$0会替换为完整的原始命令(在对$0,…,$9执行替换之前的命令)运行。不管位置参数($0,…,$9)是用双引号( “ )还是单引号( ’ )括起来,都会解析位置引用

测试监控项

在Zabbix Agent 上执行测试

1
2
3
#不需要重启服务:
zabbix_agent -t "在客户端定义的key名[arg1,arg2,...]"
zabbix_agent2 -t "在客户端定义的key名[arg1,arg2,...]"

在Zabbix Server上可以使用zabbix_get工具获取自定义监控项

1
2
#需要重启服务:systemctl restart zabbix-agent2.service
zabbix_get -s 客户端IP -p 10050 -k "在客户端定义的key名[arg1,arg2,...]"

注意:

  • 如果用脚本实现首行必须加shebang机制
  • 如果编译安装的程序,需要写程序的完整路径

宏Macros

另外Zabbix 支持用户自定义宏,即支持变量定义

自定义宏格式为: {$macrosz_name}

官方文档

1
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/macros

自定义监控项配置案例

范例:取根文件系统的空间利用率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/test.conf
[root@centos8 ~]# cat /etc/zabbix/zabbix_agent2.d/test.conf
UserParameter=root_filesystem_use,df|awk -F' +|%' '$7 == "/" {print $5 }'

#客户端测试
[root@centos8 ~]# zabbix_agent -t root_filesystem_use
[root@centos8 ~]# zabbix_agent2 -t root_filesystem_use

#重启服务后服务器端才能获取数据
[root@centos8 ~]# systemctl restart zabbix-agent.service

#服务器端测试
[root@zabbix-server ~]# yum -y install zabbix-get
[root@zabbix-server ~]# apt -y install zabbix-get
[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "root_filesystem_use"

范例:自定义监控项实现连接数

1
2
3
4
5
6
[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=tcp_state_estab,ss -ant|grep -c ESTAB

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state_estab"
5

范例:实现自定义监控项的参数

1
2
3
4
5
6
[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=test[*],echo $1

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "test[This is a test item]"
This is a test item

范例:利用自定义监控项的参数功能监控MySQL的存活状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@centos8 ~]# yum -y install mysql-server
[root@centos8 ~]# systemctl enable --now mysqld

[root@centos8 ~]# mysql
mysql> create user test@'localhost' identified by '123456';

[root@centos8 ~]# mysqladmin -utest -p123456 ping
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqld is alive

[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=mysql.ping[*],mysqladmin -u$1 -p$2 ping 2>/dev/null| grep -c alive

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "mysql.ping[test,123456]"
1

[root@centos8 ~]# systemctl stop mysqld
[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "mysql.ping[test,123456]"
0

自定义模板

什么是模板

所谓模板,就是一些相关的监控项的集合,还可以在模板中包括图形,触发器等

为什么需要模板?

  • 为每个主机单独添加相同的一组监控项比较麻烦,例如:100台主机增加一个tcp80的监控项
  • 修改监控项比较麻烦,例如:100台服务器的监控项将80改成8080
  • 删除每个主机的同一组监控项,例如:100台服务器的监控项删除
  • 删除主机会连同主机的监控项一起被删除;不能复用监控项

所以可以使用模板的方式,来解决上述的一些问题

自定义模板使用流程

  • 创建模板,模板必须属于某个主机组(一般属于主机组Templates)
  • 在模板中创建监控项、图形、触发器
  • 创建需要监控的主机,然后关联对应的模板
  • 更改模板的监控项目,所以使用模板的都会自动更改
  • 导出模板,后期可以至其他系统继续使用

监控项的值映射 Value mapping

1
2
https://www.zabbix.com/documentation/6.0/zh/manual/config/items/mapping?hl=%E5%80%BC%E6%98%A0%E5%B0%84
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/mapping?hl=%E5%80%BC%E6%98%A0%E5%B0%84

什么是值映射

为了接收到的值能更“人性化”的显示,可以通过值映射方式,将数值与字符串之间进行关系绑定

示例:

http 响应码

‘200’ → ‘OK’

‘403’ → ‘Forbidden’

‘404’ → ‘Not Found’

创建值映射

Zabbix 6.0 配置

要定义一个值映射:

  • 打开主机或者模板配置表单
  • 前往 值映射 标签
  • 点击 增加 来增加一个新映射
  • 点击一个已存在的值映射名字来进行编辑

要定义值映射: 管理 — 一般 — 界面设置的从下拉列表中选择— 值映射

160
161

点击右上角的创建值映射

162
163

使用值映射

添加监控项时,在查看值处选中上面创建的值映射名称

164

查看结果

165
166

触发器 Triggers

触发器介绍

触发器是条件的定义,一个触发器是根据一个监控项的返回值,将之对比预先设置的阈值,当监控项返回了不符合预定义的值范围后,就进行触发下一步操作的警戒线,一般要对创建的监控项设置触发器以及触发方式和值的大小

可以在指定主机上创建触发器,只是针对指定主机有效

也可以在指定模板上创建触发器,则使用此模板的所有主机都有效,一个模板中可以有多触发器

触发器中使用的表达式是非常灵活的。你可以使用它们去创建关于监控统计的复杂逻辑测试。

触发器严重性

触发器严重性表示触发器的重要程度

Zabbix支持下列6种触发器的严重程度:

严重性 颜色
未分类 灰色
信息 浅蓝色
警告 黄色
一般严重 橙色
严重 浅红色
灾难 红色

严重性功能

  • 通过不同的颜色区分不同的严重程度
  • 报警音频,不同的音频代表不同的严重程度
  • 用户媒介,不同的用户媒介(通知渠道)代表不同的严重程度。例如,短信 - 高严重性,email - 其他。
  • 不同的严重性通过触发器执行对应的条件动作

触发器表达式格式

一个简单的表达式格式:

1
{<server|template>:<key>.<function>(<parameter>)}<operator><constant>

触发器官方文档

1
https://www.zabbix.com/documentation/5.0/zh/manual/config/triggers/expression

函数官方文档

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/triggers/functions
https://www.zabbix.com/documentation/5.0/manual/appendix/triggers/functions

触发器表达式常用函数

函数名称 说明 范例
avg() 监控项的平均值 avg(#5) → 最新5个值的平均值
avg(1h) → 最近一小时的平均值
avg(1h,1d) → 一天前的一小时内的平均值
min() 监控项的最小值 CPU使用率最近5分钟的最小值大于6
system.cpu.load.min(5m)>6
CPU最近5次最小的值大于2
system.cpu.load.min(#5)>2
max() 监控项的最大值 max(#5) → 最新5个值的最大值
max(1h) → 最近一小时的最大值
last() 最后的第几个值 注意last的 #num 参数和在其它函数中的作用不同
例如:返回值 3, 7, 2, 6, 9
last() 通常等同于 last(#1)
last(#5) - 第五个最新值 ,注意:不是五个最新值
last(#2)将返回值为7,last(#5)返回值为9
last(#10,30) 表示每隔30s采样一次,取倒数第10个值
diff() 比对上一次文件的内容 返回值为1,表示发生变化,返回值为0,表示没有变化
nodata() 监控一段时间内是否返回数据 时间不少于30秒,因为timer处理器每30秒调用一次
返回1 - 指定评估期没有接收到数据
返回0 - 其它

官方触发器示例

1
https://www.zabbix.com/documentation/5.0/zh/manual/config/triggers/expression
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#示例
www.zabbix.com 主机的处理器负载过高

{www.zabbix.com:system.cpu.load[all,avg1].last()}>5
'www.zabbix.com:system.cpu.load[all,avg1]' 给出了被监控参数的简短名称。它指定了服务器
是“www.zabbix.com”,监控项的键值是“system.cpu.load[all,avg1]”。通过使用函数“last()”获取
最新的值。最后,“>5”意味着当www.zabbix.com最新获取的处理器负载值大于5时触发器就会处于异常状态。

#示例
www.zabbix.com is overloaded

{www.zabbix.com:system.cpu.load[all,avg1].last()}>5 or
{www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
当前处理器负载大于5或者最近10分钟内最小值大于2,表达式为true

#示例
/etc/passwd文件被修改

使用函数diff:

{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff()}=1
当文件/etc/passwd的checksum值与最近的值不同时,表达式为true

类似的,表达式可以用于监控重要文件的修改, 如/etc/passwd, /etc/inetd.conf, /kernel等

#示例
有用户正在从互联网上下载一个大文件

使用min函数:

{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
在过去5分钟内,eth0上接收字节数大于100kb时,表达式为true

#示例
SMTP服务群集的两个节点都停止。 注意在一个表达式中使用两个不同的主机:

{smtp1.zabbix.com:net.tcp.service[smtp].last()}=0 and
{smtp2.zabbix.com:net.tcp.service[smtp].last()}=0
当SMTP服务器smtp1.zabbix.com和smtp2.zabbix.com都停止,表达式为true

#示例
Zabbix agent需要升级

使用str()函数:

{www.zabbix.com:agent.version.str("beta8")}=1
如果Zabbix agent版本是beta8(可能是1.0beta8),则表达式为真。

#示例
服务器无法访问

{www.zabbix.com:icmpping.count(30m,0)}>5
当主机“www.zabbix.com”在30分钟内超过5次不可达,则表达式为真。

#示例
3分钟内没有心跳检查

使用nodata()函数:

{www.zabbix.com:tick.nodata(3m)}=1
要使用这个触发器,'tick'必须定义成一个
Zabbix[:manual/config/items/itemtypes/trapper|trapper]]监控项。主机应该使用
zabbix_sender定期发送这个监控项的数据。

如果在180秒内没有接收到数据,则触发值变为异常状态。

注意:nodata可以在任何类型的监控项中使用。

#示例
夜间的CPU负载

使用time()函数:

{zabbix:system.cpu.load[all,avg1].min(5m)}>2 and
{zabbix:system.cpu.load[all,avg1].time()}>000000 and
{zabbix:system.cpu.load[all,avg1].time()}<060000
仅在夜间(00:00-06:00),触发器状态变可以变为真。

#示例
检查客户端本地时间是否与Zabbix服务器时间同步

使用fuzzytime()函数:

{MySQL_DB:system.localtime.fuzzytime(10)}=0
当MySQL_DB服务器的本地时间与Zabbix server之间的时间相差超过10秒,触发器将变为异常状态。

#示例
比较今天的平均负载和昨天同一时间的平均负载(使用第二个“时间偏移”参数)。

{server:system.cpu.load.avg(1h)}/{server:system.cpu.load.avg(1h,1d)}>2
如果最近一小时平均负载超过昨天相同小时负载的2倍,触发器将触发。

#示例
使用了另一个监控项的值来获得触发器的阈值:

{Template PfSense:hrStorageFree[{#SNMPVALUE}].last()}<{Template PfSense:hrStorageSize[{#SNMPVALUE}].last()}*0.1
如果剩余存储量下降到10%以下,触发器将触发。

#示例
使用评估结果获取超过阈值的触发器数量:

({server1:system.cpu.load[all,avg1].last()}>5) +
({server2:system.cpu.load[all,avg1].last()}>5) +
({server3:system.cpu.load[all,avg1].last()}>5)>=2
如果表达式中至少有两个触发器大于5,触发器将触发。

滞后

有时我们需要一个OK和问题状态之间的区间值,而不是一个简单的阈值。

例如,我们希望定义一个触发器,当机房温度超过20C时,触发器会出现异常,我们希望它保持在那种状态,直到温度下降到15C以下。

为了做到这一点,我们首先定义问题事件的触发器表达式。然后在事件成功迭代中选择‘恢复表达式’,并为OK事件输入恢复表达式。

注意,只有首先解决问题事件才会评估恢复表达式。如果问题条件仍然存在,则不能通过恢复表达式来解决问题。

示例 1

机房温度过高。

问题表达式:

1
{server:temp.last()}>20

恢复表达式:

1
{server:temp.last()}<=15

示例 2

磁盘剩余空间过低。

问题表达式: it is less than 10GB for last 5 minutes

1
{server:vfs.fs.size[/,free].max(5m)}<10G

恢复表达式: it is more than 40GB for last 10 minutes

1
{server:vfs.fs.size[/,free].min(10m)}>40G

开启 Zabbix Server的声音提示

167

自定义触发器

配置单条件触发器

自定义单条件触发器:设置内存低于 30% 进行告警,点击对应主机→ 创建触发器获取内存还剩余的百分比:

剩余 30% 可用,则需要告警通知;剩余 50% 可用,就算恢复;

编辑触发器表达式

1
2
3
4
5
6
7
8
#问题表达式: 
{Webserverb:mem_use_percent.last()}<30

#恢复表达式:
{Webserver:mem.use_percent.last()}>60

#测试内存
dd if=/dev/zero of=/dev/null bs=1000M count=1024

配置多条件触发器

自定义多条件触发器:设置空闲内存低于 30%并且swap使用大于1% 进行告警

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#增加swap的自定义监控项
UserParameter=swap_use,free |awk '/^Swap/{print $3*100/$2}'

#编辑触发器表达式
#问题表达式:
{Webserver:mem_unuse_percent.last()}<=30 and {Web:swap_use.last()}>=1

#恢复表达式:
{Webserver:mem_unuse_percent.last()}>=50

#使用命令压测
dd if=/dev/zero of=/dev/null bs=500M count=1024
#只满足内存低于30%,所以不会警告

dd if=/dev/zero of=/dev/null bs=1000M count=1024
#内存低于30%,并且swap使用超过1%

触发器依赖关系

什么是触发器依赖

有时候一台主机的可用性依赖于另一台主机。如果一台路由器宕机,则路由器后端的服务器将变得不可用。

如果这两者都设置了触发器,你可能会收到关于两个主机宕机的通知,然而只有路由器是真正故障的。

这就是主机之间某些依赖关系可能有用的地方,设置依赖关系的通知会被抑制,而只发送根本问题的通知。

触发器依赖关系示例

例如,主机位于路由器2后面,路由器2在路由器1后面。

1
Zabbix - 路由器1 - 路由器2 - 主机

如果路由器1宕机,显然主机和路由器2也不可达,然而我们不想收到主机、路由器1和路由器2都宕机的3条通知。

因此,在这种情况下我们定义了两个依赖关系:

1
2
'主机宕机' 触发器依赖于 '路由器2宕机' 触发器
'路由器2宕机' 触发器依赖于 '路由器1宕机' 触发器

触发器依赖案例

依赖场景环境说明

假设:充当R 路由节点,H 充当主机节点

  • 模拟当H节点的80端口如果不存活,需要检查R节点的80端口是否存活
  • 如果R路由节点的80端口存活,则触发H主机节点的80端口不存活警告
  • 如果R路由节点的80端口不存活,则仅触发路由节点的警告,而不触发主机节点的警告
定义触发器表达式

R路由节点:定义监控项,配置触发器

H主机节点:定义监控项,配置触发器

模拟路由与主机故障

模拟R路由器、H主机节点同时障时,会同时收到两个告警,显然不符合预期效果

配置触发器依赖关系

在H服务器节点上对应的触发器上配置依赖关系,依赖R路由节点对应的触发器

再次模拟路由与节点故障
  • 关闭 “路由器” 80端口,以及主机节点80端口;此时只有路由节点会警告
  • 启用 “路由器” 80端口,关闭主机节点80端口,此时只有主机节点会警告

图形 Graphs

什么是图形

随着时间的推移,Zabbix采集到大量监控数据,对于用户而言,如果可以通过可视化图形方式查看历史数据,而不仅仅是看到当前数字,那会更容易了解发生了什么事情以及发展的趋势.

自定义图形

Zabbix 本身提供了一些图形,但用户也可以自定义图形

自定义图表,顾名思义,就是提供自定义定制的功能。

自定义图表需要人为配置,可以为某台主机、多台主机、某个模板创建自定义图表。

案例

在模板中创建图形

168

创建图形

169
170

选中所有监控项

171
172
173
174

模板关联至主机

175

查看图形

176

过滤图形只显示自定义的图形

177
178
179
180

聚合图形 Screens

Zabbix中一个图形只是包括相关监控项的一张图

如果想在一个界面里显示包含多组监控项的多个图形可以使用聚合图形

默认Zabbix 中已有的聚合图形如下

181

用户也可以自定义聚合图形

创建聚合图形

方法1

如果想将多个主机或不同模板的相关图形放在同一个聚合图形中,则执行下面执行操作

监测–聚合图形–创建聚合图形,此方式比更灵活

182

183
184

方法2

如果想将同一个主机的多个监控项图形放在一个聚合图形,则执行下面操作

配置–模板–在指定的模板–聚合图形,此方式比较有局限性

185

创建聚合图形

186

指定名称和图形的个数

187

添加监控项相关的图形

选择构造函数

188
189

添加多个图形到此聚合图形中

190

查看聚合图形

监测–模板关联的主机–聚合图形

191

右上角选中创建的聚合图形

192
193
194
195
196
197
198
199
200
201
202
203
204
205

创建多个聚合图形

复重上面过程,创建多个聚合图形

206
207

利用多个聚合图形实现幻灯片功能(轮播图)

创建幻灯片 Slide shows

监测–聚合图形 –Zabbix 5.0 版在左上角的幻灯片演示

208
209

Zabbix 4.0 版在右上角

210

添加聚合图形

5.0 版本界面

211
212
213

4.0版本界面

214
215
216
217

验证幻灯片

Zabbix 5.0版本如下

218

选择上面创建的幻灯片名称

219

可以观察到每隔3s就会轮播各个聚合图形

220

Zabbix 4.0版本如下

221
222

用户 Users 和组 Groups 管理

用户管理

系统默认有Admin和guest两个用户,其中guest,密码为空,默认被禁用

创建新用户

管理 — 用户

创建新用户,指定群组

223
224
225
226

组管理

管理 — 用户组群

227
228
229

告警通知

生产环境中,通常当达到一定的指标,比如硬盘使用率为80%左右时,会触发触发器的条件,而触发器可以再触发动作,实现事件通知告警或执行指定命令等.要实现事件通知告警,就需要一个中间介质来发送告警消息给运维

Zabbix 有如下常见报警介质:

  • E-mail
  • 微信
  • 短信

邮件告警

邮箱开启 SMTP 功能

在邮箱上开启SMTP功能,利用此邮箱实现发送报警邮件

QQ邮箱开启邮件通知功能

230
231

获取授权码

232

网易邮箱开启邮件通知功能

233
234
235

创建报警媒介类型实现发信人功能

报警媒介类型是一种给运维工程师发送消息通知的渠道,即当zabbix的触发器触发一个事件后,怎么才能把这个事件通过某些方式通知给运维工程师呢? 媒介类型就起到此作用,如果想要实现邮件告警功能,那么对应的媒介类型就是配置用来发送告警邮件的发件人邮箱。

管理–>报警媒介类型–>创建报警媒介类型

236

结合上一小节邮箱的配置输入以下内容

QQ 邮箱配置

237

添加消息模板用于发送信息

238

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#可以修改两个消息模板
# 问题
主题: 告警: {EVENT.NAME}
告警主机:{HOST.NAME1}
告警服务: {ITEM.NAME1}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}

# 恢复 Problem Recovery
主题: 恢复: {EVENT.DURATION}: {EVENT.NAME}
恢复主机:{HOST.NAME1}
恢复服务: {ITEM.NAME1}
恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}

创建完成,可以看到下面信息

239

测试是否邮件正常,有时QQ邮箱不成功,可以尝试其它邮箱,如163邮箱

240

成功可以收下邮件和提示

241

zabbix4.0版本界面如下:

242
243

网易邮箱配置

244

Zabbix 4.0 界面

245

246

给指定用户添加报警媒介实现收件人功能

媒介类型创建好之后,还需要在每个zabbix账户里面添加相应的收件配置,比如邮件类型的媒介类型要给zabbix账户添加邮箱,如果是微信类型的媒介类型那么就要在zabbix账户设置微信号,短信类型的媒介类型那就得给zabbix账户设置手机号用于接收报警消息内容。

在zabbix用户中添加报警媒介时,需要指定告警信息的收件人的邮件地址

247
248
249

zabbix 4.0 界面如下

250
251
252

注意:下面图中一定要点击“更新”才能生效

253

创建和配置动作

动作可以实现当触发器被触发后可以执行哪些操作,一般可以是发送告警或执行命令

关于宏,即一些在Zabbix 中可以调用的变量

宏分为三种

  • 系统内置的宏变量: {MACRO}
  • 用户自定义的宏变量: {$MACRO}
  • 低级别自动发现宏变量: {#MACRO}
创建动作

指定动作即条件为事件的严重度为信息时就触发动作

254

Zabbix 4.0 界面如下

255

配置操作

官方宏参考:

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/macros/supported_by_location
https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location

范例: 操作和恢复操作的定制消息主题和和内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#操作主题
故障:{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}
故障持续时间:{EVENT.AGE}
恢复时间:{EVENT.RECOVERY.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

故障邮件内容

256

恢复邮件内容

257

范例: 配置操作

操作内容

1
2
默认标题:业务报警 {EVENT.NAME}
消息内容:业务报警服务器:{HOST.NAME},IP:{HOST.IP},详情:{ITEM.NAME}:{ITEM.VALUE}

步骤设为0时,表示会不停的持续发送警报,一般建议1到3表示执行三次。

步骤持续时间表示如果有后续步骤执行时的间隔时长,默认为0表示使用默认时间1h后才会执行后续步骤,此值最低不能低于60s,最大不能超过604800s,可以设为1到5m(分钟)比较合适

258

zabbix 4.0 界面如下

259
260

配置故障恢复信息

恢复操作内容

1
2
默认标题:业务恢复
信息内容:业务恢复服务器:{HOST.NAME},IP:{HOSTNAME1},详情:{ITEM.NAME}:{ITEM.VALUE}

261
262

zabbix4.0 版本如下界面

263
264
265
266
267

模拟故障验证邮件通知

利用之前创建的触发器实现邮件通知

停止nginx服务,触发邮件报警

1
[root@centos8 ~]# systemctl stop nginx

268
269

恢复nginx服务也会触发邮件报警

1
[root@centos8 ~]# systemctl start nginx

270
271

在报表中可以看到动作日志如下面信息

272

zabbix 4.0 界面如下

273
274
275
276

分级告警

当出现报警后,一般会根据组织的重要级别,按时间逐级分层向上报警,如下面常见分层报警

1
初级运维/指定运维组--高级运维工程师/业务运维-—->架构师--->总监/CTO

要实现分级告警,必须确保有多个用户,并分别指定不同的邮箱

配置Admin用户的邮箱

277
278

另一个用户wang使用不同的邮箱

279
280
281

Zabbix4.0版本界面如下

282
283
284
285

配置操作指定不同的步骤发邮件给不同的用户

在原来操作基础上添加新的操作

286

添加操作,发送消息给上级领导的邮箱

287

1
2
3
4
5
6
7
8
9
10
{ESC.HISTORY} 宏放在在自定义消息里
该宏将包含关于此升级之前执行的所有步骤的信息,例如:发送的通知和执行的命令。
自定义消息如下示例:
主题:Problem:{EVENT.NAME}
告警主机:{HOST.NAME1}
告警服务: {ITEM.NAME1}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}
此前步骤:{ESC.HISTORY}

288

确认动作更新

289

Zabbix4.0版本如下界面

290
291

模拟故障测试验证分级告警

停止 nginx 服务,查看结果

1
[root@centos8 ~]# systemctl stop nginx

292
293

Admin收到三封告警邮件

294

wang用户邮件也是三封告警邮件

295
296

调整操作的持续时间如下,第一个操作为2m,第二个操作为3m

297

最终可以看到邮件发送的时间间隔如下

298

邮件告警方法2

也可以利用脚本方式进行邮件告警

安装邮件相关软件和配置邮件

范例: 利用 sendemail 工具实现邮件脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[root@zabbix-server ~]# cat /usr/lib/zabbix/alertscripts/mail.sh
#!/bin/bash

email_send='29308620@qq.com'
email_passwd='dgezyimkdswwbhea'
email_smtp_server='smtp.qq.com'
. /etc/os-release
msg_error() {
echo -e "\033[1;31m$1\033[0m"
}
msg_info() {
echo -e "\033[1;32m$1\033[0m"
}
msg_warn() {
echo -e "\033[1;33m$1\033[0m"
}
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}

install_sendemail () {
if [[ $ID =~ rhel|centos|rocky ]];then
rpm -q sendemail &> /dev/null || yum install -y sendemail
elif [ $ID = 'ubuntu' ];then
dpkg -l |grep -q sendemail || { apt update; apt install -y libio-socket-ssl-perl libnet-ssleay-perl sendemail ; }
else
color "不支持此操作系统,退出!" 1
exit
fi
}

send_email () {
local email_receive="$1"
local email_subject="$2"
local email_message="$3"
sendemail -f $email_send -t $email_receive -u $email_subject -m $email_message -s $email_smtp_server -o message-charset=utf-8 -o tls=yes -xu $email_send -xp $email_passwd
[ $? -eq 0 ] && color "邮件发送成功!" 0 || color "邮件发送失败!" 1
}

if [ $# -ne 3 ];then
color "脚本参数不正确!" 1
msg_info "Usage: `basename $0` <mail_address> <subject> <message>"
exit 1
fi

install_sendemail
send_email "$1" "$2" "$3"

[root@zabbix-server ~]# chmod +x /usr/lib/zabbix/alertscripts/mail.sh

范例: 利用 mutt工具实现邮件发送

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#Ubuntu18.04系统的配置邮件信息
[root@zabbix-server ~]# apt -y install mutt msmtp

[root@zabbix-server ~]# getent passwd zabbix
zabbix:x:112:116::/var/lib/zabbix/:/usr/sbin/nologin

[root@zabbix-server ~]# mkdir /var/lib/zabbix
[root@zabbix-server ~]# vim /var/lib/zabbix/.msmtprc
account default
host smtp.163.com
from lbtooth@163.com
auth plain
user lbtooth@163.com
password QXFIOQXEJNSVSDMW
logfile ~/.msmtp.log

[root@zabbix-server ~]# chmod 600 /var/lib/zabbix/.msmtprc
[root@zabbix-server ~]# touch /var/lib/zabbix/.msmtp.log
[root@zabbix-server ~]# chown -R zabbix.zabbix /var/lib/zabbix
[root@zabbix-server ~]# vim /etc/Muttrc
source /usr/lib/mutt/source-muttrc.d|
#文件最后添加下面行
set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="lbtooth"
set from=lbtooth@163.com
set envelope_from=yes

#邮件发送邮件的脚本
[root@zabbix-server ~]# cat /usr/lib/zabbix/alertscripts/mail.sh
#!/bin/bash
SENDTO=$1
SUBJECT=$2
MAIL=$3

echo "$MAIL" | mutt -s "$SUBJECT" $SENDTO

[root@zabbix-server ~]# chmod +x /usr/lib/zabbix/alertscripts/mail.sh
创建邮件报警媒介类型

脚本参数如下:

1
2
3
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

299

将报警媒介关联用户

300
301

创建动作和操作

302
303
304

验证邮件告警

测试故障

1
[root@centos8 ~]# systemctl stop nginx

305

测试故障恢复

1
[root@centos8 ~]# systemctl start nginx

306

微信告警

注册企业微信

微信告警首先得注册一个企业微信,然后才能实现微信告警。

浏览器访问下面链接,注册企业微信

1
https://work.weixin.qq.com/

307
308
309

用浏览器进入管理后台

310

或者安装企业微信的PC端登录

311

创建部门和人员

创建部门

312

加入人员

方法1: 直接微信邀请,让相关人员自行扫码加入

313
314

方法2 手动添加人员

315
316

将微信应用中添加相关的部门或人员

317

也可以只加特定用户

318

将个人微信关联企业微信插件

可以使用手机号或邮箱邀请对应的员工加入此企业微信组织,之后员工用自已的微信扫下面的二维码就

可用微信接收企业微信的消息

下面界面扫二维码可以将个人微信关联企业微信

319

如果前面还没同意加入企业,则个人微信扫码后,看到下面图示

320

输入相关信息,进行验证才能加入企业微信

321

输入相关信息,进行验证才能加入企业微信

322

下一步会发信邮件或短信进行验证

324

输入上面收到的验证码

325

验证成功后可以在个人微信中看到下面提示

327

创建微信应用并授权可信IP

328

上传Logo和指定应用名称,并选择范围

329

注意记下以下信息:

1
2
应用的 AgentId值1000003
应用的 Secret的值ga621_Y3iMMDW61gm-2iUmTia6RayBbH4gTH0CrJyD8

330

1
查看到企业ID的值为 ww644a0d95807e476b

331

在应用中添加 企业可信IP (最近添加的功能,必须配置IP白名单才能发微信,否则会出错)

332

测试发送微信消息

可以给加入的员工发送微信消息

333
334
335

员工个人微信可以收到以下信息

336

企业微信也可以收到信息

337

338

测试API

访问企业微信接口调试工具,输入corpid和和corpsecret 可以测试请求参数是否正确

访问下面地址

1
2
https://open.work.weixin.qq.com/wwopen/devtool/interface/combine
https://work.weixin.qq.com/api/devtools/devtool.php

339

创建发送微信脚本

官方微信教程

1
https://work.weixin.qq.com/api/doc/90000/90003/90487

340

官方微信API参考文档

1
https://work.weixin.qq.com/api/doc/90000/90135/91039

341

发送微信可以使用各种语言,下面使用shell脚本实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#查看zabbix server的配置文件
[root@zabbix-server ~]# grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
### Option: AlertScriptsPath
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts

#实现发信微信的脚本
[root@zabbix-server alertscripts]# pwd
/usr/lib/zabbix/alertscripts
[root@zabbix-server alertscripts]# cat wechat.sh
#!/bin/bash
CorpID="ww644a0d95807e476b" #我的企业下面的CorpID
Secret="cGp4gHUpHLL1KQZY5abM3panGp-uCrEZyrgDvOT0OZA" #创建的应用那里的Secret
agentid=1000003 #改为 AgentId 在创建的应用可以查看
#PartyID=1 #通讯录中的部门ID,可选项
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 userid=$1 #脚本的第1个参数为接收微信的企业用户帐号,在通讯录中可以查看
#local partyid=$PartyID
local subject=$2 #脚本的第2个参数,表示消息主题
local msg=$(echo "$@" | cut -d" " -f3-) #脚本的第3个参数,表示消息正文
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": "'"$subject\n\n$msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
/usr/bin/curl --data-ascii "$(body $*)" $PURL

#添加执行权限
[root@zabbix-server alertscripts]# chmod +x wechat.sh

#发送测试微信,其中wangxiaochun为企业微信的帐号,并且不区分大小写,在通讯录的用户成员详情中可以看到帐号
[root@zabbix-server alertscripts]# ./wechat.sh wangxiaochun 微信告警测试标题 告警测试信息

342

在手机企业微信APP中可以收到下面提示

343

创建微信报警媒介类型

344

报警媒介类型为脚本,脚本参数为以下三项

1
2
3
{ALERT.SENDTO}--收件人媒介
{ALERT.SUBJECT}--通知主题,因为微信没有主题,此项无效,可以不填写
{ALERT.MESSAGE}--通知内容

官方宏参考:

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/macros/supported_by_location
https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location

345

注意: 此处可以只填写 {ALERT.SENDTO} 和 {ALERT.MESSAGE} 即可

346
347

修改 Message Templates

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#可以添加两个消息类型
# 问题
主题: 告警: {EVENT.NAME}
告警主机:{HOST.NAME1}
告警服务: {ITEM.NAME1}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}

# 恢复 Problem Recovery
主题: 恢复: {EVENT.DURATION}: {EVENT.NAME}
恢复主机:{HOST.NAME1}
恢复服务: {ITEM.NAME1}
恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}

348

测试发微信消息

349

发送成功可以看到下面提示信息

350

可以在个人微信收到下面信息

351

zabbix4.0版本界面如下

352
353

给Zabbix用户添加报警媒介

对现在用户Admin编辑

354

添加微信报警媒介

注意: 此处的收件人是一个微信帐号,但实际上发送给应用的可见范围的所有用户

355

zabbix4.0版本界面如下

356
357
358

创建动作

编辑已有动作

如果已经创建动作,可以修改已有动作,如下所

359
360
361
362

创建动作

如果之前没有动作,新创建动作,以下为Zabbix4.0的操作界面

363
364
365
366
367
368

测试微信报警

1
2
#模拟故障
[root@centos8 ~]# systemctl stop nginx

369

同时个人微信可以看到下面提示

370

恢复服务后

1
[root@centos8 ~]# systemctl start nginx

个人微信可以收到下面的提示

371

以下为Zabbix4.0版本的界面提示

372

在手机企业微信APP中可以收到下面提示

373

1
2
#模拟故障恢复,观察微信是否收到恢复消息
[root@centos8 ~]# systemctl start nginx

在手机企业微信APP中可以收到下面提示

374

短信告警

确定短信服务商和短信服务相关信息

确定短信服务商

先确定一家短信服务平台,比如:阿里大于,腾讯云等

1
2
3
https://www.aliyun.com/product/sms
https://cloud.tencent.com/act/pro/csms
https://www.yunpian.com/

注意:一般的短信平台会需要注册用户帐号后实名认证,可能还会要求提交企业营业执照,个人身份证,网站备案信息等信息

以阿里云为例

1
2
#服务文档
https://help.aliyun.com/document_detail/59210.html?spm=a2c4g.11174283.2.21.6b394c07W3s6kB

短信服务流程

375

购买短信服务

到注册阿里云并且购买短信服务https://www.aliyun.com/product/sms

376

创建 AccessKey

可以使用AccessKey构造一个API请求(或者使用云服务SDK)来操作资源。AccessKey包括AccessKey ID和AccessKey Secret。

  • AccessKey ID用于标识用户。
  • AccessKey Secret是用来验证用户的密钥。AccessKey Secret必须保密

在阿里云基于安全目的,建议先创建RAM帐号(子帐号),生成AccessKey

操作步骤

  1. 使用云账号登录RAM控制台: https://ram.console.aliyun.com/overview
  2. 在左侧导航栏的人员管理菜单下,单击用户。
  3. 在用户登录名称/显示名称列表下,单击目标RAM用户名称
  4. 在用户AccessKey区域下,单击创建AccessKey

创建用户及相关的AccessKey

377

对生成的RAM用户进行授权

378
379

创建短信签名
1
https://help.aliyun.com/document_detail/108072.html?spm=a2c4g.11186623.2.20.245e4be5IFMXEF

注意:签名名称要和网站或公司名称相同,否则可能不能通过审核

380
381
382

创建短信模板
1
https://help.aliyun.com/document_detail/108086.html?spm=a2c4g.11186623.6.574.3ca821f24wFBe7

创建两个模板:故障通知和恢复通知模板

注意:阿里云模板中的变量有较高的要求,比如一个变量不能存超过25个字节的内容等

创建故障通知模

383

创建恢复通知模板

384

385

创建发送短信脚本

参考帮助实现短信脚本

1
https://help.aliyun.com/document_detail/112147.html?spm=a2c4g.11186623.6.672.2f7a5d1cf0jhs1

386

短信SDK

1
https://help.aliyun.com/document_detail/55359.html?spm=a2c4g.11186623.2.26.464e57cfuNqIcX

387

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#CentOS8
[root@zabbix-server ~]# yum -y install python3

#ubuntu18.04
[root@zabbix-server ~]# apt -y install python3 python3-pip

#安装相关库
[root@zabbix-server ~]# pip3 install --upgrade pip
[root@zabbix-server ~]# pip3 install aliyun-python-sdk-core-v3
[root@zabbix-server ~]# cd /usr/lib/zabbix/alertscripts
[root@zabbix-server alertscripts]# cat send_sms.py
#!/usr/bin/env python3
#coding=utf-8
import sys
import const
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
client = AcsClient(const.ACCESS_KEY_ID, const.ACCESS_KEY_SECRET, 'ap-northeast-1')

request = CommonRequest()
request.set_accept_format('json')
request.set_domain('dysmsapi.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https') # https | http
request.set_version('2017-05-25')
request.set_action_name('SendSms')

phone_number = sys.argv[1]
templatecode = sys.argv[2]
string = sys.argv[3]

message = string.split(";")
print(message)

#用分号将第三个短信参数分隔为多个字符串
message = string.split(";")
print(message)

sms_dict = { }
#分号分隔的第1个字符串为时间
sms_dict['time'] = message[0][0:24]
#分号分隔的第2个字符串为告警内容
sms_dict['item'] = message[1][0:24]
#分号分隔的第3个字符串为事件ID
sms_dict['item_id'] = message[2][0:24]

request.add_query_param('PhoneNumbers', phone_number)
request.add_query_param('SignName', "IT技术分享")
request.add_query_param('TemplateCode', templatecode)
request.add_query_param('TemplateParam', sms_dict)

response = client.do_action(request)
print(str(response, encoding = 'utf-8'))

[root@zabbix-server alertscripts]# chmod +x send_sms.py

#将AccessKey存放在独立文件中,比较安全
[root@zabbix-server alertscripts]# cat const.py
ACCESS_KEY_ID = 'xxxxxxxxxxxxxxxxx'
ACCESS_KEY_SECRET ='yyyyyyyyyyyyyyyyyy'
[root@zabbix-server alertscripts]# chmod 600 const.py
[root@zabbix-server alertscripts]# chown zabbix.zabbix const.py

#测试执行脚本实现故障通知告警,第一个参数是手机号,第二个参数是模板code,第三个参数是短信内容
[root@zabbix-server alertscripts]# ./send_sms.py 18600123456 SMS_220620057
'test'
['test']
{"RequestId":"A9A1F98C-6F99-42F0-A688-78480DD845C0","Message":"OK","BizId":"172222827010849369^0","Code":"OK"}

#测试执行脚本实现恢复通知告警
[root@zabbix-server alertscripts]# ./send_sms.py 18600123456 SMS_220620137
'test'
['test']
{"RequestId":"29D0783B-CCCA-4E9B-87E3-76FC76EC6480","Message":"OK","BizId":"768401427010885196^0","Code":"OK"}

388
389

创建短信媒介类型

390

脚本参数为以下两项

1
2
3
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

391

给Zabbix用户添加报警媒介

392
393
394

配置动作

创建新动作或修改原有动作

395

配置动作对应的触发条件如下

396

创建异常操作

示例1:加一个字段

1
{ITEM.NAME}

397

示例2:加多个字段

1
{EVENT.DATE} {EVENT.TIME};{TRIGGER.NAME};{EVENT.ID}

398
399

创建恢复操作

401

多字段

1
{EVENT.DATE} {EVENT.TIME};{TRIGGER.NAME};{EVENT.ID}

402
403

总体配置如下

405

测试短信报警

停止服务 模拟故障

1
[root@centos8 ~]# systemctl stop nginx

406

查看到手机收到短信

407

启动服务 模拟恢复故障

1
[root@centos8 ~]# systemctl start nginx

408

查看到手机收到短信

409

查看zabbix Serve服务器日志,可以看到下面信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#注意需要修改日志级别才会看到下面日志
[root@zabbix-server ~]# grep ^DebugLevel /etc/zabbix/zabbix_server.conf
DebugLevel=4

[root@zabbix-server ~]# grep -A 3 sms /var/log/zabbix/zabbix_server.log
--
1818:20210723:120953.133 /usr/lib/zabbix/alertscripts/send_sms.py
'18600123680' 'SMS_220620057' 'Nginx: Number of processes running' output:
['Nginx: Number of processes running']
{"RequestId":"267B0BA1-0C87-4CED-8D45-
3FE03B1F6398","Message":"OK","BizId":"481300427013392932^0","Code":"OK"}
--
1817:20210723:121248.947 In zbx_popen()
command:'/usr/lib/zabbix/alertscripts/send_sms.py '18600123680' 'SMS_220620137'
'Nginx: Number of processes running''
1817:20210723:121248.947 End of zbx_popen():10
1828:20210723:121248.947 End of zbx_ipc_socket_read():SUCCEED
1828:20210723:121248.947 End of am_db_flush_results() flushed:0

实现故障自愈功能

当zabbix服务监控到指定的监控项异常时,可以通过指定的操作使故障自动恢复

以nginx服务为例,当nginx服务停止时,自动重启服务,实现故障自愈功能

410

Zabbix Agent 开启远程命令功能

配置远程命令的操作类似于发送消息,区别在于一个执行命令,一个发送消息

远程命令可以直接在ZabbixServer, ZabbixProxy和ZabbixAgent上执行。

但在Zabbix agent和Zabbix proxy上,远程命令默认是不开启的,它们可以通过以下方式启用:

1
2
在agent配置中添加AllowKey=system.run[*]、UnsafeUserParameters=1参数
在proxy配置中,将enableremotecommands参数设置为1

范例: 在故障自愈的客户端主机开启 Zabbix Agent 远程命令功能

1
2
3
4
5
6
7
8
9
10
11
12
#编译安装路径
[root@centos8 ~]# vim /apps/zabbix_agent/etc/zabbix_agentd.conf

#包安装路径
[root@centos8 ~]# vim /etc/zabbix/zabbix_agentd.conf
AllowKey=system.run[*] #此项适合zabbix5.0版本以上,用于代替早期版本的中EnableRemoteCommands,agent2默认没有,需手工加入
#EnableRemoteCommands=1 #开启远程执行命令,此指令在zabbix5.0版本以上淘汰
AllowRoot=1 #开启此项,直接使用root进行远程管理,而无须对zabbix用户授权sudo权限

UnsafeUserParameters=1 #允许远程执行命令的时候使用不安全的参数(特殊字符串,如: \ ' * ? [] {} ~ $ ! & ; ( ) < > 等 )

[root@centos8 ~]# systemctl restart zabbix-agent.service

Zabbix Agent 对 Zabbix 用户授权管理权限

默认zabbix agent是使用zabbix用户启动的,有些特权命令zabbix用户是没有权限执行,会导致定义好的自治愈策略因为权限拒绝为执行失败,所以需要事先对zabbix用户进行授权.

范例: 在 zabbix 用户进行 sudo 授权

1
2
3
4
5
6
7
8
[root@centos8 ~]# vim /etc/sudoers
zabbix ALL=(ALL) NOPASSWD: ALL

#检查语法
[root@centos8 ~]# visudo -c

#测试是否成功
[root@ubuntu2004 ~]# su -s /bin/bash zabbix -c "sudo systemctl restart mysql"

查看内置的模板及相关触发器

411
412

使用内置的版本关联需要监控的主机

使用内置模板 Template App Nginx by HTTP

413

创建动作

414

添加动作的条件,用于指定动作关联的条件,即只有特定的触发器发生才会执行动作

415

选中Nginx Service is down 的触发器

416
417

步骤为1和1表示只执行一次

步骤持续时间表示如果有多个步骤执行时的时间间隔,0表示使用默认步骤持续时间间隔

418
419

动作创建完成

420

停止监控主机的服务测试自愈功能

停止nginx服务

1
[root@centos8 ~]# systemctl stop nginx

在监测页面可以看到动作执行

421
422

1
2
3
4
5
6
7
8
9
#可以看到nginx服务被重新启动
[root@centos8 ~]# systemctl is-active nginx
active

#可以看到Zabbix Agent日志中提示执行命令,注意需要打开DebugLevel=4 才能看到下面信息
[root@centos8 ~]# cat /var/log/zabbix/zabbix_agentd.log
32381:20210713:003002.019 zbx_setproctitle() title:'listener #2 [processing request]'
32381:20210713:003002.019 Requested [system.run[sudo systemctl restart nginx,nowait]]
32381:20210713:003002.019 Executing command 'sudo systemctl restart nginx'

Zabbix 主动与被动模式

Zabbix 有两种工作模式: 主动和被动模式

无论是模式还是被动模式,都是站在zabbix agent 角度来说的工作模式

Zabbix 的主动和被动模式工作原理

423

Zabbix 监控流程中 Agent 收集数据分为主动和被动两种模式

主动模式和被动模式都是相对 zabbix agent而言的

Zabbix默认是被动模式,如果有100个监控项,被动模式需要 Zabbix Server找 Zabbix Agent要100次

主动模式是Zabbix Server给 Zabbix Agent发送一个包括100个监控项的任务清单,Zabbix Agent根据任务清单,采集好100个监控项的值,主动汇报给 Zabbix Server这100个监控项,Zabbix Agent主动模式只需要发送一次数据,大大提高了传输效率。

  • 被动模式: Server 向 Agent 请求获取监控项的数据,Agent返回数据。此为默认模式,如果有100个监控项,则需要100次交互
  • 主动模式: Agent 请求 Server 获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy,如有100个监控项,只需要1次交互即可

注意: 两种模式可以在Zabbix Server上同时存在,可以将一部分监控项设为主动,其它设为被动模式

被动监测通信过程如下:

1
2
3
4
5
6
Server打开一个TCP连接
Server发送请求agent.ping
Agent接收到请求并且响应<HEADER><DATALEN>
Server处理接收到的数据
关闭TCP连接
被动模式每获取一个监控项都需要打开一个tcp连接,这样当监控项越来越多时,Zabbix Server会打开很多端口,就会出现server端性能瓶颈问题。

主动模式监测通信过程如下:

1
2
3
zabbix agent 首先向ServerActive配置的IP请求获取active items,获取并提交active items数据值给server或者proxy。
zabbix多久获取一次active items?
它会根据agent的配置文件中的RefreshActiveChecks的频率进行,如果获取失败,那么将会在60秒之后重试。

主动模式的流程分两个部分:

  • 获取ACTIVE ITEMS列表
1
2
3
4
5
6
Agent主动打开一个TCP连接(主动检测变成Agent打开)
Agent请求items检测列表
Server返回items列表
Agent 处理响应
关闭TCP连接
Agent开始收集数据
  • 主动检测提交数据过程
1
2
3
4
Agent建立TCP连接
Agent批量提交items列表收集的所有监控项数据
Server处理数据,并返回响应状态
关闭TCP连接

被动模式

被动模式是指 zabbix agent 被动的接受zabbix server(或者Zabbix Proxy)周期性发送过来的数据收集指令

此为默认的工作方式。

在被动模式之下,zabbix server会根据主机关联的模板中的监控项和数据采集间隔时间,周期性的打开随机端口并向zabbix agent服务器的10050端口发起tcp连接,然后发送获取监控项数据的指令,即zabbix server发送什么指令那么zabbix agent就收集什么数据,zabbix server什么时候发送指令,zabbix agent就什么时候采集,zabbix server不发送指令,zabbix agent就一直不响应,所以zabbix agent也不用关心其监控项和数据采集周期间隔时间。

被动模式的优点就是配置简单,安装后即可使用,因此也成为zabbix的默认工作模式,但是被动模式的最大问题就是会加大zabbix server的负载,在数百甚至数千台服务器的环境下会导致zabbix server需要轮训向每个zabbix agent发送数据采集指令,如果zabbix server负载过高还会导致不能及时获取到最 新数据

被动模式因为性能的原因,一台 Zabbix Server 一般只能监控500台以下的主机,更多的主机建议使用主动模式

Zabbix Server 通过Poller进程实现被动模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@zabbix-server ~]# grep StartPollers /etc/zabbix/zabbix_server.conf 
#此数量可以适当进行调整
# StartPollers=5

[root@zabbix-server ~]# ps ax|grep poller
48 ? I< 0:00 [edac-poller]
1115 ? S 0:03 /usr/sbin/zabbix_server: http poller #1 [got 0 values in 0.000622 sec, idle 5 sec]
1246 ? S 0:01 /usr/sbin/zabbix_server: proxy poller #1 [exchanged data with 0 proxies in 0.000036 sec, idle 5 sec]
1249 ? S 0:19 /usr/sbin/zabbix_server: poller #1 [got 0 values in 0.000020 sec, idle 1 sec]
1250 ? S 0:19 /usr/sbin/zabbix_server: poller #2 [got 1 values in 0.003333 sec, idle 1 sec]
1251 ? S 0:19 /usr/sbin/zabbix_server: poller #3 [got 1 values in 0.001767 sec, idle 1 sec]
1252 ? S 0:19 /usr/sbin/zabbix_server: poller #4 [got 3 values in 0.002736 sec, idle 1 sec]
1253 ? S 0:19 /usr/sbin/zabbix_server: poller #5 [got 0 values in 0.000043 sec, idle 1 sec]
1255 ? S 0:02 /usr/sbin/zabbix_server: unreachable poller #1 [got 0 values in 0.000048 sec, idle 5 sec]
24305 pts/2 S+ 0:00 grep --color=auto poller

范例: 查看被动模式下 Zabbix agent 进程和端口打开情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[root@centos8 ~]# grep StartAgents /etc/zabbix/zabbix_agentd.conf 
# StartAgents=3 #被动模式的进程数量,默认为3个,可以适当修改

[root@centos8 ~]# ps ax|grep zabbix
1793 ? S 0:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
1794 ? S 2:44 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
1795 ? S 0:12 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
1796 ? S 0:12 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
1797 ? S 0:12 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
1798 ? S 0:10 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
21213 pts/1 S+ 0:00 vim /etc/zabbix/zabbix_agentd.conf
24150 pts/0 S+ 0:00 grep --color=auto zabbix

[root@centos8 ~]# ss -nta|grep 10050
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48786
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48790
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48866
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48884
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48860
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48848
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48846
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48826
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48774
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48808
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48836
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48824
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48772
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48840
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48820
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48886
........

#被动模式下agent主机的日志中会提示以下错误
[root@centos8 ~]# tail /var/log/zabbix/zabbix_agentd.log
1414:20200830:180435.723 TLS support: YES
1414:20200830:180435.723 **************************
1414:20200830:180435.723 using configuration file:
/etc/zabbix/zabbix_agentd.conf
1414:20200830:180435.724 agent #0 started [main process]
1415:20200830:180435.724 agent #1 started [collector]
1416:20200830:180435.725 agent #2 started [listener #1]
1419:20200830:180435.725 agent #4 started [listener #3]
1420:20200830:180435.726 agent #5 started [active checks #1]
1418:20200830:180435.726 agent #3 started [listener #2]
1420:20200830:180435.727 active check configuration update from
[127.0.0.1:10051] started to fail (cannot connect to [[127.0.0.1]:10051]: [111]
Connection refused)

主动模式

主动模式介绍

主动模式是由每个zabbix agent 打开本机的随机端口, 主动向 Zabbix Server (或者Zabbix Proxy)的10051端口发起tcp连接请求

主动模式下必须在zabbix agent配置文件中指定zabbix server的IP或者主机名(必须可以被解析为IP地址),在连接到zabbix server之前zabbix agent是不知道自己要采集那些数据以及间隔多久采集一次数据的,然后在连接到zabbix server以后获取到自己的监控项和数据采集间隔周期时间,然后再根据监控项采集数据并返回给zabbix server,在主动模式下不再需要zabbix serve向zabbix agent发起连接请求,因此主动模式在一定程度上可减轻zabbix server打开的本地随机端口和进程数,在一定程度就减轻了zabbix server的压力。经过优化后可以轻松监控2000台,甚至5000以上的主机

以下场景下生产推荐使用主动模式

  • Zabbix Server 出现性能瓶颈, 监控队列出现大量延迟的监控项,告警不及时
  • 监控主机超过 500 台以上

Zabbix Agent 实现主动模式

注意: 下面使用Agent实现测试, 方便查看并行效果,使用Agent2看不到并行采集效果

在Zabbix Agent 实现主动模式流程

  • 在 Zabbix Agent 配置主机模式相关配置
  • 在 Zabbix Server 创建配置有主动模式监控项的模板
  • 关联主动模板至支持主动模式的 Agent 主机

注意: 基于原被动模板克隆生成的主动模式模板,不是所有监控项都能改为主动模式,比如agent.ping 监控项如果改为主动模式, ZBX 提示将无法变绿

在 Zabbix Agent 配置主动模式

Zabbix Server 主动和被动模式无需配置即可支持,还可以支持多个主动和被动模式的Zabbix Agent 同时存在

Zabbix Server 通过 trapper 进程实现主动模式

1
2
3
4
5
6
7
8
9
10
11
[root@zabbix-server ~]# grep StartTrappers /etc/zabbix/zabbix_server.conf 
#进程数可以适当调整
# StartTrappers=5

[root@zabbix-server ~]# ps ax|grep trapper
1256 ? S 0:00 /usr/sbin/zabbix_server: trapper #1 [processed data in 0.000558 sec, waiting for connection]
1257 ? S 0:00 /usr/sbin/zabbix_server: trapper #2 [processed data in 0.000241 sec, waiting for connection]
1258 ? S 0:00 /usr/sbin/zabbix_server: trapper #3 [processed data in 0.000323 sec, waiting for connection]
1259 ? S 0:00 /usr/sbin/zabbix_server: trapper #4 [processed data in 0.000312 sec, waiting for connection]
1260 ? S 0:00 /usr/sbin/zabbix_server: trapper #5 [processed data in 0.000211 sec, waiting for connection]
24371 pts/2 S+ 0:00 grep --color=auto trapper

Zabbix Agent 默认是被动模式,需要修改配置才能支持主动模式

Zabbix Agent 的关健配置有下面三项

1
2
3
Server=<Zabbix Server>          #被动模式指向 Zabbix Server的IP或FQDN,默认模式
ServerActive=<Zabbix Server> #主动模式指向 Zabbix Server的IP或FQDN
Hostname=<当前主机IP> #当前主机的IP,此项必须和Zabbix Server中设置的主机名称相同

范例: Zabbix Agent配置主动模式配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[root@centos8 ~]# grep '^[^#]' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.100 #被动模式指向 Zabbix Server的IP或FQDN
ServerActive=10.0.0.100 #主动模式指向 Zabbix Server的IP或FQDN
Hostname=10.0.0.104 #当前主机的IP,此项必须和Zabbix Server中设置的主机名称相同
Timeout=30 #建议修改
Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@centos8 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:10050 [::]:*

#Zabbix agent主动模式对应的进程数量只有1个,不能调整
#Zabbix agent被动模式对应的进程数量默认3个,可以调整

[root@centos8 ~]# ps ax|grep zabbix
1793 ? S 0:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
1794 ? S 2:44 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
1795 ? S 0:12 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
1796 ? S 0:12 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
1797 ? S 0:12 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
1798 ? S 0:10 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
21213 pts/1 S+ 0:00 vim /etc/zabbix/zabbix_agentd.conf
24150 pts/0 S+ 0:00 grep --color=auto zabbix

#观察日志可以看到以下信息
[root@centos8 ~]# tail /var/log/zabbix/zabbix_agentd.log
1414:20200830:183505.571 Got signal [signal:15(SIGTERM),sender_pid:1630,sender_uid:993,reason:0]. Exiting ...
1414:20200830:183505.572 Zabbix Agent stopped. Zabbix 4.0.24 (revision 95be642769).
1634:20200830:183505.584 Starting Zabbix Agent [10.0.0.104]. Zabbix 4.0.24 (revision 95be642769).
1634:20200830:183505.584 **** Enabled features ****
1634:20200830:183505.584 IPv6 support: YES
1634:20200830:183505.584 TLS support: YES
1634:20200830:183505.584 **************************
1634:20200830:183505.584 using configuration file: /etc/zabbix/zabbix_agentd.conf
1634:20200830:183505.584 agent #0 started [main process]
1638:20200830:183505.586 agent #4 started [listener #3]
1637:20200830:183505.588 agent #3 started [listener #2]
1636:20200830:183505.589 agent #2 started [listener #1]
1639:20200830:183505.590 agent #5 started [active checks #1]
1635:20200830:183505.591 agent #1 started [collector]
基于现有模板将包含的监控项修改为主动模式的监控项

注意: Zabbix 5.0 内置了主动模式的模板 Template OS Linux by Zabbix agent active 无需修改

Zabbix4.0 之前没有主动模式的模板,需要自行修改

以下操作为Zabbix 4.0上实现

424
425

选择全克隆,包括应用集,监控项,触发器,图形,聚合图形等

426

指定模板的名称

427

将新生成的模板的监控项修改为主动模式

428

选中新模板的监控项

提示: 建议将类型为zabbix客户端的监控项进行修改,其它类型如相关项目不建议修改为主动式

429

批量更新所有监控项

注意:此方式只是修改了大部分监控项为主动式,还有部分监控项,比如agent.ping 仍为被动式,保留即可,否则状态会有颜色异常

430

修改为主动式

431

修改更新间隔,此步非必须

432

确保新生成的模板中的自动发现规则中的类型也是主动式,此步非必须

433
434
435
436
437

修改每一个监控项

438
439

将主动模板关联到需要监控的主机

可以通过克隆当前已添加的主机,实现快速添加需要监控的主机

440
441
442

验证结果和查看日志

被动模式的监控项采集时间是串行的

443

主动模式的监控项采集时间是并行的

444

注意: 观察和对比两种不同模式下最新数据中每个监控项的最近检查记录显示的时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#打开日志debug的功能
[root@centos8 ~]# vim /etc/zabbix/zabbix_agentd.conf
### Option: DebugLevel
# Specifies debug level:
# 0 - basic information about starting and stopping of Zabbix processes
# 1 - critical information
# 2 - error information
# 3 - warnings
# 4 - for debugging (produces lots of information)
# 5 - extended debugging (produces even more information)
#
# Mandatory: no
# Range: 0-5
# Default:
# DebugLevel=3
DebugLevel=4 #修改为4

[root@centos8 ~]# systemctl daemon-reload
[root@centos8 ~]# systemctl restart zabbix-agent.service

#观察日志
[root@centos8 ~]# tail /var/log/zabbix/zabbix_agentd.log
1995:20200830:190815.836 In send_buffer() host:'10.0.0.100' port:10051 entries:0/100
1995:20200830:190815.836 End of send_buffer():SUCCEED
1995:20200830:190815.836 __zbx_zbx_setproctitle() title:'active checks #1 [idle 1 sec]'
1991:20200830:190816.756 __zbx_zbx_setproctitle() title:'collector [processing data]'
1991:20200830:190816.756 In update_cpustats()
1991:20200830:190816.756 End of update_cpustats()
1991:20200830:190816.756 __zbx_zbx_setproctitle() title:'collector [idle 1 sec]'
1995:20200830:190816.837 In send_buffer() host:'10.0.0.100' port:10051 entries:0/100
1995:20200830:190816.837 End of send_buffer():SUCCEED
1995:20200830:190816.837 __zbx_zbx_setproctitle() title:'active checks #1 [idle 1 sec]'

#利用zabbix_get测试zabbix agent是否正常
[root@zabbix-server ~]# /apps/zabbix_server/bin/zabbix_get -s 10.0.0.104 -p 10050 -k "agent.ping"
1

#同时会观察JSON相关的日志
[root@centos8 ~]# tail /var/log/zabbix/zabbix_agentd.log
1995:20200830:191801.051 In send_buffer() host:'10.0.0.100' port:10051 entries:47/100
1995:20200830:191801.052 JSON before sending [{"request":"agent data","session":"5c6722cd2fc24994ed6464c14a97caf8","data":
[{"host":"10.0.0.104","key":"kernel.maxproc","value":"4194304","id":794,"clock":1598786276,"ns":9997483},
{"host":"10.0.0.104","key":"net.if.in[eth0]","value":"10196965","id":795,"clock":1598786276,"ns":10330367},
{"host":"10.0.0.104","key":"net.if.out[eth0]","value":"2236200","id":796,"clock":1598786276,"ns":10582720},
{"host":"10.0.0.104","key":"proc.num[,,run]","value":"1","id":797,"clock":1598786276,"ns":13785681},
{"host":"10.0.0.104","key":"proc.num[]","value":"151","id":798,"clock":1598786276,"ns":15500404},
{"host":"10.0.0.104","key":"system.boottime","value":"1598780878","id":799,"clock":1598786276,"ns":15819081},
{"host":"10.0.0.104","key":"system.cpu.intr","value":"649108","id":800,"clock":1598786276,"ns":16113042},
{"host":"10.0.0.104","key":"system.cpu.load[percpu,avg15]","value":"0.000000","id":801,"clock":1598786276,"ns":16340118},
{"host":"10.0.0.104","key":"system.cpu.load[percpu,avg1]","value":"0.000000","id":802,"clock":1598786276,"ns":16527639},
......

监控 JAVA 程序

Zabbix Java Gateway 介绍

Zabbix 不支持直接监控JAVA应用

如果要监控JAVA程序比如Tomcat等,需要使用 Java gateway 做为代理,才能从JAVA应用中获取数据

Zabbix Java gateway 能过监听10052/tcp 端口实现监控JAVA应用

445

Zabbix 监控JVM流程

  • zabbix-server 通知 zabbix-Java-Gateway需要获取监控主机的哪些监控项
  • Zabbix-Java-Gateway 通过 JMX 协议请求采集 Java进程数据
  • Java程序通过 JMX 协议返回数据给 zabbix-Java-Gateway
  • zabbix-Java-Gateway 最终返回数据给 zabbix-server
  • zabbix-server 将采集的JAVA 数据存储至数据库,然后进行 Web 展示

Zabbix Java Gateway 架构

446

实战案例: 监控 Java 应用 Tomcat 服务

部署 tomcat 服务并开启 JMX 功能

安装 tomcat

范例: 安装tomcat脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
[root@tomcat ~]# cat install_tomcat.sh 
#!/bin/bash

DIR=`pwd`
JDK_FILE="jdk-8u291-linux-x64.tar.gz"
TOMCAT_FILE="apache-tomcat-9.0.48.tar.gz"
JDK_DIR="/usr/local"
TOMCAT_DIR="/usr/local"
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$2" && $MOVE_TO_COL
echo -n "["
if [ $1 = "success" -o $1 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $1 = "failure" -o $1 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_jdk(){
if ! [ -f "$DIR/$JDK_FILE" ];then
color 1 "$JDK_FILE 文件不存在"
exit;
elif [ -d $JDK_DIR/jdk ];then
color 1 "JDK 已经安装"
exit
else
[ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi

tar xvf $DIR/$JDK_FILE -C $JDK_DIR
cd $JDK_DIR && ln -s jdk1.8.* jdk
cat > /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export JRE_HOME=\$JAVA_HOME/jre
export CLASSPATH=\$JAVA_HOME/lib/:\$JRE_HOME/lib/
export PATH=\$PATH:\$JAVA_HOME/bin
EOF

. /etc/profile.d/jdk.sh
java -version && color 0 "JDK 安装完成" || { color 1 "JDK 安装失败" ; exit; }
}

install_tomcat(){
if ! [ -f "$DIR/$TOMCAT_FILE" ];then
color 1 "$TOMCAT_FILE 文件不存在"
exit;
elif [ -d $TOMCAT_DIR/tomcat ];then
color 1 "TOMCAT 已经安装"
exit
else
[ -d "$TOMCAT_DIR" ] || mkdir -pv $TOMCAT_DIR
fi
tar xf $DIR/$TOMCAT_FILE -C $TOMCAT_DIR
cd $TOMCAT_DIR && ln -s apache-tomcat-*/ tomcat
echo "PATH=$TOMCAT_DIR/tomcat/bin:"'$PATH' > etc/profile.d/tomcat.sh
id tomcat &> /dev/null || useradd -r -s /sbin/nologin tomcat
cat > $TOMCAT_DIR/tomcat/conf/tomcat.conf <<EOF
JAVA_HOME=$JDK_DIR/jdk
EOF
chown -R tomcat.tomcat $TOMCAT_DIR/tomcat/
cat > /lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=$TOMCAT_DIR/tomcat/conf/tomcat.conf
ExecStart=$TOMCAT_DIR/tomcat/bin/startup.sh
ExecStop=$TOMCAT_DIR/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now tomcat.service &> /dev/null
systemctl is-active tomcat.service &> /dev/null && color 0 "TOMCAT 安装完成" || { color 1 "TOMCAT 安装失败" ; exit; }
}

install_jdk
install_tomcat

[root@tomcat ~]# bash install_tomcat.sh
[root@tomcat ~]# systemctl status tomcat
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2021-05-27 17:43:42 CST; 48s ago

[root@tomcat ~]# ss -ntl
LISTEN 0 1 ::ffff:127.0.0.1]:8005 *:*
LISTEN 0 100 *:8080 *:*
开启 JMX 监控

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等

tomcat 开启远程 JMX 环境配置

1
2
3
4
5
6
7
vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA__OPTS
-Dcom.sun.management.jmxremote #启用远程监控JMX
-Djava.rmi.server.hostname=<JAVA主机IP> #是tomcat主机的IP地址,不是zabbix服务器地址
-Dcom.sun.management.jmxremote.port=XXXXX #默认启动的JMX端口号
-Dcom.sun.management.jmxremote.authenticate=false #不使用用户名密码
-Dcom.sun.management.jmxremote.ssl=false" #不使用ssl认证

范例: Tomcat 开启 JMX 功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh
.......
# -----------------------------------------------------------------------------
#添加下一行
CATALINA_OPTS="$CATALINA__OPTS -Dcom.sun.management.jmxremote -
Dcom.sun.management.jmxremote.port=12345 -
Dcom.sun.management.jmxremote.authenticate=false -
Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.0.0.106"
# OS specific support. $var _must_ be set to either true or false.
.......

#查看端口12345是否打开
[root@tomcat ~]# systemctl restart tomcat
[root@tomcat ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 50 *:12345 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 50 *:38563 *:*
LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:*
LISTEN 0 50 *:40613 *:*
LISTEN 0 100 *:8080 *:*
测试通过java工具 jconsole 进行 JMX 监控

447
448
449
450

使用 java 客户端获取 JMX 信息

cmdline-jmxclient-0.10.3.jar 是一个开源jar包,在zabbix 中常用于测试的一个工具,可以用来测试 jmx 是否配置正确。在监控方面后还可以对Tomcat各种属性进行监控。下面使用java客户端cmdline-jmxclient进行测试

下载链接

1
https://github.com/qiueer/zabbix/blob/master/Tomcat/cmdline-jmxclient-0.10.3.jar

范例: 测试能否获取到java当前线程数和最大线程数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#先下载cmdline-jmxclient-0.10.3.jar文件
[root@zabbix-server ~]# ll cmdline-jmxclient-0.10.3.jar
-rw-r--r-- 1 root root 20124 Aug 23 22:41 cmdline-jmxclient-0.10.3.jar

#测试能否获取到java当前线程数和最大线程数:
[root@zabbix-server ~]# yum -y install java
#Ubuntu安装下面包
[root@zabbix-server ~]# apt install openjdk-8-jdk -y
[root@zabbix-server ~]# java -jar cmdline-jmxclient-0.10.3.jar - 10.0.0.106:12345 'Catalina:name="http-nio-8080",type=ThreadPool' currentThreadCount
08/30/2020 13:27:07 +0800 org.archive.jmx.Client currentThreadCount: 10

#测试能否获取到java最大线程数:
[root@zabbix-server ~]# java -jar cmdline-jmxclient-0.10.3.jar - 10.0.0.106:12345 'Catalina:name="http-nio-8080",type=ThreadPool' maxThreads
08/30/2020 13:27:33 +0800 org.archive.jmx.Client maxThreads: 200

部署 Java gateway 服务器

Java gateway 是一个独立于zabbix server和 zabbix agent的组件,默认使用端口10052/tcp, 所以java gateway可以是单独的一台服务器,但是也可以和zabbix server或者zabbix agent 共用一台服务器

Java gatway 可以用两种方法安装

  • 包安装
  • 编译安装

注意: Java gateway和Zabbix Server都无需安装 JDK

包安装 Java gateway

范例: Ubuntu 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@ubuntu1804 ~]# wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+bionic_all.deb
[root@ubuntu1804 ~]# dpkg -i zabbix-release_5.0-1+bionic_all.deb
[root@ubuntu1804 ~]# sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/apt/sources.list.d/zabbix.list
[root@ubuntu1804 ~]# apt update

#安装依赖JDK会自动安装
[root@ubuntu1804 ~]# apt -y install zabbix-java-gateway

#可以开启自身的JMX功能实现自身的监控(可选)
[root@ubuntu1804 ~]# vim /etc/zabbix/zabbix_java_gateway.conf
# uncomment to enable remote monitoring of the standard JMX objects on the Zabbix Java Gateway itself
JAVA_OPTIONS="$JAVA_OPTIONS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.registry.ssl=false"

#Ubuntu安装后会自动启动服务并打开监听10052/tcp端口
[root@ubuntu1804 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:6010 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 50 *:12345 *:*
LISTEN 0 128 [::1]:6010 [::]:*
LISTEN 0 50 *:10052 *:*

[root@ubuntu1804 ~]# ps aux|grep java
zabbix 791 1.8 4.4 3131380 89620 ? Sl 18:59 0:03 java -server -
Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -
Dcom.sun.management.jmxremote.authenticate=false -
Dcom.sun.management.jmxremote.ssl=false -
Dcom.sun.management.jmxremote.registry.ssl=false -
Dlogback.configurationFile=/etc/zabbix/zabbix_java_gateway_logback.xml -
classpath lib:lib/android-json-4.3_r3.1.jar:lib/logback-classic-1.2.3.jar:lib/logback-core-1.2.3.jar:lib/slf4j-api-1.7.30.jar:bin/zabbix-java-gateway-5.0.14.jar -Dzabbix.pidFile=/var/run/zabbix/zabbix_java_gateway.pid -
Dsun.rmi.transport.tcp.responseTimeout=3000 com.zabbix.gateway.JavaGateway
root 1235 0.0 0.0 14436 1120 pts/0 S+ 19:02 0:00 grep --color=auto java

范例: CentOS安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@centos8 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
[root@centos8 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/8/x86_64/zabbix-release-4.0-2.el8.noarch.rpm

#修改为阿里云源
[root@centos8 ~]# vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/8/x86_64/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

#或者sed修改
[root@centos8 ~]# sed -i.bak 's/repo.zabbix.com/mirrors.aliyun.com\/zabbix/' /etc/yum.repos.d/zabbix.repo

#安装
[root@centos8 ~]# yum -y install zabbix-java-gateway

#查看包文件列表
[root@centos8 ~]# rpm -ql zabbix-java-gateway
/etc/zabbix/zabbix_java_gateway.conf
/etc/zabbix/zabbix_java_gateway_logback.xml
/usr/lib/systemd/system/zabbix-java-gateway.service
/usr/lib/tmpfiles.d/zabbix-java-gateway.conf
/usr/sbin/zabbix_java_gateway
/usr/share/doc/zabbix-java-gateway
/usr/share/doc/zabbix-java-gateway/AUTHORS
/usr/share/doc/zabbix-java-gateway/COPYING
/usr/share/doc/zabbix-java-gateway/ChangeLog
/usr/share/doc/zabbix-java-gateway/NEWS
/usr/share/doc/zabbix-java-gateway/README

#默认的配置文件可不做修改
[root@centos8 ~]# grep '^[^#]' /etc/zabbix/zabbix_java_gateway.conf
PID_FILE="/var/run/zabbix/zabbix_java.pid"
START_POLLERS=5 #指定线程个数,根据JAVA JXM客户端数量适当调大,比如:50

#启动
[root@centos8 ~]# systemctl enable --now zabbix-java-gateway.service
[root@centos8 ~]# ps -ef|grep java
zabbix 25041 1 0 10:27 ? 00:00:00 java
......

#查看是否打开端口10052/tcp
[root@centos8 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 50 *:10052 *:*
编译安装 Java gateway

编译安装使用的是zabbix agent,zabbix server 是同一个源码包,只需指定相关的编译选项即可

范例: 编译安装 zabbix java gateway 5.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@centos8 ~]# tar xf zabbix-5.0.13.tar.gz
[root@centos8 ~]# wget https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix5.0.13.tar.gz
[root@centos8 ~]# cd zabbix-5.0.13/
[root@centos8 zabbix-5.0.13]# ./configure --prefix=/apps/zabbix_java_gateway --enable-java --with-net-snmp --with-mysql -with-ssh2
[root@centos8 zabbix-5.0.13]# make && make install
[root@centos8 zabbix-5.0.13]# /apps/zabbix_java_gateway/sbin/zabbix_java/startup.sh
[root@centos8 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 50 *:10052 *:*
LISTEN 0 128 [::]:22 [::]:*

[root@centos8 ~]# ps aux|grep java
root 9253 2.1 2.9 2570612 54684 pts/1 Sl 09:29 0:00 java -server
-classpath lib:lib/android-json-4.3_r3.1.jar:lib/logback-classic
......

范例: 编译安装 zabbix java gateway 4.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@centos8 ~]# yum -y install gcc java-1.8.0-openjdk-devel
[root@centos8 ~]# wget https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.24.tar.gz

[root@centos8 ~]# tar xf zabbix-4.0.24.tar.gz
[root@centos8 ~]# cd zabbix-4.0.24/
[root@centos8 zabbix-4.0.24]# ./configure --prefix=/usr/local/zabbix --enable-java --with-net-snmp --with-mysql -with-ssh2
[root@centos8 zabbix-4.0.24]# make && make install
[root@centos8 ~]# tree /usr/local/zabbix/
/usr/local/zabbix/
└── sbin
└── zabbix_java
├── bin
│ └── zabbix-java-gateway-4.0.24.jar
├── lib
│ ├── android-json-4.3_r3.1.jar
│ ├── logback-classic-0.9.27.jar
│ ├── logback-console.xml
│ ├── logback-core-0.9.27.jar
│ ├── logback.xml
│ └── slf4j-api-1.6.1.jar
├── settings.sh
├── shutdown.sh
└── startup.sh
4 directories, 10 files
[root@centos8 ~]# /usr/local/zabbix/sbin/zabbix_java/startup.sh
[root@centos8 ~]# ss -ntl
LISTEN 0 50 *:10052 *:*

[root@centos8 ~]# ps -ef|grep java

配置 Zabbix Server 支持 Java gateway

Zabbix Server 开启 Java gateway 功能

默认有关java的监控项是不支持的,如下图

451

配置下面后,上面相关监控项会支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#包安装zabbix server
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
#编译安装zabbix server
[root@zabbix-server ~]# vim /apps/zabbix_server/etc/zabbix_server.conf
JavaGateway=10.0.0.105 #指向JAVA gateway主机
StartJavaPollers=10 #指定开启的进程数,默认为0,即不开启,所以必须修改此行
JavaGatewayPort=10052 #指定端口,此为默认值,可不修改

[root@zabbix-server ~]# systemctl restart zabbix-server.service

#查看进程
[root@zabbix-server ~]# ps -ef|grep java
zabbix 2529 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #1 [got 0 values in 0.000011 sec, idle 5 sec]
zabbix 2530 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #2 [got 0 values in 0.000011 sec, idle 5 sec]
zabbix 2531 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #3 [got 0 values in 0.000025 sec, idle 5 sec]
zabbix 2532 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #4 [got 0 values in 0.000026 sec, idle 5 sec]
zabbix 2533 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #5 [got 0 values in 0.000014 sec, idle 5 sec]
zabbix 2534 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #6 [got 0 values in 0.000034 sec, idle 5 sec]
zabbix 2535 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #7 [got 0 values in 0.000012 sec, idle 5 sec]
zabbix 2536 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #8 [got 0 values in 0.000020 sec, idle 5 sec]
zabbix 2537 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #9 [got 0 values in 0.000033 sec, idle 5 sec]
zabbix 2538 2518 0 12:21 ? 00:00:00 /apps/zabbix_server/sbin/zabbix_server: java poller #10 [got 0 values in 0.000046 sec, idle 5 sec]
root 2571 2334 0 12:22 pts/1 00:00:00 grep --color=auto java
使用系统内置模板监控 tomcat 主机

如果 Java gateway 开启JMX功能,也可以直接监控 java gateway 自身

452

添加需要监控的java服务器,指定通过JMX接口实现

453

**选中系统内置的模板: **

**Template App Generic Java JMX **

**Template App Apache Tomcat JMX **

注意: Template App Apache Tomcat 只支持老版本的tomcat,所以此处不选择它

454
455

查看到 JMX 数据

456

导入自定义模板

通过自定义的 JMX 模板,可以定制生产所需的监控项和阈值

457
458
459

将自定义的模板关联到监控的tomcat主机

460
461

取消之前关联的模板

462

注意: 主机的 JMX 标识正常情况下会变绿

463

验证使用自定义模板监控结果

464

监控网络设备 SNMP

SNMP 介绍和组成

SNMP 介绍

465

SNMP 即 Simple Network Management Protocol 简单网络管理协议,属于TCP/IP五层协议中的应用层协议,用于网络管理的协议,SNMP主要用于网络设备的管理。

SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。

通常一线的网络硬件厂商的设备都支持SNMP协议,如:华为,华三,思科,锐捷等,另外 Linux,Unix,Windows,MacOS等也都支持

SNMP协议在1988年被制定,并被Internet体系结构委员会(IAB,Internet Architecture Board)采纳作为一个短期的网络管理解决方案,由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能,SNMP的协议版本目前有SNMP v1、SNMPV 2c 和 SNMP v3三种版本,其具体差别如下:

SNMP v1采用团体名(Community Name)认证,团体名用来定义SNMP NMS和SNMP Agent的关系,如果SNMP报文携带的团体名没有得到设备的认可,该报文将被丢弃,团体名起到了类似于密码的作用,用来限制SNMP NMS对SNMP Agent的访问

SNMP v2c也采用团体名认证,它在兼容SNMP v1的同时又扩充了SNMP v1的功能,它提供了更多的操作类型(批量获取GetBulk和通知请求InformRequest)、支持更多的数据类型(Counter64等)、提供了更丰富的错误代码且能够更细致地区分错误。此版本使用较多.

SNMP v3提供了基于用户的安全模型(USM,User-Based Security Model)的认证机制,用户可以设置认证和加密功能,认证用于验证报文发送方的合法性,避免非法用户的访问,加密则是对NMS和Agent之间的传输报文进行加密,以免被窃听。通过有无认证和有无加密等功能组合,可以为SNMP NMS和SNMP Agent之间的通信提供更高的安全性。此版本安全性高,但效率不高.

SNMP 工作原理

SNMP网络设备分为NMS和Agent两种:

  • NMS(Network Management Station,网络管理站)是SNMP网络的管理者,NMS是运行SNMP客户端管理程序的工作站,能够提供友好的人机交互界面,方便网络管理员完成绝大多数的网络管理工作。
  • Agent是SNMP网络的被管理者。Agent是驻留在设备上的一个进程,负责接收、处理来自NMS的请求报文。在一些紧急情况下,如接口状态发生改变等,Agent也会主动通知NMS。
  • NMS和Agent之间通过SNMP协议来交互管理信息。

SNMP管理进程与代理进程之前为了交互信息,定义了5种报文:

1
2
3
4
5
get-request操作:这个操作是由管理进程发起,向代理进程处请求提取一个或多个参数值。
get-next-request操作:这个操作是由管理进程发起,向从代理进程处提取一个或多个参数的下一个参数值。
get-response操作:这个操作是由代理进程发出的,向管理进程返回的一个或多个参数值。
set-request操作:这个操作是由管理进程发起,对代理进程设置一个或多个参数值。
trap操作:这个操作是由代理进程主动发出的报文,通知管理进程有某些事情发生。

466

SNMP 组成

基于TCP/IP的SNMP网络管理包含以下组成部分:

  • 管理信息库MIB(Management Information Base): 管理信息库包含所有代理进程的所有可被查询和修改的参数。RFC 1213 [McCloghrie and Rose 1991]定义了第二版的MIB,叫做MIB-II。

    OID(object identifiers): 是与对象相关联的用来无歧义地标识对象的全局唯一的值,一个OID是一个唯一的键值对,用于标识具体某一个设备的某个具体信息(对象标识),如端口信息、设备名称等。即一个OID就是网络通信中对象的身份证。

  • 管理信息结构SMI(Structure of Management Information): 关于MIB的一套公用的结构和表示符号。这个在RFC 1155 [Rose and McCloghrie 1990]中定义。SMI 是一种语言,是为了确保网络管理数据的语法和语义明确和无二义性而定义的语言。

    它是定义被管理网络实体中特定数据的语 言。 它定义了数据类型、对象模型,以及写入和修改管理信息的规则。比如: 支持INTEGER,OCTER STRING,DisplayString,IpAddress等数据类型

  • SNMP(Simple Network Management Protocol): 管理进程和代理进程之间的通信协议,叫做简单网络管理协议。在RFC 1157 [Case et al.1990]中定义。SNMP包括数据报交换的格式等。尽管可以在运输层采用各种各样的协议,但是在SNMP中,用得最多的协议还是UDP。

上述三部分相互独立,每部分都定义了单独标准(RFC)。SNMP定义通信的方式和格式,但不指明具体设备上的具体数据,每种设备的数据细节在MIB中定义,这样做达到了“控制与数据相分离”的目的,能提供很好的兼容性和可扩展性。而SMI又为保持MIB的简单性和可扩展性提供了很好的支持。

MIB 和 OID

管理信息库MIB可以分为公有MIB和私有MIB两种

  • 公有MIB:一般由RFC定义,主要用来对各种公有协议进行结构化设计和接口标准化处理。例如:OSPF-MIB(RFC1850)/BGP4-MIB(RFC1657)都是典型的公有MIB。大多数的设备制造商都需要按照RFC的定义来提供SNMP接口。
  • 私有MIB:是公有MIB的必要补充,当公司自行开发私有协议或者特有功能时,可以利用私有MIB来完善SNMP接口的管理功能,同时对第三方网管软件管理存在私有协议或特有功能的设备提供支持。

MIB中存放了对每个对象都指定唯 一的对象标识OID, OID是一种数据类型,它指明一种“授权”命名的对象。“授权”的意思就是这些标识不是随便分配的,它是由一些权威机构进行管理和分配的。对象标识是一个整数序列,以点(“.”)分隔。这些整数构成一个树型结构,类似于DNS或Unix的文件系统。对象标识从树的顶部开始,顶部没有标识,以root表示

树上的每个结点同时还有一个文字名。例如标识 .1.3.6.1.2.1和iso.org.dod.internet.memt.mib对应。这主要是为了人们阅读方便。在实际应用中,也就是说在管理进程和代理进程进行数据报交互时,MIB变量名是以对象标识来标识的,都是以1.3.6.1.2.1开头的。

一般情况下(如交换机、防火墙、PC)使用的路径如图中所示,iso–>org–>dod–>internet,所以这些设备信息的oid必然以1.3.6.1开头,之后mgmt为公有库,包含了一些设备共同具备的信息,例如1.3.6.1.2.1.1.5为主机名,而private为私有库,再根据不同的公司,MIB树继续扩展下去,最后到每一个具体值的叶子节点,例如1.3.6.1.4.1.2021.4.3.0为Linux操作系统的交换区大小

下图显示了在SNMP中用到的这种树型结构。所有的MIB变量都从 .1.3.6.1.2.1这个标识开始。

467

常见 OID

oid-info是一个内容丰富的网站,包含了大量公有或私有的MIB信息,在知道部分OID的情况,可以方便的进行节点具体信息的查看。但是树太过庞大,仅仅从网站上查看效率十分低下,直接从设备商处获取mib库是最方便的做法。

参考链接:

1
2
http://www.oid-info.com/index.htm
#注意:查询时无需输入最前面的.

系统信息:

1
2
3
4
5
sysDescr .1.3.6.1.2.1.1.1
sysobjectID .1.3.6.1.2.1.1.2
sysUpTime .1.3.6.1.2.1.1.3
syscontact .1.3.6.1.2.1.1.4
sysName .1.3.6.1.2.1.1.5

CPU负载:

1
2
3
l minute Load: .1.3.6.1.4.1.2021.10.1.3.1
5 minute Load: .1.3.6.1.4.1.2021.10.1.3.2
15minute Load: .1.3.6.1.4.1.2021.10.1.3.3

CPU信息:

1
2
3
4
5
6
7
percentage of user Cpu time: .1.3.6.1.4.1.2021.11.9.0
raw user cpu time: .1.3.6.1.4.1.2021.11.50.0
percentages of system Cpu time: .1.3.6.1.4.1.2021.11.10.0
raw system cpu time: .1.3.6.1.4.1.2021.11.52.0
percentages of idle Cpu time:.1.3.6.1.4.1.2021.11.11.0
raw idle cpu time:.1.3.6.1.4.1.2021.11.53.0
raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0

内存使用:

1
2
3
4
5
6
7
8
Total swap size:.1.3.6.1.4.1.2021.4.3.0
Available swap Space: .1.3.6.1.4.1.2021.4.4.0
Total RAM in machine: .1.3.6.1.4.1.2021.4.5.0
Total RAM used: .1.3.6.1.4.1.2021.4.6.0
Total RAMFree: .1.3.6.1.4.1.2021.4.11.0
Total RAM Shared: .1.3.6.1.4.1.2021.4.13.0
Tota7 RAM Buffered: .1.3.6.1.4.1.2021.4.14.0
Total cached Memory: .1.3.6.1.4.1.2021.4.15.0

硬盘使用:

1
2
3
4
5
6
7
Path where the disk is mounted: .1.3.6.1.4.1.2021.9.1.2.1
Path of the device for the partition: .1.3.6.1.4.1.2021.9.1.3.1
Total size of the disk/partion (kBytes): .1.3.6.1.4.1.2021.9.1.6.1
Available space on the disk: .1.3.6.1.4.1.2021.9.1.7.1
Used space on the disk: .1.3.6.1.4.1.2021.9.1.8.1
Percentage of space used on disk: .1.3.6.1.4.1.2021.9.1.9.1
Percentage of inodes used on disk: .1.3.6.1.4.1.2021.9.1.10.1

使用 SNMP工具监控网络设备

开启设备的SNMP

468

设置团体名,默认可以使用 Public

469
470

配置 Zabbix Web 监控

配置–>主机–>添加主机–>选择类型为SNMP,输入路由器设备的IP地址

471
472
473

关联以下三个模板

1
2
3
Template Module EtherLike-MIB SNMP
Template Module Generic SNMP
Template Module Interfaces SNMP

查看网络设备的监测结果

监测–>主机–>图形

474
475

利用 Zabbix 监控 Linux 主机

在 Zabbix Agent 安装 SNMP 协议并配置

范例: Ubuntu 系统实现 SNMP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#Ubuntu20.04
#在被监控端Ubuntu安装SNMP协议
[root@ubuntu2004 ~]# apt -y install snmpd
[root@ubuntu2004 ~]# snmpd -v
NET-SNMP version: 5.8
Web: http://www.net-snmp.org/
Email: net-snmp-coders@lists.sourceforge.net

[root@ubuntu2004 ~]# vim /etc/snmp/snmpd.conf
agentaddress 0.0.0.0 #修改此行
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
view systemonly included .1 #加此行

#如果将社区名称public修改为123456,如下即可
rocommunity 123456 default -V systemonly
rocommunity6 123456 default -V systemonly
#rocommunity public default -V systemonly
#rocommunity6 public default -V systemonly

[root@ubuntu2004 ~]# systemctl restart snmpd.service
[root@ubuntu2004 ~]# ss -ntulp|grep snmp
udp UNCONN 0 0 0.0.0.0:161 0.0.0.0:* users:(("snmpd",pid=24871,fd=6))

#Ubuntu18.04
#在被监控端Ubuntu安装SNMP协议
[root@ubuntu1804 ~]# apt -y install snmpd
[root@ubuntu1804 ~]# snmpd -v
NET-SNMP version: 5.7.3
Web: http://www.net-snmp.org/
Email: net-snmp-coders@lists.sourceforge.net

[root@ubuntu1804 ~]# vi /etc/snmp/snmpd.conf
agentAddress udp:0.0.0.0:161

[root@ubuntu1804 ~]# systemctl restart snmpd.service
[root@ubuntu1804 ~]# ss -ntulp|grep snmp
udp UNCONN 0 0 0.0.0.0:161 0.0.0.0:* users:(("snmpd",pid=24871,fd=6))

范例: 红帽系统实现SNMP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#在被监控端CentOS安装SNMP服务器包
[root@centos8 ~]# yum -y install net-snmp
[root@centos8 ~]# snmpd -v
NET-SNMP version: 5.8
Web: http://www.net-snmp.org/
Email: net-snmp-coders@lists.sourceforge.net

[root@centos8 ~]# vim /etc/snmp/snmpd.conf
[root@centos8 ~]# grep '^[^#]' /etc/snmp/snmpd.conf
com2sec notConfigUser default 123456 #修改此行,设置团体密码,默认为public,此处改为123456
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1
view systemview included .1. #添加此行,自定义授权,否则 zabbix 无法获取数据
access notConfigGroup "" any noauth exact systemview none none
syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
dontLogTCPWrappersConnects yes

#验证开启161/UDP端口
[root@centos8 ~]# ss -uln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 0.0.0.0:161 0.0.0.0:*
UNCONN 0 0 127.0.0.1:323 0.0.0.0:*
UNCONN 0 0 [::1]:323 [::]:*

[root@centos8 ~]# ss -ntulp|grep snmp
udp UNCONN 0 0 0.0.0.0:161 0.0.0.0:* users:(("snmpd",pid=9962,fd=9))
tcp LISTEN 0 128 127.0.0.1:199 0.0.0.0:* users:(("snmpd",pid=9962,fd=10))

测试 SNMP 是否可以访问

在 Zabbix Server (也可以在其它主机上)安装 SNMP工具 net-snmp-utils

此工具可以测试是否可以获取Zabbix Agent的SNMP数据

注意: 在实际生产环境中Zabbix Server 在进行 SNMP 监测时,无需在 Zabbix Server 安装此工具

snmpwalk 命令格式

1
2
3
4
5
6
7
8
9
10
USAGE:snmpwalk[OPTIONS]AGENT[OID]
-h:显示帮助。
-v:指定snmp的版本,1或者2c或者3。
-c:指定连接设备SNMP密码。
—r:指定重次次数.默认为0次
-l:指定安全级别: noAuthNoPriv|authNoPriv|authPriv。
-a:验证协议:MD5|SHA。只有-l指定为authNoPriv或authPriv时才需要。
-A∶验证字符串。只有-1指定为authNoPriv或authPriv时才需要
-x:加密协议:DES。只有-l指定为authPriv时才需要
-x:加密字符串。只有-l指定为authPriv时才需要

范例: snmpwalk 获取 SNMP代理端的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#如果是CentOS安装SNMP工具包
[root@zabbix-server ~]# yum -y install net-snmp-utils

#如果是Ubuntu安装下面包
[root@zabbix-server ~]# apt -y install snmp

#获取主机名
[root@zabbix-server ~]# snmpwalk -v 2c -c123456 10.0.0.8 .1.3.6.1.2.1.1.5.0
SNMPv2-MIB::sysName.0 = STRING: centos8.wang.org

#获取系统信息
[root@zabbix-server ~]# snmpwalk -v 2c -c123456 10.0.0.8 1.3.6.1.2.1.1.1
SNMPv2-MIB::sysDescr.0 = STRING: Linux centos8.wang.org 4.18.0-240.el8.x86_64 #1
SMP Fri Sep 25 19:48:47 UTC 2020 x86_64

#获取内存
[root@zabbix-server ~]# snmpwalk -v 2c -c123456 10.0.0.8 .1.3.6.1.4.1.2021.4.5.0
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 1833004 kB

#取上面H3C路由的器内存信息
[root@zabbix-server ~]# snmpwalk -v2c -c public 10.1.84.1 .1 |grep -i mem
[root@zabbix-server ~]# snmpwalk -v2c -c public 10.1.84.1 .1.3.6.1.2.1.25.2.2.0
HOST-RESOURCES-MIB::hrMemorySize.0 = INTEGER:483316 KBytes

[root@zabbix-server ~]# snmpwalk -v2c -c public 10.1.84.1 hrMemorySize.0
HOST-RESOURCES-MIB::hrMemorySize.0 = INTEGER:483316 KBytes

#获取接口信息
[root@zabbix-server ~]# snmpwalk -v 2c -c123456 10.0.0.8 .1.3.6.1.2.1.2.2.1.3
IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)
IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6)

#获取接口MAC
[root@zabbix-server ~]# snmpwalk -v 2c -c123456 10.0.0.8 .1.3.6.1.2.1.2.2.1.6
IF-MIB::ifPhysAddress.1 = STRING:
IF-MIB::ifPhysAddress.2 = STRING: 0:c:29:15:9b:83

#获取接口当前带宽[bps]
[root@zabbix-server ~]# snmpwalk -v 2c -c123456 10.0.0.8 .1.3.6.1.2.1.2.2.1.5
IF-MIB::ifSpeed.1 = Gauge32: 10000000
IF-MIB::ifSpeed.2 = Gauge32: 1000000000

#取IP地址
[root@zabbix-server ~]# snmpwalk -v 2c -c123456 10.0.0.8 1.3.6.1.2.1.4.20.1.1
IP-MIB::ipAdEntAddr.10.0.0.8 = IpAddress: 10.0.0.8
IP-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1

[root@zabbix-server ~]# snmpwalk -v 2c -c123456 10.0.0.8 IP-MIB::ipAdEntAddr
IP-MIB::ipAdEntAddr.10.0.0.8 = IpAddress: 10.0.0.8
IP-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1

注意: 团体密码是明文传输的,可以抓包查看到

476

创建主机

在配置中添加需要监控的SNMP代理端

477

删除默认的客户端类型

478

指定客户端类型为SNMP

479

指定SNMP代理端的地址和端口

480

关联 SNMP 模板

关联对应的SNMP模板 Template OS Linux SNMP

481

修改主机宏的值 {$SNMP_COMMUNITY}

482

或者修改继承以及主机的宏

483

添加完成

484

Zabbix 4.0 界面如下

485

关联对应的SNMP模板

486
487

验证结果

过一段时间,可以看到SNMP字体变绿

488

在监测项验证查看主机信息

489

对应主机的图形

490

查看主机的数据

491

Zabbix 监控实战案例

Zabbix 的监控功能强大,还支持定制的自定义监控项,可以说能做到想监控什么就可以监控什么

以下实战案例中实现了对生产环境中各种资源的监控

监控内存使用情况

在客户端定义监控项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/mem.conf
[root@centos8 ~]# cat /etc/zabbix/zabbix_agent2.d/mem.conf
UserParameter=mem_use_percent,free | awk 'NR==2{print $3/$2*100}'
UserParameter=mem_unuse_percent,free | awk 'NR==2{print 100-($3/$2*100)}'

#客户端测试
[root@centos8 ~]# zabbix_agent -t mem_use_percent
[root@centos8 ~]# zabbix_agent2 -t mem_use_percent
mem_use_percent [s|11.9297]

[root@centos8 ~]# zabbix_agent2 -t mem_unuse_percent
mem_unuse_percent [s|88.2598]

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@centos8 ~]# systemctl restart zabbix-agent2.service

#服务器端测试
[root@zabbix-server ~]# yum -y install zabbix-get
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "mem_use_percent"
11.1591

[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "mem_unuse_percent"
88.7257

在 Zabbix Server 添加监控项

492
493

验证结果

494

监控TCP 十一种有限状态机

TCP 十一种有限状态机

TCP 共十一种状态

1
2
3
4
5
6
7
8
9
10
11
ESTABLISHED
SYN_SENT
SYN_RECV
FIN_WAIT1
FIN_WAIT2
TIME_WAIT
CLOSE
CLOSE_WAIT
LAST_ACK
LISTEN
CLOSING

495
496

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@rocky8 ~]# man netstat
State
The state of the socket. Since there are no states in raw mode and usually no states used in UDP and UDPLite, this column may be left blank. Normally this can be one of several values:
ESTABLISHED
The socket has an established connection.
SYN_SENT
The socket is actively attempting to establish a connection.
SYN_RECV
A connection request has been received from the network.
FIN_WAIT1
The socket is closed, and the connection is shutting down.
FIN_WAIT2
Connection is closed, and the socket is waiting for a shutdown from the remote end.
TIME_WAIT
The socket is waiting after close to handle packets still in the network.
CLOSE
The socket is not being used.
CLOSE_WAIT
The remote end has shut down, waiting for the socket to close.
LAST_ACK
The remote end has shut down, and the socket is closed. Waiting for acknowledgement.
LISTEN
The socket is listening for incoming connections. Such sockets are not included in the output unless you specify the --listening (-l) or --all (-a) option.
CLOSING
Both sockets are shut down but we still don't have all our data
sent.
UNKNOWN
The state of the socket is unknown.

[root@rocky8 ~]# netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.8:22 10.0.0.1:9680 ESTABLISHED
tcp 0 52 10.0.0.8:22 10.0.0.1:9682 ESTABLISHED
tcp 0 0 10.0.0.8:22 10.0.0.1:9681 ESTABLISHED
tcp6 0 0 :::10050 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 10.0.0.8:10050 10.0.0.100:55018 TIME_WAIT

实现自定义监控项

案例1: 自定义监控项实现监控TCP当前ESTABLISHED状态的连接数

先准备脚本实现自定义监控项实现连接数

1
2
3
4
5
6
[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=tcp_state_estab,netstat -ant|grep -c STABLISHED

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state_estab"
5

添加被控制主机

497
498
499

在被监控主机添加监控项

500
501
502
503

测试是否能获取到相关的值

504
505
506

验证结果

507
508
509

案例2:自定义监控项实现监控TCP 状态的连接数

修改监控项的脚本为以下形式,可以实现一个脚本实现多个自定义监控项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@centos8 ~]# yum -y install net-tools
[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/tcp_state.sh
#!/bin/bash
tcp_state () {
netstat -atn|grep -c $1
}

tcp_state $1

[root@centos8 ~]# chmod +x /etc/zabbix/zabbix_agentd.d/tcp_state.sh

[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=tcp_state[*],/etc/zabbix/zabbix_agentd.d/tcp_state.sh $1

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state[LISTEN]"
9

[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state[ESTABLISHED]"
3

[root@zabbix-server ~]# zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state[TIME-WAIT]"
8200

510

测试是否能取到数据

511
512
513
514
515
516
517
518

自定义模板实现监控

对于主机和监控项众多时,直接将监控项关联至主机的方法,是比较繁琐的

可以通过将自定义的监控项加入到自定义的模板或已有的模板中,再将此模板关联至需要监控的主机,从而提高效率

519
520
521

创建应用集tcp_state

522

在自定义的模板中创建自定义监控项或者将已有的监控项复制到模板中

523
524
525

查看自定义的模板中已存在自定义的应用集和监控项

526

在监控主机上清空前面小节已关联的监控项

527

在被监控主机重新关联自定义的模板

528

查看关联的模板及相关的监控项

529
530
531

导出自定义的模板

532

查看文件内容

533

创建自定义触发器

创建触发器

选择指定的模板中创建触发器

534

创建触发器

535
536
537
538
539
540
541

测试触发触发器

默认没有触发消息

542

1
2
3
4
5
[root@centos8 ~]# zabbix_get -s 10.0.0.7 -p 10050 -k "tcp_state[ESTAB]"
3

[root@centos8 ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "tcp_state[ESTAB]"
2

多建立连接查看到下面提示信息

1
2
3
4
[root@centos8 ~]# zabbix_get -s 10.0.0.8 -p 10050 -k "tcp_state[ESTAB]"
6
[root@centos8 ~]# zabbix_get -s 10.0.0.7 -p 10050 -k "tcp_state[ESTAB]"
7

543
544

自定义图形

选择自定义的模板,查看”图形”

545

创建图形

546

在图形中添加监控项

547

确定创建图形

548

在模板中可以看到图形有一个

549

在主机中验证结果

550

验证图形和颜色

551

导出模板

将自定义的模板导出,可以在其它Zabbix Server导入进行复用

552
553

监控 Memcached 服务

在 Zabbinx Agent安装memcached 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@centos8 ~]# yum -y install memcached nc
[root@centos8 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
#OPTIONS="-l 127.0.0.1,::1" #注释此行

[root@centos8 ~]# systemctl enable --now memcached
[root@centos8 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:11211 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 [::]:11211 [::]:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*

Zabbix Agent的监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@centos8 ~]# cat /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh
#!/bin/bash
memcached_state(){
port=$1
echo -e 'stats\nquit'| nc 127.0.0.1 $port |awk -v item=$2 '$2==item{print $3}'
}
memcached_state $1 $2

#编译安装路径
[root@centos8 ~]# chmod +x /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh

#如果是包安装路径如下
[root@centos8 ~]# chmod +x /etc/zabbix/zabbix_agentd.d/memcached_state.sh
[root@centos8 ~]# /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 version
1.5.9

#取当前连接数
[root@centos8 ~]# /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 curr_connections
2


#取内存使用
[root@centos8 ~]# /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 bytes
131

[root@centos8 ~]# /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 get_hits
0

[root@centos8 ~]# /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 get_misses
0

zabbix Agent 添加自定义的监控项

1
2
3
4
5
6
7
8
9
[root@centos8 ~]# vim /apps/zabbix_agent/etc/zabbix_agentd.conf
UserParameter=tcp_state[*],/apps/zabbix_agent/etc/zabbix_agentd.conf.d/tcp_state.sh "$1"
UserParameter=memcached_state[*],/apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh "$1" "$2"

#如果是包安装,配置文件如下
[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=memcached_state[*],/etc/zabbix/zabbix_agentd.d/memcached_state.sh "$1" "$2"

[root@centos8 ~]# systemctl restart zabbix-agent.service

Zabbix Server 测试监控memcached服务的监控项数据

1
2
3
4
5
[root@zabbix-server ~]# zabbix_get -s 10.0.0.103 -p 10050 -k"memcached_state[11211,version]"
1.5.9

[root@zabbix-server ~]#zabbix_get -s 10.0.0.103 -p 10050 -k"memcached_state[11211,curr_connections]"
2

创建memached的监控自定义模板

创建自定义模板

554
555

创建自定义监控项

监控项实现监控当前连接数

556

键值: memcached_state[11211,curr_connections]

557

创建针对自定义模板的触发器

当前连接数大于1000时生成触发器事件

558
559
560

创建自定义模板版的图形

自定义的模板关联图形,一个图形可以用多个监控项,不同的监控项会自动使用不同的颜色进行区分,也可以手动调整各监控项的颜色和图形类型。

561
562
563
564

将自定义的模板关联至需要监控的主机上

565

验证监控结果

566
567

监控 Redis 服务

客户端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@centos8 ~]# key1="used_memory";redis-cli info |awk -F: -v key2=$key '$1==key2{print $2}'
[root@centos8 ~]# key1="total_system_memory";redis-cli info |awk -F: -v key2=$key '$1==key2{print $2}'
[root@centos8 ~]# key1="connected_clients";redis-cli info |awk -F: -v key2=$key '$1==key2{print $2}'
[root@centos8 ~]# cat /etc/zabbix/zabbix_agent2.d/redis.conf
UserParameter=redis.status[*],/etc/zabbix/zabbix_agent2.d/redis_status.sh "$1"
UserParameter=redis.config.maxclients,redis-cli -p 6379 config get maxclients | awk "NR==2"

[root@centos8 ~]# cat /etc/zabbix/zabbix_agent2.d/redis_status.sh
#!/bin/bash
KEY=$1
redis-cli -p 6379 info | grep "\<${KEY}\>" | awk -F ':' '{print $NF}'

[root@centos8 ~]# systemctl restart zabbix-agent2

#服务器测试
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -k redis.status[used_memory]
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -k redis.status[total_system_memory]
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -k redis.status[connected_clients]

配置 Zabbix Web

  • 创建自定义模板
  • 在上面的模板中创建监控项
  • 在模板上创建2个图形,连接状态和内存状态

568
569

注意: total_system_memory 的类型为图形总数

570
571

  • 创建触发器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#当Redis连接数达到最大连接数的70%: 活跃连接数/最大连接数*100 >70
#宏定义: {$REDIS.CLIENTS.MAX}=70
#名称:Redis活跃连接数达到{$REDIS.CLIENTS.MAX}
#问题形式:
{ Template Redis status :redis.status[connected_clients].avg(1m)}/{Template Redis status:redis.config.maxclients.last()}*100 >={$REDIS.CLIENTS.MAX}

#当Redis内存使用率达到50%:(used_memory/total_system_memory*100> 50 )
#宏定义: {$REDIS.MEM.MAX}=50
#名称:Redis 已用内存达到{$REDIS.MEM.MAX}
#问题形式:
{ Template Redis
status:redis.status[used_memory].last()}/{Template Redis
status:redis.status[total_system _memory].last()}*100>={$REDIS.MEM.MAX}

#测试
[root@rocky8 ~]# redis-cli
127.0.0.1:6379> debug populate 5000000
  • 将自定模板关联主机

监控 Nginx 服务

自定义监控项监控 nginx 状态页

1
2
3
4
5
6
7
8
9
10
11
[root@rocky8 ~]# vim /etc/nginx/conf.d/default.conf
# 加入
location /nginx_status {
stub_status;
access_log off;
allow 127.0.0.1;
deny all;
}

# 重启服务
[root@rocky8 ~]# systemctl restart nginx

配置 agent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
[root@rocky8 ~]# vim /etc/zabbix/zabbix_agentd.d/nginx_status.sh 
#!/bin/bash
# Description:zabbix监控nginx性能以及进程状态
HOST="127.0.0.1"
PORT="80"
URL=nginx_status

# 检测nginx进程是否存在
case $1 in
ping)
pidof nginx | wc -l
;;
# 检测nginx性能
active)
curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==1{print $NF}'
;;

reading)
curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==4{print $2}'
;;
writing)
curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==4{print $4}'
;;

waiting)
curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==4{print $6}'
;;
accepts)
curl -s "http://$HOST:$PORT/$URL/" |awk 'NR==3{print $1}'
;;
handled)
curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==3{print $2}'
;;

requests)
curl -s "http://$HOST:$PORT/nginx_status/" | awk 'NR==3{print $3}'
;;
*)
echo "Usage `basename $0` {ping | active | reading | writing | waiting | accepts | handled | requests }"
esac


[root@rocky8 ~]# chmod +x /etc/zabbix/zabbix_agent2.d/nginx_status.sh
[root@rocky8 ~]# /etc/zabbix/zabbix_agent2.d/nginx_status.sh active
# 成功
1

#添加监控配置
[root@rocky8 ~]#vim /etc/zabbix/zabbix_agent2.d/nginx.conf
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agent2.d/nginx_status.sh $1

#agent测试
[root@rocky8 ~]# zabbix_agent2 -t nginx.status[ping]
nginx.status[ping] [s|1]

[root@rocky8 ~]# zabbix_agent2 -t nginx.status[active]
nginx.status[active] [s|1]

[root@rocky8 ~]# systemctl restart zabbix-agent2.service

#服务器测试
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -k nginx.status[ping]
1

[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -k nginx.status[active]
1

配置 Zabbix Web

  • 创建模板
  • 创建8个监控项
  • 创建触发器(为ping设定监控项)
  • 创建图形
  • 关联对应主机

监控 MySQL 服务

percona 提供了相关的监控MySQL的插件,不过此项目已经不再开发,官网访问链接已经从首页删除,只能直接从下面链接访问

注意: percona提供的最新1.1.8版本对应的模板只适配与zabbix3.0之前的版本

1
https://www.percona.com/downloads/percona-monitoring-plugins/

572

监控MySQL 状态

使用 MySQL 自定义模板,监控mysql性能,可以监控如下内容:OPS(增删改查)、mysql请求流量带宽,mysql响应流量带宽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
[root@centos8 ~]# yum -y install mysql-server
[root@centos8 ~]# systemctl enable --now mysqld
[root@centos8 ~]# mysql -e 'create user zabbix@"localhost" identified by "123456"'
[root@centos8 ~]# grep "^Include" /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=mysql.version,mysql -V
UserParameter=mysql.status[*],/etc/zabbix/zabbix_agentd.d/check_mysql.sh $1 2> /dev/null
UserParameter=mysql.ping,mysqladmin -uzabbix -p123456 -P3306 -h127.0.0.1 ping 2>/dev/null | grep -c alive

[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/check_mysql.sh
#!/bin/bash
#
MYSQL_USER='zabbix'
MYSQL_PWD='123456'
MYSQL_HOST='127.0.0.1'
MYSQL_PORT='3306'
MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}"
#MYSQL_CONN=mysql -e "show global status" | awk -v s=$1 '$1 ~ "^"s"$"{print $2}'
if [ $# -ne "1" ];then
echo "arg error!"
fi
case $1 in
Threads)
result=`${MYSQL_CONN} status |awk '{print $4}'`
;;
Uptime)
result=`${MYSQL_CONN} status|cut -f2 -d":"|cut -f1 -d"T"`
;;
Com_update)
result=`${MYSQL_CONN} extended-status |grep -w "Com_update"|cut -d"|" -f3`
;;
Slow_queries)
result=`${MYSQL_CONN} status |cut -f5 -d":"|cut -f1 -d"O"`
;;
Com_select)
result=`${MYSQL_CONN} extended-status |grep -w "Com_select"|cut -d"|" -f3`
;;
Com_rollback)
result=`${MYSQL_CONN} extended-status |grep -w "Com_rollback"|cut -d"|" -f3`
;;
Questions)
result=`${MYSQL_CONN} status|cut -f4 -d":"|cut -f1 -d"S"`
;;
Com_insert)
result=`${MYSQL_CONN} extended-status |grep -w "Com_insert"|cut -d"|" -f3`
;;
Com_delete)
result=`${MYSQL_CONN} extended-status |grep -w "Com_delete"|cut -d"|" -f3`
;;
Com_commit)
result=`${MYSQL_CONN} extended-status |grep -w "Com_commit"|cut -d"|" -f3`
;;
Bytes_sent)
result=`${MYSQL_CONN} extended-status |grep -w "Bytes_sent" |cut -d"|" -f3`
;;
Bytes_received)
result=`${MYSQL_CONN} extended-status |grep -w "Bytes_received" |cut -d"|" -f3`
;;
Com_begin)
result=`${MYSQL_CONN} extended-status |grep -w "Com_begin"|cut -d"|" -f3`
;;
*)
echo
"Usage:$0(Threads|Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
;;
esac

echo $result


[root@centos8 ~]# chmod +x /etc/zabbix/zabbix_agentd.d/check_mysql.sh
[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.version'
mysql Ver 8.0.21 for Linux on x86_64 (Source distribution)

[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.status[Uptime]'
1141

[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.status[Slow_queries]'
0

[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k mysql.ping'
1

#停止MySQL服务后再测试看到下面结果
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.ping'
0

#按下面操作导入自定义模板

573
574
575

监控 MySQL 主从复制

Agent 端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@centos8 ~]# cat/etc/zabbix/zabbix_agent2.d/mysql_repl_status.sh
#!/bin/bash
KEY=$1
PASS='123456'
mysql -uroot -p$PASS -e "show slave status\G"|grep "${KEY}"|awk '{print $NF}'

[root@centos8 ~]# cat /etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=mysql.repl.status[*],
/etc/zabbix/zabbix_agent2.d/mysql_repl_status.sh "$1"

#服务器取值测试
[root@zabbix ~]# zabbix_get -s 10.0.0.8 -k mysql.repl.status[Slave_SQL_Running]
[root@zabbix ~]# zabbix_get -s 10.0.0.8 -k mysql.repl.status[Slave_IO_Running]
[root@zabbix ~]# zabbix_get -s 10.0.0.8 -k mysql.repl.status[Second_Behind_Master]

配置 Zabbix Web

  • 创建模板

  • 创建监控项(添加三个监控项)

    注意: 线程状态的监控项的信息类型为字符,复制延时的监控项为数字

  • 创建触发器(添加两个触发器)

1
2
3
4
5
6
7
8
#触发器1:名称:复制线程异常, 两个复制线程状态都要为 Yes 
{Template MysQL slave {Temp1ate MySQL repl
status:mysql.repl.status[Slave_IO_Running].str(Yes)}=0 or {Template MySQL repli
status :mysql.repl.status[Slave_SQL_Running].str(Yes)}=0

#触发器2: 名称:复制延时不超过100s
{Template MysQL repl
status:mysql.repl.status[Second_Behind_Master].last()]}>=100
  • 关联对应主机

监控 Keepalived 集群的脑裂问题

生产中使用的 Keepalive集群 ,偶尔会出现两台 Keepalive 上都有 VIP 的情况,即经常所说的“脑裂”问题,为避免对线上业务造成不可估量的损失,利用Zabbix 监控及时发现和解决这一问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#自定义报警的key
[root@ubuntu1804 ~]# cat /apps/zabbix/etc/zabbix_agentd.conf.d/check_keepalived.conf
UserParameter=check_keepalived[*],/bin/bash /apps/zabbix/etc/zabbix_agentd.conf.d/check_vip.sh

#自定义监控项脚本
[root@ubuntu1804 ~]# cat /apps/zabbix/etc/zabbix_agentd.conf.d/check_vip.sh
#!/bin/bash
#
VIP="10.0.0.10"
NET="eth0"
CHECK_MAC=$(arping -c 1 -I $NET $VIP|awk -F"[][]" '/Unicast/{print $2}'|wc -l)
if [[ $CHECK_MAC -gt 1 ]]
then
result=1
else
result=0
fi

echo $result

Zabbix 利用 Grafana 进行图形展示

576

虽然Zabbix自身带有图形功能,但是并不美观,而利用grafana可以实现美轮美奂的 Web 图形显示

grafana 是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库

Grafana支持许多不同的数据源。每个数据源都有一个特定的查询编辑器,该编辑器定制的特性和功能是公开的特定数据来源。 官方支持以下数据源:Graphite,Elasticsearch,InfluxDB,Prometheus,Cloudwatch,MySQL和OpenTSDB等。

官方站点: https://grafana.com/

使用 grafana 显示Zabbix的监控数据过程

  • 安装grafana
  • 安装 zabbix 插件
  • 新建zabbix 数据源
  • 导入 dashboard 模板

注意: 如果浏览器无法正常显示grafana的图形,可能是浏览器版本问题,建议更换浏览器再尝试

安装 Grafana 包

CentOS8 系统AppStream源带有 grafana,CentOS7 则无此包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@zabbix-server ~]#yum info grafana
Last metadata expiration check: 0:58:43 ago on Tue 13 Jul 2021 08:40:31 AM CST.
Available Packages
Name : grafana
Version : 6.7.4
Release : 3.el8
Architecture : x86_64
Size : 28 M
Source : grafana-6.7.4-3.el8.src.rpm
Repository : AppStream
Summary : Metrics dashboard and graph editor
URL : https://grafana.org
License : ASL 2.0
Description : Grafana is an open source, feature rich metrics dashboard and graph editor for
: Graphite, InfluxDB & OpenTSDB.

包下载链接:

1
2
https://grafana.com/grafana/download
https://mirrors.tuna.tsinghua.edu.cn/grafana/

577

最新版本下载安装

1
2
3
4
5
6
7
8
9
10
11
12
#新版
#Ubuntu安装
[root@zabbix-server ~]# wget https://mirrors.tuna.tsinghua.edu.cn/grafana/apt/pool/main/g/grafana/grafana_8.0.3_amd64.deb
[root@zabbix-server ~]# dpkg -i grafana_8.0.3_amd64.deb

#CentOS安装
[root@zabbix-server ~]# wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-8.0.3-1.x86_64.rpm
[root@zabbix-server ~]# yum -y install grafana-8.0.3-1.x86_64.rpm

#旧版
[root@zabbix-server ~]# wget https://dl.grafana.com/oss/release/grafana-7.1.5-1.x86_64.rpm
[root@zabbix-server ~]# yum -y install grafana-7.1.5-1.x86_64.rpm

开启 Grafana 服务

1
2
3
4
#无需修改配置文件,即可启动,默认监听3000/tcp端口
[root@zabbix-grafana ~]# systemctl enable --now grafana-server.service
[root@zabbix-grafana ~]# ss -ntlp|grep 3000
LISTEN 0 128 *:3000 *:* users:(("grafana-server",pid=1957,fd=8))

首次登录 Grafana 的 Web 界面

首次浏览器访问 grafana的 web 界面

1
http://grafana-server:3000/

使用默认用户名和密码都是admin登录

578

首次登录修改密码,也可以选择skip仍使用原初始密码

579

登录成功

580

登录用户等信息保存在下面数据文件中

1
2
[root@zabbix-server ~]# file /var/lib/grafana/grafana.db
/var/lib/grafana/grafana.db: SQLite 3.x database, last written using SQLite version 3035004

以下是grafana-7.1.5版本界面

初始登录界面

581

修改初始密码

582

登录成功

583

在 Grafana 安装 Zabbix 插件

关于zabbix的插件官网地址

1
https://grafana.com/grafana/plugins

584
585

1
2
3
4
https://grafana.com/grafana/plugins/alexanderzobnin-zabbix-app

#zabbix插件官方安装说明
https://alexanderzobnin.github.io/grafana-zabbix/installation/

范例: 使用 grafana-cli 命令管理工具安装插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#列出远程的可用插件
[root@zabbix-server ~]# grafana-cli plugins list-remote
id: abhisant-druid-datasource version: 0.0.6
id: aceiot-svg-panel version: 0.0.10
id: ae3e-plotly-panel version: 0.4.0
id: agenty-flowcharting-panel version: 0.9.1
id: aidanmountford-html-panel version: 0.0.2
id: akumuli-datasource version: 1.3.12
......

#查看zabbix相关插件
[root@zabbix-server ~]# grafana-cli plugins list-remote|grep zabbix
id: alexanderzobnin-zabbix-app version: 4.1.5

#列出插件的版本
[root@zabbix-server ~]# grafana-cli plugins list-versions alexanderzobnin-zabbix-app
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.2
.......

#安装zabbix插件,可指定版本,下载安装插件至/var/lib/grafana/plugins/目录
#如果在线下载比较慢,可以先下载相关插件的zip文件,复制到/var/lib/grafana/plugins/目录下,再解压缩也可以
#下链链接https://github.com/alexanderzobnin/grafana-zabbix/releases
[root@zabbix-server ~]# grafana-cli plugins install alexanderzobnin-zabbix-app 4.1.5
✔ Downloaded alexanderzobnin-zabbix-app v4.1.5 zip successfully

Please restart Grafana after installing plugins. Refer to Grafana documentation for instructions if necessary.


#查看已安装的插件
[root@zabbix-server ~]# grafana-cli plugins ls
installed plugins:
alexanderzobnin-zabbix-app @ 4.1.5
Please restart Grafana after installing plugins. Refer to Grafana documentation for instructions if necessary.

#查看安装的插件的目录
[root@zabbix-server ~]# ls /var/lib/grafana/plugins/
alexanderzobnin-zabbix-app
[root@zabbix-server ~]# ls /var/lib/grafana/plugins/alexanderzobnin-zabbix-app/
app_config_ctrl img plugin.json zabbix-plugin_linux_arm64
CHANGELOG.md MANIFEST.txt README.md zabbix-plugin_windows_amd64.exe
css module.js zabbix-plugin_darwin_amd64
dashboards module.js.map zabbix-plugin_linux_amd64
datasource-zabbix panel-triggers zabbix-plugin_linux_arm

#重新启动服务生效
[root@zabbix-server ~]# systemctl restart grafana-server.service

针对Zabbix4.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#列出远程的可用插件
[root@zabbix-grafana ~]# grafana-cli plugins list-remote
id: abhisant-druid-datasource version: 0.0.5
id: aceiot-svg-panel version: 0.0.8
id: agenty-flowcharting-panel version: 0.9.0
id: aidanmountford-html-panel version: 0.0.1
id: akumuli-datasource version: 1.3.11
id: alexanderzobnin-zabbix-app version: 4.0.1
id: alexandra-trackmap-panel version: 1.2.5
id: andig-darksky-datasource version: 1.0.1
id: aquaqanalytics-kdbadaptor-datasource version: 1.0.1
id: ayoungprogrammer-finance-datasource version: 1.0.0

#选择安装版本3.12.4插件,4.0.1版本有问题
[root@zabbix-grafana ~]# grafana-cli plugins install alexanderzobnin-zabbix-app 3.12.4
installing alexanderzobnin-zabbix-app @ 3.12.4
from: https://grafana.com/api/plugins/alexanderzobnin-zabbix-app/versions/3.12.4/download
into: /var/lib/grafana/plugins

✔ Installed alexanderzobnin-zabbix-app successfully

Restart grafana after installing plugins . <service grafana-server restart>

#查看安装的插件文件
[root@zabbix-grafana ~]# ls /var/lib/grafana/plugins
alexanderzobnin-zabbix-app

#重新启动脬务
[root@zabbix-grafana ~]# systemctl restart grafana-server.service

在 Grafana 中启用 Zabbix 插件

586

可以看到zabbix插件已安装成功,点zabbix插件

587

启用插件

588

启用插件成功

589

以下是3.12.4版本

590
591
592
593

添加 Zabbix 数据源

594
595

选中zabbix

596

在URL填写以下信息

1
2
基于HTTP:http://zabbix-server/zabbix/api_jsonrpc.php
基于NGINX:http://zabbix-server/api_jsonrpc.php

输入Zabbix的用户和密码

597

测试连接

598

老版本界面如下

599

在URL填写以下信息

1
http://zabbix-server/zabbix/api_jsonrpc.php

600
601

导入自带的 Grafana 模板

上面界面—Dashboards

602
603
604

可以看到三个导入的dashboard,其中第二个Zabbix System Status 常用于观察告警信息

605

第一个dashboard

606

查看第三个dashboard

607

System load 无数据

608

编辑System load

609

默认的监控项有问题,修改对应的监控项的名称(注意:不是监控项的key)

610

查看到数据出现

611

模板只有CPU,system load和network,可以修改模板再加其它项目的图形显示

612
613
614
615
616
617
618

619

再添加一个文件系统的监控

620
621
622
623
624
625

拖动图形,放在合适的位置,并保存

626

导入官网的其它 Grafana 模板

grafana官网提供了很多图形显示的模板,可以从下面地址查看

1
https://grafana.com/grafana/dashboards

627

搜索合适的模板, 一般推荐使用下载量较大的模板

628

查看模板信息和ID

629

导入5363模板

630
631

导入模板

632

可以选择其它模板 7877

633
634

调整模板显示信息

当前导入的模板不一定都符合要求,可以进一步调整显示信息

默认导入的dashboard无法编辑

635

先将此dashboard设为允许编辑

636
637
638
639
640
641
642

保存修改后模板

643
644

查看生成的 Dashboard

645
646

删除不需要的模板

如果导入的模板不适合,可以删除

647

选择不需要的模板

648
649
650
651
652

自定义 Dashboard

先创建文件夹,然后在文件夹中创建各种图形

创建后记得save,否则刷新页面会导致数据丢失

创建文件夹

Dashboards -> Manage -> New folder ->填写名称(Zabbix) -> Create Dashboard

创建CPU图形

Add an empty panel -> Data source -> 选择 zabbix

Query (数据查询)

  • Group: Zabbix servers
  • Host: Zabbix server
  • Application: CPU
  • Item: 获取负载的监控项,写入正则表达式 /Load/ ,注意大小写敏感
  • Item: 获取时间的监控项 (/time/),再创建另一个Panel 取时间的监控项

图形美化

  • Title:CPU 平均负载
  • Tooltip mode:ALL(展示所有指标的数据)、Single(展示选中的单个指标数据)
  • Unit:CPU负载图形不需要单位(Misc-none)、CPU时间要显示为百分比(Misc-Percent 0-100)

653

创建内存图形

Query A

  • Group: Zabbix servers
  • Host: Zabbix server
  • Application: Memory
  • Item: Total memory

Query B

  • Group: Zabbix servers
  • Host: Zabbix server
  • Application: Memory
  • Item: Available memory

图形美化

  • 选择 Pie chart 图形
  • Title:内存使用百分比
  • unit:单位选择:data -> bytes(IEC)
  • Lable: 标签选择(Name、Value)
  • Legend values:数据使用展示选择(Value、Percent)

创建流量图形

Query A

  • Group: Zabbix servers Host: Zabbix server Application: Interface eth0 Item: /Bits/

图形美化

  • Title:网卡eth0流量
  • unit:单位选择:data -> Unit/sec(SI)
  • Legend values:数据使用展示选择(Last、Min、Max)

654

创建告警面板

将Zabbix的 Web 仪表板的告警加加入Grafana进行展示

Query Mode:Problems

Visualizations:Zabbix Problems

Title:Zabbix 告警信息

655

导出 Dashboard

导出上面自定义的dashboard 为Json文件, 以方便以后使用

656
657
658

自定义变量实现自定义 Dashboard

以上都是单台Zabbix Server 服务器的图形比较容易展现,但需要展示多台服务器的图形就需要在从头到尾创建一次,过程比较繁琐

可以使用变量的方式获取对应的主机组,以及主机,然后基于变量来完成图形创建

创建变量

打开指定Dashboard –> Dashboard Settings –> Variables

659

设置主机组变量:

660

1
2
3
4
5
6
7
Name:定义名称Group
Data source:选择zabbix
Refresh: 跟随时间而变化 on time range
Query Type:选择Group
Group: 提取所有组的正则表达式:/.*/
Selection Options:全部打开
Preview of values:会自动显示当前所有的主机组

设置主机变量:

661

1
2
3
4
5
6
7
8
Name:定义名称Host
Data source:选择zabbix
Refresh: 跟随时间而变化 on time range
Query Type:选择Host
Group: 提取所有组的正则表达式:/.*/
Host: 提取所有主机的正则表达式:/.*/
Selection Options:全部打开
Preview of values:会自动显示当前所有的主机

设置完成后记得Save保存

使用变量

将此前创建的CPU负载图形,修改为变量方式,这样就会更加灵活

662

Query A

1
2
3
4
Group: $Group
Host: $Host
Application:CPU
Item: /Load/

Title:

1
$Group $Host CPU 平均负载

参考上面的,将CPU时间,内存使用百分比,网卡eth0流量都改为使用变量

663
664

将上面自定义的 Dashborad 导出至文件

导出为json文件

665

将上面自定义的 Dashborad 文件导入

将来在另一台主机上导入上面的json文件即可

666
667
668
669

Zabbix 分布式实现 Proxy

Zabbix Proxy 工作原理

Zabbix Proxy 概述

zabbix作为一个分布式监控系统(分布式监控解决方案),支持通过代理(proxy)收集zabbix agent的监控数据,然后由zabbix proxy再把数据发送给zabbix server,也就是zabbix proxy 可以代替zabbix server收集监控数据,然后把数据汇报给zabbix server,所以zabbix proxy可以在一定程度上分担了zabbix server的数据收集压力,从而降低了数据的采集时间、也相应的增加了zabbix server的监控能力。

官方文档:

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/distributed_monitoring
https://www.zabbix.com/documentation/4.0/zh/manual/distributed_monitoring

Zabbix Proxy 使用场景

  • 监控远程区域设备,尤其是多机房和多个云环境时
  • 监控网络不稳定区域,避免跨网段监控的告警不及时
  • 当需要监控设备众多时,使用它来减轻 Zabbix Server 的压力
  • 简化分布式监控的维护,无需各位创建 Zabbix Server,统一管理策略

Zabbix Proxy 架构

670

Zabbix proxy 功能列表

官方文档:

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/distributed_monitoring/proxies
https://www.zabbix.com/documentation/4.0/zh/manual/distributed_monitoring/proxies

zabbix proxy 是一个数据收集器,它不计算触发器、不处理事件、不发送报警。有关proxy功能的概述,

如下表:

功能 proxy支持列表
Items
Zabbix agent checks Yes
Zabbix agent checks (active) Yes
Simple checks Yes
Trapper items Yes
SNMP checks Yes
SNMP traps Yes
IPMI checks Yes
JMX checks Yes
日志文件监控Log file monitoring Yes
内部检查Internal checks Yes
SSH checks Yes
Telnet checks Yes
外部检查External checks Yes
Dependent items Yes
Script items Yes
内置web监控Built-in web monitoring Yes
Item value preprocessing Yes
网络发现Network discovery Yes
Active agent autoregistration Yes
自动发现Low-level discovery Yes
远程命令Remote commands Yes
触发器计算Calculating triggers No
处理事件Processing events No
Event correlation No
发送报警Sending alerts No

Zabbix Server 和 Zabbix Proxy 区别

Zabbix Proxy 只执行数据收集,不运行触发器,无处理事件,也不发送告警,无Web管理界面

所以最终导致告警延时可能会比较长

zabbix server zabbix proxy
轻量级
图形化
独立工作 是,可实现数据采集,存储,分析,展示 是,可实现数据采集和存储
维护 容易 很容易,配置完成后基本无需管理
独立数据库 有独立数据库,保留指定时间内的所有数据 每个Proxy都有独立数据库,保留部分数据
告警通知 支持邮件,短信,微信等告警机制 不支持

Zabbix Proxy 安装和配置

Zabbix Proxy 也分主动模式和被动模式,通信方式与zabbix server主动模式和被动模式一样

Zabbix Proxy的模式 是从Zabbix Proxy 角度来说的

zabbix proxy在主动模式下要主动地向zabbix server周期性的申请获取zabbix agent的监控项信息,此模式可以大幅降低Zabbix Server的压力,生产推荐使用

Zabbix Proxy在被动模式下要被动地等待zabbix server的连接,并接受zabbix server发送的监控项指令,然后再由zabbix proxy向zabbix agent发起请求获取数据。

注意: Zabbix Proxy的大版本必须要和zabbix server版本相同,否则很可能会导致出现zabbix server与zabbix proxy不兼容问题

安装环境准备

671

地址 角色 安装方法 系统
10.0.0.100 Zabbix Server,MySQL CentOS 8,Ubuntu18.04
10.0.0.101 Zabbix Proxy主动模式,MySQL 包安装 CentOS 8,Ubuntu18.04
10.0.0.102 Zabbix Proxy 被动模式,MySQL 编译安装 CentOS 8,Ubuntu18.04

官方安装文档

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/installation/install_from_packages/debian_ubuntu
https://www.zabbix.com/documentation/5.0/zh/manual/installation/install_from_packages/rhel_centos

安装 Zabbix Proxy

可以通过包和编译两种方式进行安装

二进制包安装

范例: Ubuntu 安装 Zabbix Proxy

1
2
3
4
5
6
7
8
9
10
11
12
#Ubuntu20.04
[root@zabbix-proxy]# wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1%2Bfocal_all.deb

#Ubuntu18.04
[root@zabbix-proxy]# wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+bionic_all.deb

[root@zabbix-proxy]# dpkg -i zabbix-release_5.0-1+bionic_all.deb
[root@zabbix-proxy]# sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/apt/sources.list.d/zabbix.list

[root@zabbix-proxy]# apt update
[root@zabbix-proxy]# apt -y install zabbix-proxy-mysql zabbix-agent
[root@zabbix-proxy]# systemctl enable zabbix-proxy.service zabbix-agent.service

范例: CentOS 安装 Zabbix Proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@zabbix-proxy-active ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
[root@zabbix-proxy-active ~]# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/8/x86_64/zabbix-release-4.0-2.el8.noarch.rpm

#修改为阿里云源
[root@zabbix-proxy-active ~]# vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/8/x86_64/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

#或者sed修改
[root@zabbix-proxy-active ~]# sed -i.bak 's/repo.zabbix.com/mirrors.aliyun.com\/zabbix/' /etc/yum.repos.d/zabbix.repo

[root@zabbix-proxy-active ~]# yum -y install zabbix-proxy-mysql zabbix-agent

[root@zabbix-proxy-active ~]# rpm -ql zabbix-proxy-mysql
/etc/logrotate.d/zabbix-proxy
/etc/zabbix/zabbix_proxy.conf
/usr/lib/.build-id
/usr/lib/.build-id/a1
/usr/lib/.build-id/a1/03f07446a72d32dcfc88cbff0f5d8317b65fac
/usr/lib/systemd/system/zabbix-proxy.service
/usr/lib/tmpfiles.d/zabbix-proxy.conf
/usr/lib/zabbix/externalscripts
/usr/sbin/zabbix_proxy_mysql
/usr/share/doc/zabbix-proxy-mysql
/usr/share/doc/zabbix-proxy-mysql/AUTHORS
/usr/share/doc/zabbix-proxy-mysql/COPYING
/usr/share/doc/zabbix-proxy-mysql/ChangeLog
/usr/share/doc/zabbix-proxy-mysql/NEWS
/usr/share/doc/zabbix-proxy-mysql/README
/usr/share/doc/zabbix-proxy-mysql/schema.sql.gz
/usr/share/man/man8/zabbix_proxy.8.gz
/var/log/zabbix
/var/run/zabbix

源码编译安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#CentOS8安装
[root@zabbix-proxy-passive ~]# yum -y install gcc mysql-devel libxml2-devel net-snmp-devel libssh2-devel curl-devel pcre-devel libevent-devel

#Ubuntu18.04安装
[root@zabbix-proxy-passive ~]# apt -y install gcc make libxml2-dev libevent-dev libmysqlclient-dev libsnmp-dev libssh2-1-dev libcurl4-openssl-dev

[root@zabbix-proxy-passive ~]# useradd zabbix
[root@zabbix-proxy-passive ~]# wget https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.13.tar.gz

#旧版
[root@zabbix-proxy-passive ~]# wget https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.24.tar.gz
[root@zabbix-proxy-passive ~]# tar xf zabbix-5.0.13.tar.gz
[root@zabbix-proxy-passive ~]# tar xf zabbix-4.0.24.tar.gz
[root@zabbix-proxy-passive ~]# cd zabbix-5.0.13/
[root@zabbix-proxy-passive ~]# cd zabbix-4.0.24/
[root@zabbix-proxy-passive zabbix-5.0.13]# ./configure --prefix=/apps/zabbix_proxy \
--enable-proxy --with-agent --with-net-snmp --with-mysql --with-ssh2 --with-libcurl \
--with-libxml2

[root@zabbix-proxy-passive zabbix-4.0.24]# ./configure --prefix=/apps/zabbix_proxy \
--enable-proxy --with-agent --with-net-snmp --with-mysql --with-ssh2 --with-libcurl \
--with-libxml2

[root@zabbix-proxy-passive zabbix-4.0.24]# make && make install

#创建service文件
[root@zabbix-proxy-passive ~]# cat /lib/systemd/system/zabbix-proxy.service
[Unit]
Description=Zabbix Proxy
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/apps/zabbix_proxy/etc/zabbix_proxy.conf"
EnvironmentFile=-/etc/sysconfig/zabbix-proxy
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_proxy.pid
KillMode=control-group
ExecStart=/apps/zabbix_proxy/sbin/zabbix_proxy -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
TimeoutSec=0

[Install]
WantedBy=multi-user.target

[root@zabbix-proxy-passive ~]# systemctl daemon-reload

准备数据库

为Zabbix Proxy 创建一个单独的数据库

注意:Zabbix server和Zabbix proxy不能使用相同的数据库。 如果它们安装在同一主机上,则proxy数据库必须具有不同的名称

为主动模式的 Proxy 准备独立的数据库

在MySQL 服务器上创建数据库和用户授权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@zabbix-proxy-active ~]# apt -y install mysql-server
[root@zabbix-proxy-active ~]# mysql
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.17 |
+-----------+
1 row in set (0.00 sec)

mysql> create database zabbix_proxy_active character set utf8 collate utf8_bin;
mysql> create user proxy@'localhost' identified by '123456';
mysql> grant all on zabbix_proxy_active.* to proxy@'localhost' ;

#从Proxy主机导入和zabbix Server不同的数据库和表
[root@zabbix-proxy-active ~]# yum -y install mysql
[root@zabbix-proxy-active ~]# apt -y install mysql

#包安装的路径
[root@zabbix-proxy-active ~]# zcat /usr/share/doc/zabbix-proxy-mysql/schema.sql.gz | mysql -uproxy -p123456 -h10.0.0.101 zabbix_proxy_active

为被动模式的 proxy 准备独立的数据库

1
2
3
4
5
6
7
8
9
10
11
[root@zabbix-proxy-passive ~]# apt -y install mysql-server
[root@zabbix-proxy-passive ~]# mysql
mysql> create database zabbix_proxy_passive character set utf8 collate utf8_bin;
mysql> grant all on zabbix_proxy_passive.* to proxy@'10.0.0.%' identified by '123456' ;

#创建被动模式使用的数据库和表
[root@zabbix-proxy-passive zabbix-5.0.13]# pwd
/root/zabbix-5.0.13

#源码编译的路径
[root@zabbix-proxy-passive zabbix-5.0.13]# mysql -uproxy -p123456 zabbix_proxy_passive < database/mysql/schema.sql

MySQL 8.0 特殊配置

MySQL 8.0 出现下面错误

1
2
3
4
5
6
7
[root@zabbix-proxy-active ~]# tail /var/log/zabbix/zabbix_proxy.log
6606:20200830:223952.519 using configuration file: /etc/zabbix/zabbix_proxy.conf
6606:20200830:223952.520 [Z3001] connection to database 'zabbix_proxy_active'
failed: [2059] Plugin caching_sha2_password could not be loaded:
lib64/mariadb/plugin/caching_sha2_password.so: cannot open shared object file: No
such file or directory
6606:20200830:223952.520 Cannot connect to the database. Exiting...

错误原因:

1
2
MySQL8.0 默认使用caching_sha2_password作为身份验证插件,而旧版是使用mysql_native_password。
当连接MySQL时报错“plugin caching_sha2_password could not be loaded”时,可换回旧版插件。

解决方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#方法1
[root@zabbix-mysql-master ~]# mysql
mysql>ALTER USER 'proxy'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'; #修改密码加密策略
mysql>FLUSH PRIVILEGES;

#下面步骤可选
mysql>grant SUPER on *.* to proxy@'localhost' ;
mysql>ALTER USER 'proxy'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;

#方法2
#Ubuntu20.04
[root@ubuntu2004 ~]# echo 'default-authentication-plugin=mysql_native_password' >> /etc/mysql/mysql.conf.d/mysqld.cnf
[root@ubuntu2004 ~]# systemctl restart mysql

#Rocky和CentOS
[root@zabbix-mysql-master ~]# echo 'default-authentication-plugin=mysql_native_password' >> /etc/my.cnf.d/mysql-server.cnf
[root@zabbix-mysql-master ~]# systemctl restart mysqld

主动模式配置

修改proxy配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
[root@zabbix-proxy-active ~]# grep '^[^#]' /etc/zabbix/zabbix_proxy.conf 
ProxyMode=0 #主动模式为0,被动模式为1,默认为0即主动模式
Server=10.0.0.100 #指向Zabbix Server
Hostname=zabbix-proxy-active #此名称必须和后面Web管理页的agent代理程序名称相同
DBHost=localhost #MySQL服务器地址
DBName=zabbix_proxy_active #MySQL 数据库名
DBUser=proxy #连接MySQL的用户
DBPassword=123456 #连接MySQL的用户密码
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
DebugLevel=4 #指定日志级别,默认为3,值越大日志越详细
EnableRemoteCommands=1 #开启远程命令,允许server到proxy上执行命令,在故障自愈时使用
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
ProxyLocalBuffer=360 #当proxy将数据发送给server后将数据仍在本地保存多少时间,默认不保留
ProxyOfflineBuffer=720 #当proxy和server无法连接时将数据在本地保存多长时间,默认1小时
HeartbeatFrequency=60 #server端用来检测proxy可用性的心跳信息的时间间隔,被动模式无效
ConfigFrequency=60 #每间隔多少时间到server获取监控项,在agent更新端监控项,只在主动模式有效,默认3600s
DataSenderFrequency=60 #数据发送的间隔时间,只在主动模式有效,默认1s,建议加长
JavaGateway=10.0.0.101 #指向JAVA gateway主机
StartJavaPollers=10 #指定开启的进程数,默认为0,即不开启
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
CacheSize=8M #当主机数量很多时,会将获取的监控项存放在缓存中,生产中设置2G
StartDBSyncers=4 #启动多少个线程和数据库连接
HistoryCacheSize=16M #保存agent发送过来的监控数据的内存空间大小,生产中设置2G
HistoryIndexCacheSize=4M #历史数据的索引
Timeout=30 #获取数据的最长等待时间
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000 #慢查询时长

[root@zabbix-proxy-active ~]# systemctl restart zabbix-proxy.service

#Zabbix Proxy 监听10051/tcp端口
[root@zabbix-proxy-active ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10051 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:10050 [::]:*
LISTEN 0 128 [::]:10051 [::]:*
LISTEN 0 70 *:33060 *:*
LISTEN 0 128 *:3306 *:*

[root@zabbix-proxy-active ~]# tail /var/log/zabbix/zabbix_proxy.log -f
6832:20200830:225242.864 cannot send proxy data to server at "10.0.0.100": proxy "zabbix-proxy-active" not found
6832:20200830:225243.867 cannot send proxy data to server at "10.0.0.100": proxy "zabbix-proxy-active" not found
6832:20200830:225244.870 cannot send proxy data to server at "10.0.0.100": proxy "zabbix-proxy-active" not found
6832:20200830:225245.875 cannot send proxy data to server at "10.0.0.100": proxy "zabbix-proxy-active" not found

[root@zabbix-proxy-active ~]# pstree -p|grep zabbix
|-zabbix_agentd(5530)-+-zabbix_agentd(5532)
| |-zabbix_agentd(5533)
| |-zabbix_agentd(5534)
| |-zabbix_agentd(5535)
| `-zabbix_agentd(5536)
`-zabbix_proxy(6822)-+-zabbix_proxy(6825)
|-zabbix_proxy(6826)
|-zabbix_proxy(6827)
|-zabbix_proxy(6828)
|-zabbix_proxy(6829)
|-zabbix_proxy(6830)
|-zabbix_proxy(6831)
|-zabbix_proxy(6832)
|-zabbix_proxy(6833)
|-zabbix_proxy(6834)
|-zabbix_proxy(6835)
|-zabbix_proxy(6836)
|-zabbix_proxy(6837)
|-zabbix_proxy(6838)
|-zabbix_proxy(6839)
|-zabbix_proxy(6840)
|-zabbix_proxy(6841)
|-zabbix_proxy(6842)
|-zabbix_proxy(6843)
|-zabbix_proxy(6844)
|-zabbix_proxy(6845)
|-zabbix_proxy(6846)
|-zabbix_proxy(6847)
|-zabbix_proxy(6848)
|-zabbix_proxy(6849)
|-zabbix_proxy(6850)
|-zabbix_proxy(6851)
|-zabbix_proxy(6852)
|-zabbix_proxy(6853)
|-zabbix_proxy(6854)
|-zabbix_proxy(6855)
|-zabbix_proxy(6856)
|-zabbix_proxy(6857)
`-zabbix_proxy(6858)

[root@zabbix-proxy-active ~]# ps -ef|grep zabbix
zabbix 5530 1 0 22:07 ? 00:00:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix 5532 5530 0 22:07 ? 00:00:00 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
zabbix 5533 5530 0 22:07 ? 00:00:00 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
zabbix 5534 5530 0 22:07 ? 00:00:00 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
zabbix 5535 5530 0 22:07 ? 00:00:00 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
zabbix 5536 5530 0 22:07 ? 00:00:00 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
......

修改Zabbix Agent 配置文件为主动模式的 Zabbix Proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@centos8 ~]# vim /apps/zabbix_agent/etc/zabbix_agentd.conf
[root@centos8 ~]# grep '^[^#]' /apps/zabbix_agent/etc/zabbix_agentd.conf
LogFile=/tmp/zabbix_agentd.log
Server=10.0.0.100,10.0.0.101 #指向Zabbix Server(可选)和Zabbix Proxy(必选)
ServerActive=10.0.0.101 #指向Zabbix Proxy
Hostname=10.0.0.103

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@centos8 ~]# tail /tmp/zabbix_agentd.log
24239:20200830:233105.235 IPv6 support: NO
24239:20200830:233105.235 TLS support: NO
24239:20200830:233105.235 **************************
24239:20200830:233105.235 using configuration file:
/apps/zabbix_agent/etc/zabbix_agentd.conf
24239:20200830:233105.235 agent #0 started [main process]
24241:20200830:233105.236 agent #2 started [listener #1]
24242:20200830:233105.236 agent #3 started [listener #2]
24244:20200830:233105.236 agent #5 started [active checks #1]
24240:20200830:233105.239 agent #1 started [collector]
24243:20200830:233105.239 agent #4 started [listener #3]
#查看proxy的日志
[root@zabbix-proxy-active ~]# tail /var/log/zabbix/zabbix_proxy.log -f
6825:20200830:232931.970 received configuration data from server at "10.0.0.100", datalen 13700
6830:20200830:233014.074 cannot send list of active checks to "127.0.0.1": host [Zabbix server] not found
6825:20200830:233032.035 received configuration data from server at "10.0.0.100", datalen 13700
6857:20200830:233117.070 enabling Zabbix agent checks on host "10.0.0.103": host became available
6825:20200830:233132.101 received configuration data from server at "10.0.0.100", datalen 13700
6826:20200830:233214.152 cannot send list of active checks to "127.0.0.1": host [Zabbix server] not found
6825:20200830:233232.159 received configuration data from server at "10.0.0.100", datalen 13700
6825:20200830:233332.231 received configuration data from server at "10.0.0.100", datalen 13700
6828:20200830:233414.228 cannot send list of active checks to "127.0.0.1": host [Zabbix server] not found
6825:20200830:233432.291 received configuration data from server at "10.0.0.100", datalen 13700
6825:20200830:233532.356 received configuration data from server at "10.0.0.100", datalen 13700
6828:20200830:233614.299 cannot send list of active checks to "127.0.0.1": host [Zabbix server] not found
6825:20200830:233632.412 received configuration data from server at "10.0.0.100", datalen 13700

在 Zabbix Server 上添加代理 Proxies

管理– agent 代理程序(英文环境为Proxies,汉化翻译不准确)

注意:agent代理程序名称要和proxy 配置文件中Hostname指定的名称相同,否则会现 proxy “zabbix-proxy-active” not found的日志提

672
673

中文界面

674
675
676

在Zabbix Server 上配置 Zabbix Agent 使用主动代理

677
678

验证主机状态

注意: 如果不成功,可以删除后再重新添加监控的主机或者重启动 proxy 服务

679
680

被动模式配置

配置文件说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# vim /apps/zabbix_proxy/etc/zabbix_proxy.conf
ProxyMode=1 #0为主动,1为被动,此为默认
server=10.0.0.100 #zabbix server服务器的地址
Hostname=zabbix-proxy-passive-wang #代理服务器名称,需要与zabbix server添加代理时候的
proxy
DBHost=10.0.0.101 #数据库服务器地址
DBName=zabbix_proxy_passive #数据库库名称
DBUser=proxy #连接数据库的用户名称
DBPassword=123456 #数据库用户密码
DBPort=3306 #数据库端口
ListenPort=10051 #zabbix proxy监听端口
LogFile=/tmp/zabbix_proxy.log
Enab1eRemoteCommands=1 #允许zabbix server执行远程命令
ProxyLocalBuffer=720 #已经提交到zabbix server的数据保留时间
ProxyofflineBuffer=720 #未提交到zabbix server的时间保留时间
ConfigFrequency=5 #间隔多少秒从zabbix server获取监控项信息,此横在被动模式无效
startPo1lers=20 #启动的数据采集器数量
javaGatewayPort=10052 #Java gateway服务端口
startJavaPollers=20 #启动多少个线程采集数据
cachesize=2G #保存监控项而占用的最大内存
Historycachesize=2G #保存监控历史数据占用的最大内存
HistoryIndexcachesize=128M #历史索引缓存的大小
Timeout=30 #监控项超时时间,单位为秒
LogslowQueries=3000 #毫秒,多久的数据库查询会被记录到日志
HeartbeatFrequency=60 #心跳间隔检测时间,默认60秒,范围0-3600秒,被动模式不使用
DatasenderFrequency=5 #数据发送时间间隔,默认为1秒,范围为1-3600秒,被动模式不使用
JavaGateway=10.0.0.102 #java gateway服务器地址,当需要监控java的时候必须配置否则监控不到数据

修改proxy配置文件

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
[root@zabbix-proxy-passive ~]# grep '^[^#]' /apps/zabbix_proxy/etc/zabbix_proxy.conf
ProxyMode=1 #被动模式为1
Server=10.0.0.100 #指向zabbix server的地址
Hostname=zabbix-proxy-passvie-wang
LogFile=/tmp/zabbix_proxy.log
DBHost=localhost #指定MySQL的地址
DBName=zabbix_proxy_passive #指定MySQL数据库名称
DBUser=proxy #指定MySQL的用户
DBPassword=123456 #指定MySQL的用户密码
ProxyLocalBuffer=360
ProxyOfflineBuffer=720
JavaGateway=10.0.0.102
StartJavaPollers=10
CacheSize=8M
StartDBSyncers=4
HistoryCacheSize=16M
HistoryIndexCacheSize=4M
Timeout=30
LogSlowQueries=3000

[root@zabbix-proxy-passive zabbix-5.0.14]# grep -Ev '^$|#' /apps/zabbix_proxy/etc/zabbix_proxy.conf
ProxyMode=1
Server=10.0.0.100
Hostname=Zabbix proxy passive
LogFile=/tmp/zabbix_proxy.log
DBName=zabbix_proxy_passive
DBUser=proxy
DBPassword=123456
HeartbeatFrequency=10
ConfigFrequency=10
DataSenderFrequency=1
Timeout=4
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1

[root@zabbix-proxy-passive ~]# systemctl enable --now zabbix-proxy.service

#查看是否打开10051/tcp端口,如果没有打开检查是否能连接MySQL
[root@zabbix-proxy-passive ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10051 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*

#查看日志
[root@zabbix-proxy-passive ~]# tail -f /tmp/zabbix_proxy.log
44417:20200830:225813.637 proxy #19 started [java poller #7]
44419:20200830:225813.637 proxy #21 started [java poller #9]
44429:20200830:225813.638 proxy #31 started [icmp pinger #1]
44421:20200830:225813.639 proxy #23 started [self-monitoring #1]
44427:20200830:225813.640 proxy #29 started [poller #5]
44423:20200830:225813.644 proxy #25 started [poller #1]
44426:20200830:225813.651 proxy #28 started [poller #4]
44425:20200830:225813.655 proxy #27 started [poller #3]
44424:20200830:225813.662 proxy #26 started [poller #2]
44428:20200830:225813.666 proxy #30 started [unreachable poller #1]
44398:20200830:225926.043 Got signal [signal:15(SIGTERM),sender_pid:44446,sender_uid:0,reason:0]. Exiting ...
44407:20200830:225926.043 syncing history data in progress...
44407:20200830:225926.043 syncing history data done
44398:20200830:225926.055 Zabbix Proxy stopped. Zabbix 4.0.24 (revision
5d83af7935).
44450:20200830:225926.067 Starting Zabbix Proxy (passive) [zabbix-proxy-passvie-wang]. Zabbix 4.0.24 (revision 5d83af7935).
44450:20200830:225926.067 **** Enabled features ****
44450:20200830:225926.067 SNMP monitoring: YES
44450:20200830:225926.067 IPMI monitoring: NO
44450:20200830:225926.067 Web monitoring: YES
44450:20200830:225926.068 VMware monitoring: YES
44450:20200830:225926.068 ODBC: NO
44450:20200830:225926.068 SSH support: YES
44450:20200830:225926.068 IPv6 support: NO
44450:20200830:225926.068 TLS support: NO
44450:20200830:225926.068 **************************
44450:20200830:225926.068 using configuration file: /apps/zabbix_proxy/etc/zabbix_proxy.conf
44450:20200830:225926.078 current database version (mandatory/optional):
04000000/04000006
44450:20200830:225926.079 required mandatory version: 04000000
44450:20200830:225926.087 proxy #0 started [main process]
44452:20200830:225926.087 proxy #1 started [trapper #1]
44454:20200830:225926.189 proxy #3 started [trapper #3]
44456:20200830:225926.190 proxy #5 started [trapper #5]

在 Zabbix Server 上添加代理 Proxies

注意:选中被动模式和端口10051

681
682

注意: 模板也要使用被动模板

683

在Zabbix Server 上配置Zabbix Agent 使用被动代理

684
685
686

修改Zabbix Agent 配置文件为被动模式的 Zabbix Proxy

1
2
3
4
5
6
7
8
9
10
11
[root@centos8 ~]# grep '^[^#]' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.100,10.0.0.102#必须指向Proxy代理地址,否则Proxy无法监控,Zabbix Server地址则是可选项
#ServerActive=10.0.0.100 #注释此行
Hostname=10.0.0.104
Timeout=30
Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@centos8 ~]# systemctl restart zabbix-agent.service

验证主机状态

注意: 被动模式下变成绿色比较慢,有时需要等30分钟才能看到结果,但是最新数据可能比较快就能采集到

如果不成功,可以删除后再重新添加监控的主机

687
688

Zabbix 实现自动化运维

Zabbix 网络发现

Zabbix 网络发现介绍

之前都是手动一台一台主机的添加到 Zabbix 中进行监控,很是繁琐,可以利用自动发现功能,自动添加被监控的主机

当众多的服务器都已经安装了agent或者snmp后,利用自动发现功能,Zabbix server 可以自动扫描预先配置好的ip段,自动添加主机,自动关联模板,自动加到主机组里等等。

网络发现功能更快速的部署zabbix、简化zabbix管理、并且在经常变动的环境里面也不需要花太多的精力,毕竟网络发现也能随时发现变化。

当然网络发现也不是万能的,虽然网络发现能干很多事情,但是它无法发现网络拓扑的变化。

由于自动发现效率比较低,严重消耗Zabbix Server资源和网络带宽,大规模环境中较少使用

自动发现虽然能自动完成发现并添加主机,但仍然存在一些问题

  • 发现时间长,效率较低
  • 扫描过程中容易漏扫
  • 当IP地址不固定难以实现
  • 无法实现不同类型主机关联不同模板

官方帮助

1
https://www.zabbix.com/documentation/5.0/zh/manual/discovery/network_discovery

实现 Zabbix 网络发现

自动发现由两个步骤组成:

  • 发现discovery: Zabbix周期性地扫描在”网络发现规则”中定义的IP段,发现满足规则的主机
  • 动作action: 对这些主机完成动作,包括添加主机、添加模板、发送通知等等。

案例: 自动发现需求

1
2
3
4
5
6
发现有Zabbix agent运行的主机
每10分钟执行一次
如果主机正常运行时间超过2分钟,添加主机
将Linux主机添加到“Linux servers”组
链接模板Template OS Linux 到Linux主机
如果主机停机时间超过24小时,删除主机

创建自动发现指定需要监控的网段

配置– 自动发现– 创建发现规则

689

指定名称,IP范围和逢动发现检查等信息

690

可见名称为IP地址

691
692

创建添加主机的自动发现动作

创建新的动作

693
694
695

系统默认内置动作,也可以修改已有的被禁用自动发现动作

696

启用此动作

697

操作增加三个操作: 添加主机,添加群组,添加模板

也可以添加发送消息给Admin等操作

698

创建删除主机的自动发现动作

699
700

验证自动发现的结果

一段时间后,可以观察到下面结果,自动添加两台主机并关联相应的模板

701

将客户端关机后,过一天后,再观察是否自动删除此主机

702

监测 – 自动发现, 可以看到下面的删除的主机

703

Zabbix 自动注册

Zabbix 自动注册介绍

当客户端众多时,将每台主机手动添加到Zabbix,还手动添加关联模板,无疑是低效的.

但是利用网络发现实现,Zabbix Server 资源消耗又比较严重

利用Zabbix的自动注册功能,实现添加主机的自动化,可以大幅减少运维的工作量,减少Zabbix Server 的资源消耗

此方式和自动发现不同,是由Active agent主动发起请求zabbix server将这些agent加到主机里。

注意: Agent 必须使用主动模式才支持自动注册

自动注册由于比自动发现效率更好,Zabbix Server资源消耗更少,更适合大规模及云环境IP地址不固定的场景使用

官方帮助

1
https://www.zabbix.com/documentation/5.0/zh/manual/discovery/auto_registration

在Zabbix agent 端的配置文件修改以下项目

1
2
3
4
5
6
Server=<Zabbix Server IP>
ServerActive=<Zabbix Server IP> #客户端主动模式是实现自动注册的前提条件
Hostname=<agent IP>
#HostnameItem=system.hostname
HostMetadata==<key> #非必须项,可以做为添加主机的验证标识和分类,或者实现加入主机的验证功能
HostMetadataItem=<监控项Item> #非必须项,监控项的值可以做为添加主机的验证标识和分类

案例: 实现 Linux 主机自动注册

修改 Zabbix agent 的配置

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@centos8 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=zabbix.wang.org
ServerActive=zabbix.wang.org
Hostname=web-10.0.0.18 #指定主机名,如果不指定,则服务器将使用agent的系统主机名
#HostnameItem=system.hostname #指定主机名
HostMetadata=123456
#HostMetadataItem=system.uname

[root@centos8 ~]# systemctl restart zabbix-agent.service
[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -k system.uname
Linux rocky8.wang.org 4.18.0-348.el8.0.2.x86_64 #1 SMP Sun Nov 14 00:51:12 UTC
2021 x86_64

[root@zabbix-server ~]# zabbix_get -s 10.0.0.8 -k system.hostname
rocky8.wang.org

在 Zabbix Server 配置动作

在配置—动作—选择自动注册动作

704

创建新动作

705
706

指定动作中条件的主机名的值

707
708

或者使用元数据添加

709

指定操作

710

指定操作,添加主机,添加主机到主机群组,关系相关模板

711

712
713

验证结果

稍过一会儿,再观察可以看到下面显示添加主机成功

714
715

案例: 将 Windows 主动自动注册

修改Agent 配置

716

重启服务

717

创建自动注册动作

配置–动作– 自动创建动作 – 创建动作

718
719
720
721

验证结果

722
723

基于 Ansible 实现批量的自动注册

略 的图像结果

略 的图像结果

Zabbix API 实现自动化运维

Zabbix API 介绍

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组功能的能力,而又无需直接使用源代码,或理解内部工作机制的细节。

Zabbix API允许你以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。它广泛用于:

  • 创建新的应用程序以使用Zabbix
  • 将Zabbix与第三方软件集成
  • 自动执行常规任务

Zabbix API是基于Web的API,作为Web前端的一部分提供。它使用JSON-RPC 2.0协议,这意味着:

  • 该API包含一组独立的方法
  • 客户端和API之间的请求和响应使用JSON格式进行编码

官方参考文档:

1
2
3
4
https://www.zabbix.com/documentation/5.0/zh/manual/api
https://www.zabbix.com/documentation/4.0/zh/manual/api
https://www.zabbix.com/documentation/5.0/zh/manual/api/reference
https://www.zabbix.com/documentation/4.0/zh/manual/api/reference

Zabbix 支持各种语言的开发库

1
https://zabbix.org/wiki/Docs/api/libraries

Zabbix API 开始扮演着越来越重要的角色,尤其是在集成第三方软件和自动化日常任务时。很难想象管理数千台服务器而没有自动化是多么的困难。Zabbix API 为批量操作、第三方软件集成以及其他作用提供可编程接口。Zabbix API 是在 1.8 版本中开始引进并且已经被广泛应用。所有的 Zabbix 移动客户端都是基于 API,甚至原生的 WEB 前端部分也是建立在它之上。Zabbix API 中间件使得架构更加模块化也避免直接对数据库进行操作。

API 采用 JSON-RPC 实现。这意味着调用任何函数,都需要发送 POST 请求,输入输出数据都是以 JSON 格式。

Zabbix API由许多名义上分组的独立API方法组成。每个方法执行一个特定任务。

例如,方法 host.create 隶属于 host 这个API分组 ,用于创建新主机。API分组有时被称为“类”。

大多数API至少包含四种方法: get, create, update 和 delete ,分别是检索,创建,更新和删除数据,但是某些API提供一套完全不同的一组方法。

Zabbix 常用API

1
2
3
4
5
6
7
user.login                              #用户登录
host.get(create|delete|update) #主机操作
hostgroup.get(create|delete|update) #主机组操作
item.get(create|delete|update) #监控项目操作
history.get #历史数据查询
event.get #事件查询
trigger.get #触发器查询

API 使用案例

获取 Token

在访问Zabbix内部的任何数据之前,需要登录并获得身份验证令牌。这可以使用user.login方法来完成。

假设以Zabbix的Admin用户登录。那么JSON请求将是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@zabbix-server ~]# cat zabbix-api-token.sh
#!/bin/bash
ZABBIX_SERVER=zabbix.wang.org
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1,
"auth": null
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php

# HTTP: http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php
# NGINX: http://${ZABBIX_SERVER}/api_jsonrpc.php

[root@zabbix-server ~]# yum -y install jq
[root@zabbix-server ~]# ./zabbix-api-token.sh | jq
{
"jsonrpc": "2.0",
"result": "6e936114704269310d372a19c409e93d", #此为获取的Token
"id": 1
}

[root@zabbix-server ~]# yum -y install python3
[root@zabbix-server ~]# ./zabbix-api-token.sh | python3 -m json.tool
{
"jsonrpc": "2.0",
"result": "6e936114704269310d372a19c409e93d", #此为获取的Token
"id": 1
}

使用以上令牌获取所有主机列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@zabbix-server ~]# cat zabbix-api-gethostlist.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [ "host" ]
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool


[root@zabbix-server ~]# ./zabbix-api-gethostlist.sh
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10084",
"host": "Zabbix server"
},
{
"hostid": "10270",
"host": "10.0.0.105"
},
{
"hostid": "10272",
"host": "10.0.0.106"
}
],
"id": 1
}

使用以上令牌获取所有主机信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@zabbix-server ~]# cat zabbix-api-gethostinfo.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [ "hostid", "host" ],
"selectInterfaces": [ "interfaceid", "ip" ]
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool


[root@zabbix-server ~]# chmod +x zabbix-api-gethostinfo.sh
[root@zabbix-server ~]# ./zabbix-api-gethostinfo.sh
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10084",
"host": "Zabbix server",
"interfaces": [
{
"interfaceid": "1",
"ip": "127.0.0.1"
}
]
},
{
"hostid": "10270",
"host": "10.0.0.105",
"interfaces": [
{
"interfaceid": "2",
"ip": "10.0.0.105"
}
]
},
{
"hostid": "10272",
"host": "10.0.0.106",
"interfaces": [
{
"interfaceid": "3",
"ip": "10.0.0.106"
}
]
}
],
"id": 1
}

获取指定主机信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[root@zabbix-server ~]# cat ./zabbix-api-gethost.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
HOST=10.0.0.105
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"filter": {
"host": [ "'$HOST'" ]
}
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool


[root@zabbix-server ~]# ./zabbix-api-gethost.sh
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10270",
"proxy_hostid": "0",
"host": "10.0.0.105",
"status": "0",
"disable_until": "0",
"error": "",
"available": "1",
"errors_from": "0",
"lastaccess": "0",
"ipmi_authtype": "-1",
"ipmi_privilege": "2",
"ipmi_username": "",
"ipmi_password": "",
"ipmi_disable_until": "0",
"ipmi_available": "0",
"snmp_disable_until": "0",
"snmp_available": "0",
"maintenanceid": "0",
"maintenance_status": "0",
"maintenance_type": "0",
"maintenance_from": "0",
"ipmi_errors_from": "0",
"snmp_errors_from": "0",
"ipmi_error": "",
"snmp_error": "",
"jmx_disable_until": "0",
"jmx_available": "0",
"jmx_errors_from": "0",
"jmx_error": "",
"name": "10.0.0.105-wang-web5",
"flags": "0",
"templateid": "0",
"description": "",
"tls_connect": "1",
"tls_accept": "1",
"tls_issuer": "",
"tls_subject": "",
"tls_psk_identity": "",
"tls_psk": "",
"proxy_address": "",
"auto_compress": "1"
}
],
"id": 1
}

获取所有用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
[root@zabbix-server ~]# cat ./zabbix-api-getusers.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "user.get",
"params": {
"output": "extend"
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool

[root@zabbix-server ~]# ./zabbix-api-getusers.sh
{
"jsonrpc": "2.0",
"result": [
{
"userid": "1",
"alias": "Admin",
"name": "Zabbix",
"surname": "Administrator",
"url": "",
"autologin": "1",
"autologout": "0",
"lang": "zh_CN",
"refresh": "30s",
"type": "3",
"theme": "default",
"attempt_failed": "0",
"attempt_ip": "",
"attempt_clock": "0",
"rows_per_page": "50"
},
{
"userid": "2",
"alias": "guest",
"name": "",
"surname": "",
"url": "",
"autologin": "0",
"autologout": "15m",
"lang": "en_GB",
"refresh": "30s",
"type": "1",
"theme": "default",
"attempt_failed": "0",
"attempt_ip": "",
"attempt_clock": "0",
"rows_per_page": "50"
},
{
"userid": "3",
"alias": "wangxiaochun",
"name": "xiaochun",
"surname": "wang",
"url": "",
"autologin": "0",
"autologout": "0",
"lang": "zh_CN",
"refresh": "30s",
"type": "2",
"theme": "default",
"attempt_failed": "0",
"attempt_ip": "",
"attempt_clock": "0",
"rows_per_page": "50"
}
],
"id": 1
}

获取所有模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
[root@zabbix-server ~]# cat ./zabbix-api-gettemplates.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": "extend"
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool


[root@zabbix-server ~]# ./zabbix-api-gettemplates.sh
{
"jsonrpc": "2.0",
"result": [
{
"proxy_hostid": "0",
"host": "Template OS Linux",
"status": "3",
"disable_until": "0",
"error": "",
"available": "0",
"errors_from": "0",
"lastaccess": "0",
"ipmi_authtype": "-1",
"ipmi_privilege": "2",
"ipmi_username": "",
"ipmi_password": "",
"ipmi_disable_until": "0",
"ipmi_available": "0",
"snmp_disable_until": "0",
"snmp_available": "0",
"maintenanceid": "0",
"maintenance_status": "0",
"maintenance_type": "0",
"maintenance_from": "0",
"ipmi_errors_from": "0",
"snmp_errors_from": "0",
"ipmi_error": "",
"snmp_error": "",
"jmx_disable_until": "0",
"jmx_available": "0",
"jmx_errors_from": "0",
"jmx_error": "",
"name": "Template OS Linux",
"flags": "0",
"templateid": "10001",
"description": "",
"tls_connect": "1",
"tls_accept": "1",
"tls_issuer": "",
"tls_subject": "",
"tls_psk_identity": "",
"tls_psk": "",
"proxy_address": "",
"auto_compress": "1"
},
{
"proxy_hostid": "0",
"host": "Template App Zabbix Server",
"status": "3",
"disable_until": "0",
"error": "",
"available": "0",
"errors_from": "0",
"lastaccess": "0",
"ipmi_authtype": "-1",
"ipmi_privilege": "2",
"ipmi_username": "",
"ipmi_password": "",
"ipmi_disable_until": "0",
"ipmi_available": "0",
"snmp_disable_until": "0",
"snmp_available": "0",
"maintenanceid": "0",
"maintenance_status": "0",
"maintenance_type": "0",
"maintenance_from": "0",
"ipmi_errors_from": "0",
"snmp_errors_from": "0",
"ipmi_error": "",
"snmp_error": "",
"jmx_disable_until": "0",
"jmx_available": "0",
"jmx_errors_from": "0",
"jmx_error": "",
"name": "Template App Zabbix Server",
"flags": "0",
"templateid": "10047",
"description": "",
"tls_connect": "1",
"tls_accept": "1",
"tls_issuer": "",
"tls_subject": "",
"tls_psk_identity": "",
"tls_psk": "",
"proxy_address": "",
"auto_compress": "1"
},
{
"proxy_hostid": "0",
"host": "Template App Zabbix Proxy",
"status": "3",
......

获取指定的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
[root@zabbix-server ~]# cat zabbix-api-gettemplate.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": "extend",
"filter": {
"host": [ "Template OS Linux SNMP", "Template OS Linux by Zabbix agent" ] #指定模板名称
}
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool


[root@zabbix-server ~]# ./zabbix-api-gettemplate.sh
{
"jsonrpc": "2.0",
"result": [
{
"proxy_hostid": "0",
"host": "Template OS Linux",
"status": "3",
"disable_until": "0",
"error": "",
"available": "0",
"errors_from": "0",
"lastaccess": "0",
"ipmi_authtype": "-1",
"ipmi_privilege": "2",
"ipmi_username": "",
"ipmi_password": "",
"ipmi_disable_until": "0",
"ipmi_available": "0",
"snmp_disable_until": "0",
"snmp_available": "0",
"maintenanceid": "0",
"maintenance_status": "0",
"maintenance_type": "0",
"maintenance_from": "0",
"ipmi_errors_from": "0",
"snmp_errors_from": "0",
"ipmi_error": "",
"snmp_error": "",
"jmx_disable_until": "0",
"jmx_available": "0",
"jmx_errors_from": "0",
"jmx_error": "",
"name": "Template OS Linux",
"flags": "0",
"templateid": "10001",
"description": "",
"tls_connect": "1",
"tls_accept": "1",
"tls_issuer": "",
"tls_subject": "",
"tls_psk_identity": "",
"tls_psk": "",
"proxy_address": "",
"auto_compress": "1"
},
{
"proxy_hostid": "0",
"host": "Template OS Linux SNMPv2",
"status": "3",
"disable_until": "0",
"error": "",
"available": "0",
"errors_from": "0",
"lastaccess": "0",
"ipmi_authtype": "-1",
"ipmi_privilege": "2",
"ipmi_username": "",
"ipmi_password": "",
"ipmi_disable_until": "0",
"ipmi_available": "0",
"snmp_disable_until": "0",
"snmp_available": "0",
"maintenanceid": "0",
"maintenance_status": "0",
"maintenance_type": "0",
"maintenance_from": "0",
"ipmi_errors_from": "0",
"snmp_errors_from": "0",
"ipmi_error": "",
"snmp_error": "",
"jmx_disable_until": "0",
"jmx_available": "0",
"jmx_errors_from": "0",
"jmx_error": "",
"name": "Template OS Linux SNMPv2",
"flags": "0",
"templateid": "10248",
"description": "Template OS Linux version: 0.15",
"tls_connect": "1",
"tls_accept": "1",
"tls_issuer": "",
"tls_subject": "",
"tls_psk_identity": "",
"tls_psk": "",
"proxy_address": "",
"auto_compress": "1"
}
],
"id": 1
}

更新指定主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@zabbix-server ~]# cat zabbix-api-disablehost.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.update",
"params": {
"hostid": "10272", #指定要禁用的主机ID
"status": 1 #0表示启用,1表示禁用
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool

删除指定主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@zabbix-server ~]# cat zabbix-api-delhost.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.delete",
"params": ["10272"], #指定要删除的主机ID
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool


[root@zabbix-server ~]# ./zabbix-api-delhost.sh
{
"jsonrpc": "2.0",
"result": {
"hostids": [
"10272"
]
},
"id": 1
}

#验证是否删除
[root@zabbix-server ~]# ./zabbix-api-gethostlist.sh
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10084",
"host": "Zabbix server"
},
{
"hostid": "10270",
"host": "10.0.0.105"
}
],
"id": 1
}

批量创建新主机

API添加主机前,需要预先知道要添加的主机IP、此主机预先安装并配置好zabbix agent、预先知道要关联的模板ID/组ID等信息,然后同API提交请求添加

参考链接

1
https://www.zabbix.com/documentation/5.0/zh/manual/api/reference/hostinterface/object#host-interface

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[root@zabbix-server ~]# cat ./zabbix-api-addhost.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
HOST=10.0.0.106
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "'web-api-$HOST'", #创建主机名称
"name": "'web-api-$HOST'", #可见的名称
"interfaces": [
{
"type": 1, #类型为1表示agent,2是SNMP,3是IPMI,4是JMX
"main": 1, #主要接口
"useip": 1, #0是使用DNS,1是使用IP地址
"ip": "'$HOST'", #添加的zabbix agent的IP地址
"dns": "",
"port": "10050" #agent使用的端口
}
],
"groups": [
{
"groupid": "2" #添加到的组的ID
}
],
"templates": [
{
"templateid": "10001" #关联的模板的ID
}
]
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool


[root@zabbix-server ~]# ./zabbix-api-addhost.sh
{
"jsonrpc": "2.0",
"result": {
"hostids": [
"10273"
]
},
"id": 1
}

[root@zabbix-server ~]# ./zabbix-api-gethostlist.sh
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10084",
"host": "Zabbix server"
},
{
"hostid": "10270",
"host": "10.0.0.105"
},
{
"hostid": "10273",
"host": "10.0.0.106"
}
],
"id": 1
}

Zabbix WEB管理页面验证结果

724

范例: 批量添加主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@zabbix-server ~]# cat ./zabbix-api-addhosts.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
NET=10.0.0
for HOST in $NET.{200..210};do
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "'$HOST'",
"name": "'web-$HOST'",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "'$HOST'",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "2"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php
done


[root@zabbix-server ~]# bash ./zabbix-api-addhosts.sh

725

查看代理proxy主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[root@zabbix-server ~]# cat ./zabbix-api-getproxy.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "proxy.get",
"params": {
"output": "extend"
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool




[root@zabbix-server ~]#./zabbix-api-getproxy.sh
{
"jsonrpc": "2.0",
"result": [
{
"proxy_hostid": "0",
"host": "10.0.0.101",
"status": "5",
"disable_until": "0",
"error": "",
"available": "0",
"errors_from": "0",
"lastaccess": "0",
"ipmi_authtype": "-1",
"ipmi_privilege": "2",
"ipmi_username": "",
"ipmi_password": "",
"ipmi_disable_until": "0",
"ipmi_available": "0",
"snmp_disable_until": "0",
"snmp_available": "0",
"maintenanceid": "0",
"maintenance_status": "0",
"maintenance_type": "0",
"maintenance_from": "0",
"ipmi_errors_from": "0",
"snmp_errors_from": "0",
"ipmi_error": "",
"snmp_error": "",
"jmx_disable_until": "0",
"jmx_available": "0",
"jmx_errors_from": "0",
"jmx_error": "",
"name": "",
"flags": "0",
"templateid": "0",
"description": "",
"tls_connect": "1",
"tls_accept": "1",
"tls_issuer": "",
"tls_subject": "",
"tls_psk_identity": "",
"tls_psk": "",
"proxy_address": "10.0.0.101",
"auto_compress": "1",
"proxyid": "10276"
}
],
"id": 1
}

添加指定代理的主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[root@zabbix-server ~]# cat zabbix-api-addhost_proxy.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
HOST=10.0.0.107
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "'web-api-$HOST'",
"name": "'web-api-$HOST'",
"proxy_hostid": "10276", #指定代理的ID
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "'$HOST'",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "2"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool


[root@zabbix-server ~]# ./zabbix-api-addhost_proxy.sh
{
"jsonrpc": "2.0",
"result": {
"hostids": [
"10277"
]
},
"id": 1
}

批量添加指定代理的主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
[root@zabbix-server ~]# cat ./zabbix-api-addhosts_proxy.sh
#!/bin/bash
ZABBIX_SERVER=10.0.0.100
TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}')
IPLIST="
10.0.0.1
10.0.0.3
10.0.0.5
"
for i in $IPLIST ;do
curl -s -XPOST -H "Content-Type: application/json-rpc" -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "'${i}'",
"name": "'web-proxy-api-${i}'",
"proxy_hostid": "10276",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "'${i}'",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "2"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"id": 1,
"auth": "'$TOKEN'"
}' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php | python3 -m json.tool
done




[root@zabbix-server ~]# ./zabbix-api-addhosts_proxy.sh
{
"jsonrpc": "2.0",
"result": {
"hostids": [
"10279"
]
},
"id": 1
}
{
"jsonrpc": "2.0",
"result": {
"hostids": [
"10280"
]
},
"id": 1
}
{
"jsonrpc": "2.0",
"result": {
"hostids": [
"10281"
]
},
"id": 1
}

Zabbix WEB管理页面验证结果

726

Zabbix 优化

zabbix 监控主机和监控项比较少的时候,无需过度优化!

优化方法

1
2
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/performance_tuning
https://blog.zabbix.com/monitoring-how-busy-zabbix-processes-are/457/

如果主机和监控项众多, Zabbix Server 有可能会出现的性能问题,主要表现如下:

  • Web操作很卡,容易出现502错误
  • 监控图形中图层断裂
  • 监控告警不及时

可以查看队列了解 Zabbix 性能状态

管理– 队列

727
728
729

优化方法

  • 数据库: 写多读少,数据采集比较频繁,可以考虑 PostgreSQL
  • 使用主动模式,减轻Zabbix Server压力
  • 如果需要监控远程主机,使用 Zabbix Proxy
  • 删除无用监控项,建议使用自定义的模板和监控项
  • 适当增加监控项的取值间隔,减少历史数据保存周期,此工作由housekeeper进程定时清理
  • 针对zabbix历史数据和趋势图的数据表,进行周期性分表保存
  • 对 Zabbix Server 进程调优,发现性能瓶颈的进程,加大它的进程数量
  • 对 Zabbix Server 缓存调优,发现哪种缓存的剩余内存少,就加大它的缓存值

数据库空间估算

监控项的保留时长,历史数据默认90天,趋势数据1年

730

占用的数据库磁盘空间可能会很大,如何估算空间占用?官方给出相关的公式

官方公式:

1
2
https://www.zabbix.com/documentation/6.0/zh/manual/installation/requirements
https://www.zabbix.com/documentation/5.0/zh/manual/installation/requirements

下表包含可用于计算 Zabbix 系统所需磁盘空间的公式:

参数 所 磁盘空间的计算公式 (单位:字节)
Zabbix 配置文件 固定大小 通常为 10MB 或更少。
History days*(items/refresh rate)*24*3600*bytes
items:监控项数量。
days:保留历史数据的天数。
refresh rate:监控项的更新间隔。
bytes:保留单个值所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。
Trends days*(items/3600)*24*3600*bytes
items:监控项数量。
days:保留历史数据的天数。
bytes:保留单个趋势数据所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。
Events days*events*24*3600*bytes
events:每秒产生的事件数量。假设最糟糕的情况下,每秒产生 1 个事件。
days:保留历史数据的天数。 bytes:保留单个趋势数据所需的字节数,取决于数据库引擎,通常为 ~170 字节。

根据使用 MySQL 后端数据库的实际统计数据中收集到的平均值,例如监控项为数值类型的值约 90 个字节,事件约 170 个字节。

因此,所需要的磁盘总空间按下列方法计算:

配置文件数据+ 历史数据+ 趋势数据+ 事件数据

范例: 假设 100台主机,每个主机约有100个监控项,每个监控项每间隔60s获取一次数值

1
2
3
4
5
6
7
8
9
10
11
12
13
#历史数据:
days*(items/refresh rate)*24*3600*bytes
90*(10000/60)*24*3600*90=116173440000 字节 约共116GB

#趋势:
days*(items/3600)*24*3600*bytes
365*(10000/3600)*24*3600*90=5676480000 字节 约共5G

#事件:
days*events*24*3600*bytes
365*1*24*3600*170=5361120000 约5G

#合计:126GB

Zabbix Server 配置文件解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
AlertScriptsPath
默认值:/usr/local/share/zabbix/alertscripts
说明:告警脚本目录

AllowRoot
默认值:0 说明:是否允许使用root启动,0:不允许,1:允许,默认情况下她会使用zabbix用户来启动zabbix进程,不推荐使用root

CacheSize
取值范围: 128K-8G
默认值:8M
说明:配置缓存,用于存储host,item,trigger数据,2.2.3版本之前最大支持2G,目前最大支持8G,zabbix5.0最大支持64G

CacheUpdateFrequency
取值范围:1-3600
默认值:60
说明:多少秒更新一次配置缓存

DBHost
默认值:localhost
说明:数据库主机地址

DBName
默认值:无
必填:是

DBPassword:
默认值:无
说明:数据库密码

DBPort
取值范围:1024-65535
默认值:3306
说明:SQLite作为DB,这个选项请忽略,如果使用socket链接,也请忽略。

DBSchema
说明:Schema名称. 用于 IBM DB2 、 PostgreSQL.

DBSocket
默认值:/tmp/mysql.sock
说明:mysql sock文件路径

DebugLevel
取值范围:0-5
默认值:3
说明: 指定debug级别
0 - 基本信息
1 - critical信息
2 - error信息
3 - warnings信息
4 - 调试日志,日志内容很多,慎重使用
5 - 用于调试web和vmware监控

ExternalScripts
默认值: /usr/local/share/zabbix/externalscripts
说明: 外部脚本目录

Fping6Location
默认值:/usr/sbin/fping6
说明:fping6路径,如果zabbix非root启动,请给fping6 SUID

FpingLocation
默认值:/usr/sbin/fping
说明:和上面的一样

HistoryCacheSize
取值范围:128K-2G
默认值:8M
说明:
历史记录缓存大小,用于存储历史记录

HistoryTextCacheSize
取值范围:128K-2G
默认值:16M
说明:文本类型历史记录的缓存大小,存储character, text 、log历史记录.

HousekeepingFrequency
取值范围:0-24
默认值:1
说明:housekeep执行频率,默认每小时回去删除一些过期数据。如果server重启,那么30分钟之后才执行一次,接下来,每隔一小时在执行一次。

Include
说明:include配置文件,可以使用正则表达式,例如:/usr/local/zabbix-2.4.4/conf/ttlsa.com/*.conf

JavaGateway
说明:Zabbix Java gateway的主机名,需要启动Java pollers

JavaGatewayPort
取值范围:1024-32767
默认值:10052
Zabbix Java gateway监听端口

ListenIP
默认值:0.0.0.0
说明:监听地址,留空则会在所有的地址上监听,可以监听多个IP地址,ip之间使用逗号分隔,例如:127.0.0.1,10.10.0.2

ListenPort
取值范围:1024-32767
默认值:10051
说明:监听端口

LoadModule
说明:加载模块,格式: LoadModule=,文件必须在指定的LoadModulePath目录下,如果需要加载多个模块,那么写多个即可。

LoadModulePath
模块目录,参考上面

LogFile
日志文件,例如:/data/logs/zabbix/zabbix-server.log

LogFileSize
取值范围:0-1024
默认值:1
0表示禁用日志自动rotation,如果日志达到了限制,并且rotation失败,老日志文件将会被清空掉,重新生成一个新日志。
LogSlowQueries
取值范围:0-3600000
默认值:0
多慢的数据库查询将会被记录,单位:毫秒,0表示不记录慢查询。只有在DebugLevel=3时,这个配置才有效。

MaxHousekeeperDelete
取值范围: 0-1000000
默认值:5000
housekeeping一次删除的数据不能大于MaxHousekeeperDelete

PidFile
默认值:/tmp/zabbix_server.pid
PID文件

ProxyConfigFrequency
取值范围:1-604800
默认值:3600
proxy被动模式下,server多少秒同步配置文件至proxy。

ProxyDataFrequency
取值范围:1-3600
默认值:1
被动模式下,zabbix server间隔多少秒向proxy请求历史数据

SenderFrequency
取值范围:5-3600
默认值:30
间隔多少秒,再尝试发送为发送的报警

SNMPTrapperFile
默认值:/tmp/zabbix_traps.tmp
SNMP trap发送到server的数据临时存放文件。

SourceIP
出口IP地址

SSHKeyLocation
SSH公钥私钥路径

SSLCertLocation
SSL证书目录,用于web监控

SSLKeyLocation
SSL认证私钥路径、用于web监控

SSLCALocation
SSL认证,CA路径,如果为空,将会使用系统默认的CA

StartDBSyncers
取值范围:1-100
默认值:4
预先foke DB Syncers的数量,1.8.5以前最大值为64

StartDiscoverers
取值范围:0-250
默认值:1
pre-forked discoverers的数量,1.8.5版本以前最大可为255

StartPollers
# Mandatory: no
取值范围:0-1000
默认值:5
Number of pre-forked instances of pollers.

StartHTTPPollers
取值范围:0-1000
默认值:1
pre-forked HTTP pollers的数量,1.8.5以前最大255

StartIPMIPollers
取值范围:0-1000
默认值:0
pre-forked IPMI pollers的数量,1.8.5之前,最大为255

StartPollersUnreachable
取值范围:0-1000
默认值:1
pre-forked instances of pollers for unreachable hosts (including IPMI and Java)

Timeout
取值范围:1-30
默认值:3
agent,snmp,external check的超时时间,单位为秒

TmpDir
默认值:/tmp

TrapperTimeout
取值范围:1-300
默认值:300
处理trapper数据的超时时间

TrendCacheSize
取值范围:128K-2G
默认值:4M
历史数据缓存大小

UnavailableDelay
取值范围:1-3600
默认值:60
间隔多少秒再次检测主机是否可用

UnreachableDelay
取值范围:1-3600
默认值:15
间隔多少秒再次检测主机是否可达。

UnreachablePeriod
取值范围:1-3600
默认值:45
检测到主机不可用,多久将它置为不可达

User
默认值:zabbix
启动zabbix server的用户,在配置禁止root启动,并且当前shell用户是root得情况下有效。如果当前用户是ttlsa,那么zabbix server的运行用户是ttlsa

ValueCacheSize
取值范围:0,128K-64G
默认值:8M
0表示禁用,history value缓存大小,当缓存超标了,将会每隔5分钟往server日志里面记录。养成看日志的好习惯。

实战优化案例

案例

下图为 Zabbix 数据采集进程的繁忙度

731

修改自动发现规则

732

再次观察监控项,可以看到繁忙度大幅提高

733

修改 Zabbix Server 配置

1
2
3
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
StartDiscoverers=100 # StartDiscoverers=1 默认值为1,加大此值
[root@zabbix-server ~]# systemctl restart zabbix-agent.service

734

Zabbix Server 还有其它相关进程

735
736
737
738

案例

缓存使用情况如下图

739

Zabbix Server 相关缓存的配置项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@zabbix-server ~]# grep -i cache /etc/zabbix/zabbix_server.conf

### Option: VMwareCacheSize
# Size of VMware cache, in bytes.
# VMwareCacheSize=8M
### Option: CacheSize
# Size of configuration cache, in bytes.
# CacheSize=8M #此值不能太小,否则Zabbix Server 可能无法启动
### Option: CacheUpdateFrequency
# How often Zabbix will perform update of configuration cache, in seconds.
# CacheUpdateFrequency=60
### Option: HistoryCacheSize
# Size of history cache, in bytes.
# HistoryCacheSize=16M
### Option: HistoryIndexCacheSize
# Size of history index cache, in bytes.
# Shared memory size for indexing history cache.
# HistoryIndexCacheSize=4M
### Option: TrendCacheSize
# Size of trend cache, in bytes.
# TrendCacheSize=4M
### Option: ValueCacheSize
# Size of history value cache, in bytes.
# Setting to 0 disables value cache.
# ValueCacheSize=8M

案例

利用API添加几百台监控的主机,因为默认值8M太小 ,会造成Zabbix Server 不断的重启,可以看到如下日志信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
root@zabbix-server ~]# tail -f /var/log/zabbix/zabbix_server.log
......
8588:20220617:213218.764 syncing trend data done
8588:20220617:213218.764 Zabbix Server stopped. Zabbix 5.0.24 (revision 313ff6504e3).
8611:20220617:213228.800 Starting Zabbix Server. Zabbix 5.0.24 (revision 313ff6504e3).
8611:20220617:213228.800 ****** Enabled features ******
8611:20220617:213228.800 SNMP monitoring: YES
8611:20220617:213228.800 IPMI monitoring: YES
8611:20220617:213228.800 Web monitoring: YES
8611:20220617:213228.800 VMware monitoring: YES
8611:20220617:213228.800 SMTP authentication: YES
8611:20220617:213228.800 ODBC: YES
8611:20220617:213228.800 SSH support: YES
8611:20220617:213228.800 IPv6 support: YES
8611:20220617:213228.800 TLS support: YES
8636:20220617:213239.302 ******************************
8636:20220617:213239.302 using configuration file: /etc/zabbix/zabbix_server.conf
8636:20220617:213239.306 current database version (mandatory/optional): 05000000/05000005
8636:20220617:213239.306 required mandatory version: 05000000
8636:20220617:213239.315 server #0 started [main process]
8637:20220617:213239.316 server #1 started [configuration syncer #1]
8637:20220617:213239.535 __mem_malloc: skipped 0 asked 72 skip_min 18446744073709551615 skip_max 0
8637:20220617:213239.535 [file:dbconfig.c,line:96] __zbx_mem_malloc(): out of memory (requested 72 bytes)
8637:20220617:213239.535 [file:dbconfig.c,line:96] __zbx_mem_malloc(): please increase CacheSize configuration parameter
8637:20220617:213239.535 === memory statistics for configuration cache ===
8637:20220617:213239.535 free chunks of size 24 bytes: 55
8637:20220617:213239.535 free chunks of size 32 bytes: 11
8637:20220617:213239.535 free chunks of size 40 bytes: 6
8637:20220617:213239.535 free chunks of size 48 bytes: 5
8637:20220617:213239.535 free chunks of size 56 bytes: 3
8637:20220617:213239.535 min chunk size: 24 bytes
8637:20220617:213239.535 max chunk size: 56 bytes
8637:20220617:213239.535 memory of total size 7264040 bytes fragmented into 70263 chunks
8637:20220617:213239.535 of those, 2320 bytes are in 80 free chunks
8637:20220617:213239.535 of those, 7261720 bytes are in 70183 used chunks
8637:20220617:213239.535 of those, 1124192 bytes are used by allocation overhead
8637:20220617:213239.535 ================================

[root@zabbix-server ~]# cat /var/log/syslog
Jun 17 21:37:18 zabbix-server systemd[1]: zabbix-server.service: Scheduled restart job, restart counter is at 31.
Jun 17 21:37:18 zabbix-server systemd[1]: Stopped Zabbix Server.
Jun 17 21:37:18 zabbix-server systemd[1]: Starting Zabbix Server...
Jun 17 21:37:18 zabbix-server systemd[1]: Started Zabbix Server.
Jun 17 21:37:18 zabbix-server kill[9306]: 用法:
Jun 17 21:37:18 zabbix-server kill[9306]: kill [options] <pid> [...]
Jun 17 21:37:18 zabbix-server kill[9306]: 选项:
Jun 17 21:37:18 zabbix-server kill[9306]: <pid> [...] send signal to every <pid> listed
Jun 17 21:37:18 zabbix-server kill[9306]: -<signal>, -s, --signal <signal>
Jun 17 21:37:18 zabbix-server kill[9306]: specify the <signal> to be sent
Jun 17 21:37:18 zabbix-server kill[9306]: -l, --list=[<signal>] list all signal names, or convert one to a name
Jun 17 21:37:18 zabbix-server kill[9306]: -L, --table list all signal names in a nice table
Jun 17 21:37:18 zabbix-server kill[9306]: -h, --help 显示此帮助然后离开
Jun 17 21:37:18 zabbix-server kill[9306]: -V, --version 显示程序版本然后离开
Jun 17 21:37:18 zabbix-server kill[9306]: 欲了解更多详细信息,请参见 kill(1)。
Jun 17 21:37:18 zabbix-server systemd[1]: zabbix-server.service: Control process exited, code=exited, status=1/FAILURE
Jun 17 21:37:18 zabbix-server systemd[1]: zabbix-server.service: Failed with result 'exit-code'.

[root@zabbix-server ~]# systemctl status zabbix-server.service
● zabbix-server.service - Zabbix Server
Loaded: loaded (/lib/systemd/system/zabbix-server.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Fri 2021-06-17 21:38:51 CST; 8s ago
Process: 9509 ExecStart=/usr/sbin/zabbix_server -c $CONFFILE (code=exited, status=0/SUCCESS)
Process: 9528 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=1/FAILURE)
Main PID: 9526 (code=exited, status=0/SUCCESS)
6月 17 21:38:51 zabbix-server.wang.org systemd[1]: zabbix-server.service: Control process exited, code=exited, status=1/FAILURE
6月 17 21:38:51 zabbix-server.wang.org systemd[1]: zabbix-server.service: Failed with result 'exit-code'.

#加大缓存
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
# CacheSize=8M
CacheSize=256M

#观察结果,发现Zabbix Server 服务启动成功
[root@zabbix-server ~]# systemctl is-active zabbix-server.service
active

案例

由于添加了很多不可访问的主机,会出现unreachable poller进程繁忙的情况,原因是此进程只有一个

1
2
3
[root@zabbix-server ~]#ps aux|grep unreachable 
zabbix 9820 0.0 0.6 365768 12308 ? S 21:40 0:00 /usr/sbin/zabbix_server: unreachable poller #1 [got 2 values in 8.005057 sec, getting values]
root 11642 0.0 0.0 9524 720 pts/3 S+ 22:06 0:00 grep --color=auto unreachable

告警

740
741
742

修改配置,加大进程数

1
2
3
4
5
6
7
[root@zabbix-server ~]# vi /etc/zabbix/zabbix_server.conf
# StartPollersUnreachable=1
StartPollersUnreachable=100

[root@zabbix-server ~]# systemctl restart zabbix-server.service
[root@zabbix-server ~]# ps aux|grep unreachable |wc -l
101

再次观察数据和图形,可以看到繁忙度大幅下降

743

案例

自动发现的进程只有一个

1
2
3
4
#默认进程是一个
[root@zabbix-server ~]# ps aux|grep discoverer
zabbix 12141 0.0 0.5 366096 10876 ? S 22:09 0:00 /usr/sbin/zabbix_server: discoverer #1 [processed 2 rules in 251.928169 sec, performing discovery]
root 13553 0.0 0.1 9524 2620 pts/3 S+ 22:25 0:00 grep --color=auto discoverer

多创建几个自动发现场景,缩短发现时间,配置如下

744

观察进程繁忙程度

745
746

出现告警

747

修改配置,加大进程数

1
2
3
4
5
6
7
[root@zabbix-server ~]# vi /etc/zabbix/zabbix_server.conf
# StartDiscoverers=1
StartDiscoverers=100

[root@zabbix-server ~]# systemctl restart zabbix-server.service
[root@zabbix-server ~]# ps aux|grep discoverer|wc -l
101

观察进程状态繁忙度大幅下降

748

案例

进程数加大,可能会导致数据库连接过多,超过最大值,导致Zabbix 无法启动,解决方案,加大数据库的连接数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#注意:如果无法启动,可能是数据库连接数不足
[root@zabbix-server ~]# tail /var/log/zabbix/zabbix_server.log
......
20383:20220617:223102.021 server #162 started [unreachable poller #34]
20386:20220617:223102.022 server #163 started [unreachable poller #35]
20386:20220617:223102.023 [Z3001] connection to database 'zabbix' failed: [1040] Too many connections
20386:20220617:223102.023 Cannot connect to the database. Exiting...
20081:20220617:223102.024 One child process died (PID:20386,exitcode/signal:1).
Exiting ......

[root@zabbix-server ~]# vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
max_connections=1000

[root@zabbix-server ~]# systemctl restart mysql

Zabbix 高可用

Zabbix 高可用性实现

在前面的部署架构中,Zabbix Server 和MySQL都有只有一台主机,存在单点问题

可以使用Keepalived 实现 Zabbix Server的高可用

基础架构为LAMP或LNMP环境,采用keepalived实现zabbix服务器高可用,保证主服务器或者Httpd宕掉后能切换到从服务器

MySQL数据库做主主同步,保证两边服务器数据的一致性,实现数据库的高可用。

注意: 从 Zabbix 6.0 官方提供了高可用解决方案

官方链接

1
https://www.zabbix.com/documentation/6.0/zh/manual/concepts/server/ha#implementation-details

749

实战案例:实现 Zabbix Server 的高可用

750

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#在两个 Zabbix Server 使用下面相同的配置
[root@ka1 ~]# grep -i SourceIP= /etc/zabbix/zabbix_server.conf
SourceIP=10.0.0.10

[root@ka1 ~]# grep -i '^server=' /etc/zabbix/zabbix_agentd.conf
Server=127.0.0.1,10.0.0.10

[root@ka1 ~]# systemctl enable zabbix-server.service
[root@ka2 ~]# systemctl disable zabbix-server.service

#keepalived相关配置
#ka1节点配置
[root@ka1 ~]#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@wangxiaochun.com
}
notification_email_from 29308620@qq.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka1.wang.org
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 230.6.6.6
}

#指定检测脚本
vrrp_script check_zabbix_server{
script "/usr/bin/killall -0 zabbix_server"
interval 1
weight -30
fall 2
rise 2
timeout 2
}

include /etc/keepalived/conf.d/*.conf

[root@ka1 ~]# cat /etc/keepalived/conf.d/vip_zabbix.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.10/24 dev eth0 label eth0:1
}
#notify_master "systemctl start zabbix-server"
#notify_backup "systemctl stop zabbix-server"
track_script {
check_zabbix_server
}
}

#ka2节点框配置
[root@ka2 ~]# cat /etc/keepalived/conf.d/vip_zabbix.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 66
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.10/24 dev eth0 label eth0:1
}
notify_master "systemctl start zabbix-server"
notify_backup "systemctl stop zabbix-server"
track_script {
# check_zabbix_server #在ka2节点不能启用脚本,否则会导致ka2节点也降低优先级,从而切换失败
}
}