Skip to content

Zabbix-基础架构

Zabbix 简介

zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源 解决方案。 zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通 知机制以让系统管理员快速定位./解决存在的各种问题。

核心组件

Zabbix Server

  • 功能:中央处理单元,负责接收监控数据、触发告警、执行自动化任务及存储数据到数据库。
  • 关键进程
    • Poller:主动从 Agent 拉取数据(被动模式)。
    • Trapper:接收 Agent 主动推送的数据(主动模式)。
    • Alert/Notifier:处理告警规则并发送通知(邮件/短信等)。

Zabbix Agent

  • 部署:安装在被监控主机上(支持 Linux/Windows 等),收集本地资源数据(CPU、内存、磁盘等)。
  • 工作模式
    • 被动模式:Server 主动请求数据(默认)。
    • 主动模式:Agent 定期推送数据,主动监控能极大节约监控server 的资源。。

Zabbix Proxy

  • 作用:分布式环境中减轻 Server 负载,实现跨地域/网络隔离监控。
  • 特性
    • 本地缓存数据,网络中断后可恢复同步。
    • 单 Proxy 建议承载 ≤5000 监控项。

Zabbix Database

  • 存储内容:配置信息、监控数据、历史记录等。
  • 支持数据库:MySQL(最常用)、PostgreSQL、Oracle。
  • 优化建议:历史数据按周分区,趋势数据按月聚合。

Zabbix Web Interface

  • 功能:基于 PHP 的 Web 前端,提供配置管理、数据可视化、告警查看等。
  • 依赖环境:Apache/Nginx + PHP 7.2+。

Zabbix进程

默认情况下zabbix包含5个程序: zabbix_agentd、 zabbix_get、 zabbix_proxy、zabbix_sender、zabbix_server,另外一个 zabbix_java_gateway 是可选,这个需要另外安 装。下面来分别介绍下他们各自的作用:

  • zabbix_agentd: 客户端守护进程,此进程收集客户端数据,例如 cpu 负载、内存、硬盘使用情况等。
  • zabbix_get: zabbix工具,单独使用的命令,通常在 server或者proxy端执行获取远程客户端信息的命 令。 通常用户排错。 例如在server端获取不到客户端的内存数据,我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。
  • zabbix_sender: zabbix 工具,用于发送数据给 server 或者proxy,通常用于耗时比较长的检查。很多检 查非常耗时间,导致 zabbix 超时。于是我们在脚本执行完毕之后,使用 sender 主动提交数据。
  • zabbix_server: zabbix 服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway 的数据最终都是提交到 server。 备注:当然不是数据都是主动提交给 zabbix_server,也有的是 server 主动去取数据。
  • zabbix_proxy: zabbix 代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收 集到的数据提交/被提交到 server 里。
  • zabbix_java_gateway: zabbix2.0 之后引入的一个功能。顾名思义:Java 网关,类似 agentd,但是只用于 Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。 它的数 据最终会给到server或者proxy。

数据采集流程

  1. Agent 数据采集

    • Agent 收集主机性能指标(如通过 /proc 文件系统)。
    • 支持自定义监控项(UserParameters)扩展采集范围。
  2. 数据传输

    • 被动模式:Server 轮询 Agent(默认 10050/TCP 端口)。
    • 主动模式:Agent 主动发送数据到 Server/Proxy(端口 10051)。
  3. Server 数据处理

    • 数据校验 → 触发器规则匹配 → 触发告警 → 存储到数据库。
  4. 数据存储与展示

    • 数据库持久化存储 → Web 界面生成图表/报表。

架构模式

根据规模与网络复杂度,Zabbix 支持三种架构:

架构类型适用场景核心特点
Server-Client小型环境(≤100 节点)直连模式,无代理层;适合局域网环境。
Server-Proxy-Client中型环境(100–5000 节点)Proxy 分担 Server 负载,支持跨机房/防火墙;数据缓存保障可靠性。
Master-Node-Client超大规模(≥5000 节点)多级 Node 同步数据,Master 故障不影响 Node;数据库分片提升性能。

Zabbix 常用术语

  • 主机(host) :要监控的网络设备,可由 IP 或 DNS 名称指定;
  • 主机组(host group):主机的逻辑容器,可以包含主机和模板,但同一个组织内的主机和模 板不能互相链接;主机组通常在给用户或用户组指派监控权限时使用;
  • 监控项(item) :一个特定监控指标的相关的数据;这些数据来自于被监控对象;item是 zabbix进行数据收集的核心,相对某个监控对象,每个 item 都由"key"标识;
  • 触发器(trigger) : 一个表达式,用于评估某监控对象的特定 item 内接收到的数据是否在 合理范围内,也就是阈值;接收的数据量大于阈值时,触发器状态将从"OK"转变 为"Problem",当数据再次恢复到合理范围,又转变为"OK";
  • 事件(event) :触发一个值得关注的事情,比如触发器状态转变,新的 agent 或重新上线的agent 的自动注册等;
  • 异常 (problem):一个处在“异常”状态的触发器
  • 动作(action) :指对于特定事件事先定义的处理方法,如发送通知,何时执行操作;
  • 升级 (escalation):一个在动作内执行操作的自定义场景; 发送通知/执行远程命令的序列
  • 报警媒介类型(media) :发送通知的手段或者通道,如 Email、Jabber 或者 SMS 等;
  • 通知 (notification):利用已选择的媒体途径把跟事件相关的信息发送给用户
  • 远程命令 (remote command):一个预定义好的,满足一些条件的情况下,可以在被监控主机上自动执行的命令
  • 模板 (template) : 用于快速定义被监控主机的预设条目集合, 通常包含了 item、 trigger、graph、 screen、 application 以及 low-level discovery rule;模板可以直接链接 至某个主机;
  • 应用 (application):一组监控项组成的逻辑分组
  • web 场景 (web scenario):利用一个或多个HTTP请求来检查网站的可用性
  • 前端(frontend) : Zabbix提供的web界面
  • Zabbix API:Zabbix API允许你使用JSON RPC协议 (是一个无状态且轻量级的远程过程调用(RPC)传送协议,其传递内容透过 JSON 为主) 来创建、更新和获取Zabbix对象(如主机、监控项、图形和其他)信息或者执行任何其他的自定义的任务
  • Zabbix server:Zabbix软件实现监控的核心程序,主要功能是与Zabbix proxies和Agents进行交互、触发器计算、发送告警通知;并将数据集中保存等
  • Zabbix agent
    • 一个部署在监控对象上的,能够主动监控本地资源和应用的程序
    • Zabbix agent 部署在监控的目标上,主动监测本地的资源和应用(硬件驱动,内存,处理器统计等)。
    • Zabbix agent收集本地的操作信息并将数据报告给Zabbix server用于进一步处理。一旦出现异常 (比如硬盘空间已满或者有崩溃的服务进程), Zabbix server会主动警告管理员指定机器上的异常。. Zabbix agents 的极端高效缘于它可以利用本地系统调用来完成统计数据的收集。
  • 被动检查(passive check) :模式中 agent 应答数据请求,Zabbix server(或者proxy)询问agent数据,如CPU 的负载情况,然后 Zabbix agent 回送结果。
  • 主动检查(Active checks) :处理过程将相对复杂。 Agent 必须首先从 Zabbix sever 索取监控项列表以进行独立处理,然后周期性地发送新的值给server。
  • Zabbix proxy:abbix Proxy 是一个可以从一个或多个受监控设备收集监控数据,并将信息发送到Zabbix sever的进程,基本上是代表 sever工作的。 所有收集的数据都在本地进行缓存,然后传送到 proxy 所属的 Zabbix sever。

Zabbix 部署

环境准备

主机名IP配置磁盘操作系统预装软件
zabbix-server192.168.148.1052C4G20GopenEuler-24.03(LTS)LNMP、zabbix_server、zabbix-agent2
zabbix-agent192.168.148.1061C2G20GopenEuler-24.03(LTS)zabbix-agent2

Zabbix Server部署

安装Nginx

安装服务

bash
dnf -y install nginx

# 创建程序用户
useradd -s /sbin/nologin -M www
chown -R www:www /var/lib/nginx

nginx.conf

nginx
cat > /etc/nginx/nginx.conf << "EOF"
worker_processes auto;
user www;
events {
  worker_connections 20240;
}
http {
  include mime.types;
  default_type application/octet-stream;
  sendfile on;
  keepalive_timeout 65;
  server {
    listen 80;
    server_name localhost;
    location / {
      root html;
      index index.php index.html index.htm;
    }
    location ~ \.(php|php5)?$ {
      root html;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
      include fastcgi_params;
    }
  }
}
EOF

启动服务

bash
systemctl enable nginx --now

安装MySQL

bash
dnf -y install mysql-devel libevent-devel pcre-devel
dnf -y install mysql-server

systemctl enable mysqld --now

安装PHP

安装基础依赖

bash
dnf -y install gcc gcc-c++ cmake libxml2 libxml2-devel bzip2 bzip2-devel libjpeg-turbo  libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel libcurl libcurl-devel libjpeg libjpeg-devel curl curl-devel openssl openssl-devel sqlite-devel libwebp libwebp-devel oniguruma-devel oniguruma

安装libzip依赖

bash
# 卸载旧版
dnf -y remove libzip

# 下载源码包
wget --no-check-certificate  https://libzip.org/download/libzip-1.3.2.tar.gz
# 解压
tar xf libzip-1.3.2.tar.gz -C /usr/src
# 编译安装
cd /usr/src/libzip-1.3.2/
./configure && make -j$(nproc) && make install
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"
ldconfig

安装freetype依赖

bash
# 下载源码包
wget --no-check-certificate https://download.savannah.gnu.org/releases/freetype/freetype-2.10.4.tar.gz
# 解压
tar xf freetype-2.10.4.tar.gz -C /usr/src
# 编译安装
cd /usr/src/freetype-2.10.4
./configure --prefix=/usr/local/freetype
make -j$(nproc) && make install

编译libiconv依赖

bash
# 安装libiconv依赖
dnf install libjpeg libjpeg-devel libxslt-devel  libxml2 libxml2-devel openssl-devel openssl-perl curl curl-devel libpng libpng-devel freetype freetype-devel libicu-devel -y

# 下载源码包
wget --no-check-certificate https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz
# 解压
tar xf libiconv-1.17.tar.gz -C /usr/src
# 编译安装
cd /usr/src/libiconv-1.17
./configure --prefix=/usr/local/libiconv
make -j$(nproc) && make install

编译PHP

下载源码包
bash
wget --no-check-certificate https://www.php.net/distributions/php-8.1.18.tar.gz
tar xf php-8.1.18.tar.gz -C /usr/src
编译安装
bash
cd /usr/src/php-8.1.18
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/conf.d \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv \
--with-freetype=/usr/local/freetype \
--with-jpeg \
--with-zlib \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--with-curl \
--enable-mbregex \
--enable-mbstring \
--enable-intl \
--enable-ftp \
--enable-gd \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-zip \
--enable-soap \
--with-gettext \
--enable-opcache \
--with-xsl \
--with-pear \
--with-webp 

# 编译安装
make -j$(nproc) && make install
修改php.ini配置
bash
# 创软连接
ln -s /usr/local/php/bin/* /usr/bin/
ln -s /usr/local/php/sbin/* /usr/bin/

# 复制模板配置文件
cp /usr/local/php/etc/php.ini-production /usr/local/php/etc/php.ini
mkdir -p /usr/local/php/{etc,conf.d}

# 修改php配置优化项
sed -i 's/post_max_size =.*/post_max_size = 50M/g' /usr/local/php/etc/php.ini
sed -i 's/upload_max_filesize =.*/upload_max_filesize = 50M/g' /usr/local/php/etc/php.ini
sed -i 's/;date.timezone =.*/date.timezone = PRC/g' /usr/local/php/etc/php.ini
sed -i 's/short_open_tag =.*/short_open_tag = On/g' /usr/local/php/etc/php.ini
sed -i 's/;cgi.fix_pathinfo=.*/cgi.fix_pathinfo=0/g' /usr/local/php/etc/php.ini
sed -i 's/max_execution_time =.*/max_execution_time = 300/g' /usr/local/php/etc/php.ini
sed -i 's/disable_functions =.*/disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server/g' /usr/local/php/etc/php.ini

# 检测配置文件
pear config-set php_ini /usr/local/php/etc/php.ini
pecl config-set php_ini /usr/local/php/etc/php.ini
修改PHP-FPM配置
bash
# 复制模板文件
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf


vim /usr/local/php/etc/php-fpm.d/www.conf
[www]
;同主机尽量使用同用户,不能使用root用户
user = www
group = www
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 30
listen.owner = www
listen.group = www
listen.mode = 0666
pm.max_requests = 1024
pm.process_idle_timeout = 10s
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
启动php-fpm
bash
php-fpm
系统服务文件
bash
cat > /usr/lib/systemd/system/php-fpm.service << EOF
[Unit]
Description=PHP-FPM FastCGI Process
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启动服务(匹配图中的php-fpm进程)
sudo systemctl start php-fpm

# 设置开机自启
sudo systemctl enable php-fpm

# 检查状态(确认进程数匹配pm.max_children)
sudo systemctl status php-fpm -l

# 查看与Nginx的连接(匹配图中的fastcgi_pass)
ss -xlp | grep php-fpm

安装zabbix

创建zabbix程序用户

bash
useradd -Ms /sbin/nologin zabbix

创建初始数据库和数据库用户

sql
-- 创建数据库
create database zabbix character set utf8mb4 collate utf8mb4_bin;
-- 创建用户
create user zabbix@localhost identified by 'zabbix';
-- 为用户授权
grant all privileges on zabbix.* to zabbix@localhost;

安装依赖包

bash
yum install mailx postfix dos2unix -y
yum -y install openssl-devel libcurl-devel libevent-devel
yum -y install net-snmp-devel

# 设置开机启动
systemctl enable postfix --now

编译zabbix

bash
# 下载源码包
wget https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.28.tar.gz
tar -zxvf zabbix-6.0.28.tar.gz -C /usr/src
cd /usr/src/zabbix-6.0.28

# 预配置
./configure --prefix=/usr/local/zabbix/ \
  --enable-server \
  --enable-agent \
  --with-mysql \
  --with-net-snmp \
  --with-libcurl --with-libevent
  
# 安装
make install

导入数据

bash
# sql文件在zabbix-6.0.28/database/mysql/
mysql -B zabbix < schema.sql
mysql -B zabbix < images.sql
mysql -B zabbix < data.sql

导入前端代码

bash
# 代码在zabbix-6.0.28/ui
rm -rf /usr/share/nginx/html/*
cp -rp ./* /usr/share/nginx/html/

设置语言包

将Windows的中文ttf字体 C:\Windows\Fonts目录下的字体上传至zabbix-server服务器,并且将字体改名为已经被套了几层软连接的默认字体名字DejaVuSans.ttf,不用重启服务器或应用,刷新页面即可。

bash
# 文件位置在zabbix-6.0.28/assets/fonts

cp DejaVuSans.ttf DejaVuSans.ttf.bak

# 比如华松中文字体
mv STZHONGS.TTF DejaVuSans.ttf

chown www:www DejaVuSans.ttf

配置service管理文件

bash
cat > /usr/local/zabbix/etc/zabbix_server.conf << "EOF"
LogFile=/var/log/zabbix/zabbix_server.log
PidFile=/tmp/zabbix_server.pid
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
Timeout=4
LogSlowQueries=3000
StatsAllowedIP=0.0.0.0
EOF

# 创建日志文件
mkdir /var/log/zabbix -p
chown -R zabbix:zabbix /var/log/zabbix/

启动zabbix

bash
cat > /usr/lib/systemd/system/zabbix.service << "EOF"
[Unit]
Description=Zabbix Server
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/usr/local/zabbix/etc/zabbix_server.conf"
EnvironmentFile=-/usr/local/zabbix
Type=forking
PIDFile=/tmp/zabbix_server.pid
ExecStart=/usr/local/zabbix/sbin/zabbix_server -c
/usr/local/zabbix/etc/zabbix_server.conf
ExecStop=/usr/bin/kill $MAINPID
Restart=always
RestartSec=5
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl enable zabbix --now


# 检测进程
ps aux|grep zabbix
ss -anplut|grep zabbix

安装zabbix get

bash
# 安装
dnf -y install zabbix-get

# 检查zabbix的联通性
zabbix_get -s 192.168.148.106 -k "agent.ping"

-s 指定客户端IP地址
执行结果是1,表示客户端配置正常

部署zabbix agent

安装服务

bash
# 设置zabbix源
rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-6.4-1.el9.noarch.rpm

# 安装
dnf -y install zabbix-agent2

修改agent配置文件

bash
cd /etc/zabbix/
cp zabbix_agent2.conf{,.bak}

# 配置文件
cat > /etc/zabbix/zabbix_agent2.conf << "EOF"
PidFile=/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
# 被动模式的服务端ip地址
Server=192.168.148.105
# 主动模式的服务端ip地址
ServerActive=192.168.148.105
# 当前主机 hostname
Hostname=zabbix-agent
Include=/etc/zabbix/zabbix_agent2.d/*.conf
PluginSocket=/run/zabbix/agent.plugin.sock
ControlSocket=/run/zabbix/agent.sock
Include=/etc/zabbix/zabbix_agent2.d/plugins.d/*.conf
EOF

# 启动服务
systemctl restart zabbix-agent2

设置监控基础

添加主机

  • 模板:选择 —> 主机群组选择Templates —> Linux by Zabbix agent主动模式
  • 群组:选择 —> Linux Servers
  • Interfaces:
    • 客户端:设置客户端IP,端口和客户端agent保持一致

创建图表

配置 —> 主机 —> 要操作主机列表点击图形 —> 创建图形

  • 名称:自定义
  • 监控项:点击添加,选择要监控的项

自定义监控

设置监控项

修改客户端zabbix_agentd2.conf配置文件,最后一行追加

bash
# 语法
# UserParameter=key,shell command
# UserParameter:固定
# ke:自定义
# Shell命令或脚本

# 内存使用率
UserParameter=memory_used,free -m | awk '/Mem/{printf "%.2f",($3*100)/$2}'

注:在zabbix_server端可以使用zabbix_get -s agent端ip地址 -p 10050 -k key名通过此命令可以查看agent端key的监控值;

添加监控项

配置 —> 主机 —> 监控项(刚设置的agent主机)—> 创建监控项

  • 名称:自定义(内存使用率)
  • 类型:Zabbix客户端(主动模式)
  • 键值:key(memory_used)
  • 信息类型:可以选择浮点数
  • 单位:自定义,可以设置%
  • 更新时间:单位s(秒)、m(分钟)

创建触发器

根据条件进行触发某个告警操作

  • 名称:自定义(内存使用率)
  • 严重性:警告
  • 问题表现形式:点击添加
    • 监控项:选择内存使用率这里是监控项设置的名
    • 功能:可以选择last()-最后(最近)的T值
    • 结果:可以选择>,设置阀值比如70
  • 事件成功迭代:恢复表达式
  • 恢复表达式:
    • 监控项:选择内存使用率这里是监控项设置的名
    • 功能:可以选择last()-最后(最近)的T值
    • 结果:可以选择<,设置阀值比如70

测试

bash
# 在agent客户端临时提升内存,以下是1C2G服务器测试用例
python3 -c "a = [bytearray(1024 * 1024) for _ in range(600)]; input('Press Enter to release...')"

# 可以在服务端查看值
zabbix_get  -s 192.168.148.106 -k 'memory_used'

Zabbix 常用自定义监控项

系统监控常用自带监控项

  • agent.ping -- 检测客户端可达性、返回nothing表示不可达。1表示可达
  • system.cpu.load -- 检测cpu负载。返回浮点数
  • system.cpu.util -- 检测cpu使用率。返回浮点数
  • vfs.dev.read -- 检测硬盘读取数据,返回是sps.ops.bps浮点类型,需要定义1024倍
  • vfs.dev.write -- 检测硬盘写入数据。返回是sps.ops.bps浮点类型,需要定义1024倍
  • net.if.out[br0] --检测网卡流速、流出方向,时间间隔为60S
  • net-if-in[br0] --检测网卡流速,流入方向(单位:字节) 时间间隔60S
  • proc.num[] 目前系统中的进程总数,时间间隔60s
  • proc.num[,,run] 目前正在运行的进程总数,时间间隔60S
  • system.cpu.swtiches --cpu的进程上下文切换,单位sps,表示每秒采样次数,api中参数history需指定为3
  • system.cpu.intr --cpu中断数量、api中参数history需指定为3
  • system.cpu.load[percpu,avg1] --cpu每分钟的负载值,按照核数做平均值(Processor load (1 min average per core)),api中参数history需指定为0
  • system.cpu.load[percpu,avg5] --cpu每5分钟的负载值,按照核数做平均值(Processor load (5 min average per core)),api中参数history需指定为0
  • system.cpu.load[percpu,avg15] --cpu每5分钟的负载值,按照核数做平均值(Processor load (15 min average per core)),api中参数history需指定为0

系统监控常用自定义监控项

内存相关

bash
# 创建配置文件
cat > /etc/zabbix/zabbix_agent2.d/memory_advanced.conf << "EOF"
UserParameter=memory.rate[*],free -m | awk -v type='$1' '/^Mem/{ if (type == "used") { printf "%.2f", ($$3/$$2)*100 }; if (type == "free") { printf "%.2f", ($$7/$$2)*100 }; if (type == "cache") { printf "%.2f", ($$6/$$2)*100 }}'
EOF


# 在可视化界面中添加监控项
memory.rate[cache] --检测内存的缓存使用量,返回浮点数
memory.rate[free] --检测内存的空闲率,返回浮点数
memory.rate[used] --检测内存的使用率,返回浮点数

Redis 相关的自定义项(未测试)

bash
vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/redis.conf
UserParameter=Redis.Status,/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 ping |grep -c PONG
UserParameter=Redis_conn[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "connected_clients" | awk -F':' '{print $2}'
UserParameter=Redis_rss_mem[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_memory_rss" | awk -F':' '{print $2}'
UserParameter=Redis_lua_mem[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_memory_lua" | awk -F':' '{print $2}'
UserParameter=Redis_cpu_sys[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_sys" | awk -F':' '{print $2}'
UserParameter=Redis_cpu_user[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_user" | awk -F':' '{print $2}'
UserParameter=Redis_cpu_sys_cline[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_sys_children" | awk -F':' '{print $2}'
UserParameter=Redis_cpu_user_cline[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_user_children" | awk -F':' '{print $2}'
UserParameter=Redis_keys_num[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "$$1" | grep -w "keys" | grep db$3 | awk -F'=' '{print $2}' | awk -F',' '{print $1}'
UserParameter=Redis_loading[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep loading | awk -F':' '{print $$2}'

Redis.Status 		--检测Redis运行状态, 返回整数
Redis_conn  		--检测Redis成功连接数,返回整数
Redis_rss_mem  		--检测Redis系统分配内存,返回整数
Redis_lua_mem  		--检测Redis引擎消耗内存,返回整数
Redis_cpu_sys 		--检测Redis主程序核心CPU消耗率,返回整数
Redis_cpu_user 		--检测Redis主程序用户CPU消耗率,返回整数
Redis_cpu_sys_cline --检测Redis后台核心CPU消耗率,返回整数
Redis_cpu_user_cline --检测Redis后台用户CPU消耗率,返回整数
Redis_keys_num 		--检测库键值数,返回整数
Redis_loding 		--检测Redis持久化文件状态,返回整数

Nginx 相关的自定义项

bash
# nginx 配置
vim /etc/nginx/conf.d/default.conf
    location /nginxstatus
    {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }


# 在命令行中使用curl -s http://127.0.0.1/nginxstatus即可获得nginx的连接状态。

# zabbix 监控
vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/nginx.conf
UserParameter=Nginx.active,/usr/bin/curl -s "http://127.0.0.1:80/nginxstatus" | awk '/Active/ {print $NF}'
UserParameter=Nginx.read,/usr/bin/curl -s "http://127.0.0.1:80/nginxstatus" |awk '/Reading/{print $2}'
UserParameter=Nginx.wrie,/usr/bin/curl -s "http://127.0.0.1:80/nginxstatus" |awk '/Writing/{print $4}'
UserParameter=Nginx.wait,/usr/bin/curl -s "http://127.0.0.1:80/nginxstatus" |awk '/Waiting/{print $6}'
UserParameter=Nginx.accepted,/usr/bin/curl -s "http://127.0.0.1:80/nginxstatus" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $1}'
UserParameter=Nginx.handled,/usr/bin/curl -s "http://127.0.0.1:80/nginxstatus" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $2}'
UserParameter=Nginx.requests,/usr/bin/curl -s "http://127.0.0.1:80/nginxstatus" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $3}'

TCP相关的自定义项

bash
cat > /usr/local/zabbix/etc/zabbix_agentd.conf.d/tcp_connect.conf << "EOF"
UserParameter=socket.tcp_listen,grep -c "\b 0A \b" /proc/net/tcp
UserParameter=socket.tcp_closing,grep -c "\b 0B \b" /proc/net/tcp
UserParameter=socket.tcp_established,grep -c "\b 01 \b" /proc/net/tcp
UserParameter=socket.tcp_synsent,grep -c "\b 02 \b" /proc/net/tcp
UserParameter=socket.tcp_synrecv,grep -c "\b 03 \b" /proc/net/tcp
UserParameter=socket.tcp_finwait1,grep -c "\b 04 \b" /proc/net/tcp
UserParameter=socket.tcp_finwait2,grep -c "\b 05 \b" /proc/net/tcp
UserParameter=socket.tcp_timewait,grep -c "\b 06 \b" /proc/net/tcp
UserParameter=socket.tcp_closed,grep -c "\b 07 \b" /proc/net/tcp
UserParameter=socket.tcp_closewait,grep -c "\b 08 \b" /proc/net/tcp
UserParameter=socket.tcp_lastack,grep -c "\b 09 \b" /proc/net/tcp
EOF
systemctl restart zabbix-agent2
# 结果返回整数

JMX 监控 Tomcat

官方文档:https://www.zabbix.com/documentation/6.4/zh/manual/config/items/itemtypes/jmx_monitoring

从zabbix 2.0开始,JMX监控端以Zabbix守护进程的形式运行,称为“Zabbix Java gateway”。

环境准备

主机IP安装服务
zabbix-server192.168.148.105java-gateway
zabbix-agent192.168.148.101JDK、tomcat、JMX

zabbix-agent配置

提前装好JDK和Tomcat

配置 JMX

bash
# 配置tomcat远程端口、加密,最好放在脚本文件的开头部分比如`# OS specific support.  $var _must_ be set to either true or false.`的下一行
vim /usr/local/tomcat/bin/catalina.sh

CATALINA_OPTS='-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.148.101'

zabbix-server配置

安装Zabbix Java gateway

bash
dnf install zabbix-java-gateway -y

修改Zabbix Java gateway配置文件

bash
vim /etc/zabbix/zabbix_java_gateway.conf
# 参数值都存在,只需打开注释即可
LISTEN_IP="0.0.0.0"  						#监听地址
LISTEN_PORT=10052  							#Java gateway默认监听10052端口
START_POLLERS=5  							#开启的工作线程数
TIMEOUT=30  								#超时时间
PID_FILE="/var/run/zabbix/zabbix_java.pid"  #PID_FILE文件

# 验证
grep "^[a-Z]" /etc/zabbix/zabbix_java_gateway.conf

启动并验证Zabbix Java gateway服务

bash
systemctl enable --now zabbix-java-gateway
systemctl status zabbix-java-gateway
ss -antup | grep 10052

配置zabbix server调用java gateway

bash
cat >> /usr/local/zabbix/etc/zabbix_server.conf << "EOF"
JavaGateway=192.168.148.104
JavaGatewayPort=10052
StartJavaPollers=5
EOF
# 建议让StartJavaPollers选项的值小于或等于START_POLLERS

systemctl restart zabbix
  • JavaGateway:JavaGateway的所在服务器IP地址
  • JavaGatewayPort:JavaGateway的服务端口
  • StartJavaPollers:从javaGateway采集数据的进程数

自定义监控 Tomcat 状态

创建配置

bash
cat > /etc/zabbix/zabbix_agent2.d/tomcat_ststua.conf << "EOF"
UserParameter=tomcat.status,ss -antp | grep 8080 | awk '{print $1}'| grep -o "LISTEN" >/dev/null  && echo 1 || echo 0
EOF

重启agent2

bash
systemctl restart zabbix-agent2
systemctl status zabbix-agent2

验证

bash
# 在zabbix-server执行
zabbix_get -s '192.168.148.101' -p 10050 -k 'tomcat.status'

JMX监控项

JMX监控项添加主机页面选择好模板[Apache Tomcat by JMX]都是配置好的监控项,可以直接添加自定义监控图表查看即可。

下载jar包

获取jvm需要用到catalina-jmx-remote.jarcmdline-jmxclient-0.10.3.jar两个包,根据在即tomcat版本下载,下载后放到tomcat的bin目录下。

bash
wget -O /usr/local/tomcat/bin/catalina-jmx-remote.jar http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.27/bin/extras/catalina-jmx-remote.jar

# cmdline-jmxclient-0.10.3.jar下载地址
http://crawler.archive.org/cmdline-jmxclient/cmdline-jmxclient-0.10.3.jar

# 重启tomcat

# 测试
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:type=Memory HeapMemoryUsage

堆内存

bash
# 指令查看
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:12345 java.lang:type=Memory HeapMemoryUsage

# Zabbix监控项的键值
jmx["java.lang:type=Memory","HeapMemoryUsage.committed"]					# 已提交堆内存
jmx["java.lang:type=Memory","HeapMemoryUsage.max"]							# 堆内存最大值
jmx["java.lang:type=Memory","HeapMemoryUsage.used"]							# 已用堆内存

内存池 Survivor Space

bash
# 指令查看
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:name=Survivor\ Space,type=MemoryPool Usage

# Zabbix监控项的键值
jmx["java.lang:type=MemoryPool,name=Survivor Space",Usage.committed]		# 已提交空间
jmx["java.lang:type=MemoryPool,name=Survivor Space",Usage.max]				# 内存池最大空间
jmx["java.lang:type=MemoryPool,name=Survivor Space",Usage.used]				# 内存池已用空间

内存池 Eden Space

bash
# 指令查看
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:name=Eden\ Space,type=MemoryPool Usage

# Zabbix监控项的键值
jmx["java.lang:type=MemoryPool,name=Eden Space",Usage.committed]			# 已提交空间
jmx["java.lang:type=MemoryPool,name=Eden Space",Usage.max]					# 内存池最大空间
jmx["java.lang:type=MemoryPool,name=Eden Space",Usage.used]					# 内存池已用空间

内存池 Old Gen

bash
# 指令查看
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:name=Old\ Gen,type=MemoryPool Usage

# Zabbix监控项的键值
jmx["java.lang:type=MemoryPool,name=Old Gen",Usage.committed]				# 已提交空间
jmx["java.lang:type=MemoryPool,name=Old Gen",Usage.max]						# 内存池最大空间
jmx["java.lang:type=MemoryPool,name=Old Gen",Usage.used]					# 内存池已用空间

内存池 Meta Space

bash
# 指令查看
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:type=MemoryPool,name=Metaspace Usage

# Zabbix监控项的键值
jmx["java.lang:type=MemoryPool,name=Metaspace",Usage.committed]			# 已提交空间
jmx["java.lang:type=MemoryPool,name=Metaspace",Usage.used]				# 内存池已用空间

内存池 Code Cache

bash
# 指令查看
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:type=MemoryPool,name=Code\ Cache Usage

# Zabbix监控项的键值
jmx["java.lang:type=MemoryPool,name=Code Cache",Usage.committed]		# 已提交空间
jmx["java.lang:type=MemoryPool,name=Code Cache",Usage.max]				# 内存池最大空间
jmx["java.lang:type=MemoryPool,name=Code Cache",Usage.used]				# 内存池已用空间

非堆内存

bash
# 指令查看
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:type=Memory NonHeapMemoryUsage


# Zabbix监控项的键值
jmx["java.lang:type=Memory","NonHeapMemoryUsage.committed"]					# 已提交空间
jmx["java.lang:type=Memory","NonHeapMemoryUsage.used"]						# 内存已用空间

类加载

bash
# 加载总数: 
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:12345 java.lang:type=ClassLoading TotalLoadedClassCount
# 已加载: 
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:12345 java.lang:type=ClassLoading LoadedClassCount
# 已卸载: 
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:12345 java.lang:type=ClassLoading UnloadedClassCount

# Zabbix监控项的键值
jmx["java.lang:type=ClassLoading","TotalLoadedClassCount"]				# 加载总数
jmx["java.lang:type=ClassLoading","LoadedClassCount"]					# 已加载
jmx["java.lang:type=ClassLoading","UnloadedClassCount"]					# 已卸载

java线程

bash
# 总开启线程
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:12345 java.lang:type=Threading TotalStartedThreadCount
# 活动线程
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:12345 java.lang:type=Threading ThreadCount
# 线程峰值
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:12345 java.lang:type=Threading PeakThreadCount

# Zabbix监控项的键值
jmx["java.lang:type=Threading","TotalStartedThreadCount"]				# 总开启线程
jmx["java.lang:type=Threading","ThreadCount"]							# 活动线程
jmx["java.lang:type=Threading","PeakThreadCount"]						# 线程峰值

tomcat线程

bash
# 最大线程
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 Catalina:name=\"http-nio-8080\",type=ThreadPool maxThreads
# 当前线程
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 Catalina:name=\"http-nio-8080\",type=ThreadPool currentThreadCount
# 繁忙线程
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 Catalina:name=\"http-nio-8080\",type=ThreadPool currentThreadsBusy

# Zabbix监控项的键值
jmx["Catalina:type=ThreadPool,name=\"http-nio-8080\"",maxThreads] 		  # 最大线程
jmx["Catalina:type=ThreadPool,name=\"http-nio-8080\"",currentThreadCount] # 当前线程
jmx["Catalina:type=ThreadPool,name=\"http-nio-8080\"",currentThreadsBusy] # 繁忙线程

网络流量

bash
# 接收的字节
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor bytesReceived
# 发送的字节
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor bytesSent

# Zabbix监控项的键值
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",bytesReceived]      # 接收的字节
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",bytesSent]         # 发送的字节

tomcat请求

bash
# tomcat请求数
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor requestCount
# tomcat出错请求
java -jar /usr/local/tomcat/bin/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor errorCount

# Zabbix监控项的键值
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",requestCount]     # tomcat请求数
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",errorCount]       # tomcat出错请求

解决问题

bash
# 以上监控项找不到问题如:
org.archive.jmx.Client java.lang:name=PS Eden Space,type=MemoryPool is not a registered bean

# 可以大返回的匹配查看是否支持name字段,比如老版本个别的就PS开头
java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 | grep MemoryPool

web操作

添加主机

配置 —> 主机 —> 创建主机

  • 主机名称:自定义
  • 模板:
    • Linux by Zabbix agent
    • Generic Java JMX
  • 群组:创建自定义Tomcat集群群组
  • Interfaces:
    • 客户端:用于监控主机情况。端口10050
    • JMX:用于监控Tomcat情况。端口12345

添加监控项

  • 名称:监控Tomcat服务状态
  • 类型:Zabbix客户端
  • 键值:tomcat.status
  • 信息类型:数字
  • 更新间隔:5s

添加触发器

  • 名称:Tomcat状态监测
  • 严重性:严重
  • 问题表现形式:last(/tomcat-01/tomcat.status)=0
  • 事件成功迭代:恢复表达式
  • 恢复表达式:last(/tomcat-01/tomcat.status)=1

添加图形

  • 名称:Tomcat状态监控
  • 监控项:选择刚添加的监控项名称监控Tomcat服务状态

MySQL 监控

bash
cat > /etc/zabbix/zabbix_agent2.d/ << "EOF"
UserParameter=mysql.loguser,mysql -uroot -p"123123" -e "show full processlist"|wc -l
UserParameter=mysql.ping,mysqladmin -uroot -p"123123" -P3306 -h192.168.159.136 ping | grep -c alive
UserParameter=mysql.status[*],/opt/scripts/zabbix/chk_mysql.sh $1
EOF

mkdir -p /opt/scripts/zabbix
cat > /opt/scripts/zabbix/chk_mysql.sh << "EOF"
#!/bin/bash
# FileName: check_mysql.sh
# 用户名
MYSQL_USER='root'
# 密码
MYSQL_PWD='123123'
# 主机地址/IP
MYSQL_HOST='192.168.159.36'
# 端口
MYSQL_PORT='3306'
# 数据连接
MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}"
# 参数是否正确
if [ $# -ne "1" ];then
	echo "arg error!"
fi
# 获取数据
case $1 in
    Uptime)
        result=`${MYSQL_CONN} status | cut -f2 -d":" | cut -f1 -d"T"`
        echo $result
        ;;
    Com_update)
        result=`${MYSQL_CONN} extended-status | grep -w "Com_update" | cut -d"|" -f3`
        echo $result
        ;;
    Slow_queries)
        result=`${MYSQL_CONN} status | cut -f5 -d":" | cut -f1 -d"O"`
        echo $result
        ;;
    Com_select)
        result=`${MYSQL_CONN} extended-status | grep -w "Com_select" | cut -d"|" -f3`
        echo $result
        ;;
    Com_rollback)
        result=`${MYSQL_CONN} extended-status | grep -w "Com_rollback" | cut -d"|" -f3`
        echo $result
        ;;
    Questions)
        result=`${MYSQL_CONN} status | cut -f4 -d":" | cut -f1 -d"S"`
        echo $result
        ;;
    Com_insert)
        result=`${MYSQL_CONN} extended-status | grep -w "Com_insert" | cut -d"|" -f3`
        echo $result
        ;;
    Com_delete)
        result=`${MYSQL_CONN} extended-status | grep -w "Com_delete" | cut -d"|" -f3`
        echo $result
        ;;
    Com_commit)
        result=`${MYSQL_CONN} extended-status | grep -w "Com_commit" | cut -d"|" -f3`
        echo $result
        ;;
    Bytes_sent)
        result=`${MYSQL_CONN} extended-status | grep -w "Bytes_sent" | cut -d"|" -f3`
        echo $result
        ;;
    Bytes_received)
        result=`${MYSQL_CONN} extended-status | grep -w "Bytes_received" | cut -d"|" -f3`
        echo $result
        ;;
    Com_begin)
        result=`${MYSQL_CONN} extended-status | grep -w "Com_begin" | cut -d"|" -f3`
        echo $result
        ;;
    *)
        echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
        ;;
esac
EOF

chmod +x /opt/scripts/zabbix/chk_mysql.sh
chown zabbix:zabbix /opt/scripts/zabbix/chk_mysql.sh

systemctl restart zabbix-agent2

Zabbix 告警

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

内置邮箱告警

获取163邮箱授权码

登录邮箱 —>设置 —> 开启POP3/SMTP服务 —> 点击新增授权码

创建媒介类型

管理 —> 报警媒介类型 —> 创建媒体类型

  • 名称:自定义如:163邮箱告警
  • 类型:电子邮件
  • SMTP服务器:smtp.163.com
  • SMTP服务器端口:25
  • SMTP HELO:163.com
  • SMTP电邮:你的邮箱名如:zabbix@163.com
  • 安全链接:无
  • 认证:用户名和密码
  • 用户名称:你的邮箱名如:zabbix@163.com
  • 密码:申请的授权码

告警用户

可以自定义创建用户然后点进用户进入详情选择报警媒介

  • 类型:脚本邮件告警选择之前创建的媒介类型
  • 收件人:zabbix@qq.com

创建动作

配置 —> 动作 —> Trigger actions —> 创建动作

动作

  • 名称:自定义
  • 条件:这里设置的是触发条件
    • 类型:触发器
    • 操作者:=
    • 触发器:选择之前创建的

操作

  • 默认操作步骤持续时间:单位s、h、d

  • 操作:

    • Send to user groups:通知的用户组

    • Send to users:通知的用户

    • 自定义消息内容:勾选

      • 主题:

        bash
        故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
      • 消息:

        bash
        告警主机:{HOSTNAME1}
        告警时间:{EVENT.DATE} {EVENT.TIME}
        告警等级:{TRIGGER.SEVERITY}
        告警信息: {TRIGGER.NAME}
        告警项目:{TRIGGER.KEY1}
        问题详情:{ITEM.NAME}:{ITEM.VALUE}
        当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
        事件ID:{EVENT.ID}
      • 条件:默认即可

  • 恢复操作:

    • Send to user groups:通知的用户组

    • Send to users:通知的用户

    • 自定义消息内容:勾选

      • 主题:

        bash
        故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}恢复
      • 消息:

        bash
        告警主机:{HOSTNAME1}
        告警时间:{EVENT.DATE} {EVENT.TIME}
        告警等级:{TRIGGER.SEVERITY}
        告警信息: {TRIGGER.NAME}
        告警项目:{TRIGGER.KEY1}
        问题详情:{ITEM.NAME}:{ITEM.VALUE}
        当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
        事件ID:{EVENT.ID}
      • 条件:默认即可

外置脚本邮箱告警

获取邮箱授权码

QQ邮箱

设置 —> 安全设置 —> 生成授权码

配置文档:https://wx.mail.qq.com/list/readtemplate?name=app_intro.html#/agreement/authorizationCode

网易邮箱

登录邮箱 —>设置 —> 开启POP3/SMTP服务 —> 点击新增授权码

设置邮箱服务

bash

cat >> /etc/mail.rc << EOF

set from=zabbix@qq.com
set smtp="smtps://smtp.qq.com:465"
set smtp-auth-user=zabbix@qq.com
set smtp-auth-password=zaaxkopruooibcjj
EOF

echo "邮件内容内容" | mail -s "邮件主题" zabbix@qq.com
  • from:发送邮箱地址
  • smtp:发送邮件服务器
  • smtp-auth-user:邮箱名
  • smtp-auth-password:授权码

设置Zabix告警脚本

bash
# 指定脚本路径
cat >> /usr/local/zabbix/etc/zabbix_server.conf << EOF
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts
EOF

# 告警脚本
cat > /usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh << "EOF"
#export.UTF-8
bt=$2
sjr=$1
FILE=/tmp/mailtmp.txt
echo "$3" >$FILE
/usr/bin/dos2unix -k $FILE
/bin/mail -s "$bt" "$sjr" <$FILE
EOF

chown zabbix:zabbix /usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh
chmod +x /usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh

# 测试
/usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh zabbix@qq.com "测试标题2" "测试内容2"
  • $1/2:Zabbix发送的第1/2个参数

创建媒介类型

管理 —> 报警媒介类型 —> 创建媒体类型

  • 名称:自定义如:脚本邮件告警
  • 类型:脚本
  • 脚本名称:sendmail.sh
  • 脚本参数:
    • 发送人:
    • 主题:
    • 内容:

告警用户

可以自定义创建用户然后点进用户进入详情选择报警媒介

  • 类型:脚本邮件告警选择之前创建的媒介类型
  • 收件人:zabbix@qq.com

创建动作

配置 —> 动作 —> Trigger actions —> 创建动作

动作

  • 名称:自定义
  • 条件:这里设置的是触发条件
    • 类型:触发器
    • 操作者:=
    • 触发器:选择之前创建的

操作

  • 默认操作步骤持续时间:单位s、h、d

  • 操作:

    • Send to user groups:通知的用户组

    • Send to users:通知的用户

    • 自定义消息内容:勾选

      • 主题:

        bash
        故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
      • 消息:

        bash
        告警主机:{HOSTNAME1}<br/>
        告警时间:{EVENT.DATE} {EVENT.TIME}<br/>
        告警等级:{TRIGGER.SEVERITY}<br/>
        告警信息: {TRIGGER.NAME}<br/>
        告警项目:{TRIGGER.KEY1}<br/>
        问题详情:{ITEM.NAME}:{ITEM.VALUE}<br/>
        当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}<br/>
        事件ID:{EVENT.ID}<br/>
      • 条件:默认即可

  • 恢复操作:

    • Send to user groups:通知的用户组

    • Send to users:通知的用户

    • 自定义消息内容:勾选

      • 主题:

        bash
        故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}恢复
      • 消息:

        bash
        告警主机:{HOSTNAME1}<br/>
        告警时间:{EVENT.DATE} {EVENT.TIME}<br/>
        告警等级:{TRIGGER.SEVERITY}<br/>
        告警信息: {TRIGGER.NAME}<br/>
        告警项目:{TRIGGER.KEY1}<br/>
        问题详情:{ITEM.NAME}:{ITEM.VALUE}<br/>
        当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}<br/>
        事件ID:{EVENT.ID}<br/>
      • 条件:默认即可

测试

bash
# 在agent客户端临时提升内存,以下是1C2G服务器测试用例
python3 -c "a = [bytearray(1024 * 1024) for _ in range(600)]; input('Press Enter to release...')"

钉钉告警

钉钉配置

先到钉钉创建告警群然后添加机器人获取机器人Webhook地址

创建钉钉告警脚本

bash
dnf insyum install -y python-requests python

cat > /usr/local/zabbix/share/zabbix/alertscripts/dingding.py << "EOF"
#!/usr/bin/env python
# coding:utf-8

import requests
import json
import sys
import os
import datetime

webhook = "https://oapi.dingtalk.com/robot/send?access_token=6007688587fae00c68d6edd10794fd2422fd8e68b3464d024fb6db7f37d730cc"

def main():
    if len(sys.argv) < 4:
        print("Usage: script.py <user> <text>")
        sys.exit(1)
    
    user = sys.argv[1]
    text = sys.argv[2]

    data = {
        "msgtype": "text",
        "text": {"content": text},
        "at": {"atMobiles": [user], "isAtAll": False}
    }

    headers = {'Content-Type': 'application/json'}
    
    try:
        response = requests.post(url=webhook, data=json.dumps(data), headers=headers)
        response.raise_for_status()
        
        log_message = f"\n{datetime.datetime.now()} {user} "
        
        if response.json().get("errcode") == 0:
            log_message += "发送成功"
        else:
            log_message += "发送失败"
        
        log_message += f"\n{text}"
        
        # 使用with语句自动处理文件关闭
        with open("/tmp/dingding.log", "a+") as f:
            f.write("\n" + "--" * 30)
            f.write(log_message)
            
    except Exception as e:
        print(f"Error: {e}")

if __name__ == "__main__":
    main()
EOF

# 为脚本增加执行权
chmod +x dingding.py
# 测试脚本
python dingding.py a "测试"

创建媒介类型

管理 —> 报警媒介类型 —> 创建媒体类型

  • 名称:自定义如:脚本邮件告警
  • 类型:脚本
  • 脚本名称:dingding.py
  • 脚本参数:
    • 发送人:
    • 主题:
    • 内容:

告警用户

可以自定义创建用户然后点进用户进入详情选择报警媒介

  • 类型:脚本邮件告警选择之前创建的媒介类型
  • 收件人:可以是钉钉账号

创建动作

配置 —> 动作 —> Trigger actions —> 创建动作

动作

  • 名称:自定义
  • 条件:这里设置的是触发条件
    • 类型:触发器
    • 操作者:=
    • 触发器:选择之前创建的

操作

  • 默认操作步骤持续时间:单位s、h、d

  • 操作:

    • Send to user groups:通知的用户组

    • Send to users:通知的用户

    • 自定义消息内容:勾选

      • 主题:

        bash
        故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
      • 消息:

        bash
        告警主机:{HOSTNAME1}
        告警时间:{EVENT.DATE} {EVENT.TIME}
        告警等级:{TRIGGER.SEVERITY}
        告警信息: {TRIGGER.NAME}
        告警项目:{TRIGGER.KEY1}
        问题详情:{ITEM.NAME}:{ITEM.VALUE}
        当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
        事件ID:{EVENT.ID}
      • 条件:默认即可

  • 恢复操作:

    • Send to user groups:通知的用户组

    • Send to users:通知的用户

    • 自定义消息内容:勾选

      • 主题:

        bash
        故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}恢复
      • 消息:

        bash
        告警主机:{HOSTNAME1}
        告警时间:{EVENT.DATE} {EVENT.TIME}
        告警等级:{TRIGGER.SEVERITY}
        告警信息: {TRIGGER.NAME}
        告警项目:{TRIGGER.KEY1}
        问题详情:{ITEM.NAME}:{ITEM.VALUE}
        当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
        事件ID:{EVENT.ID}
      • 条件:默认即可

自动发现

zabbix-server主动通过指定的某网段,进行扫描.zabbix Server主动发现所有客户端,然 后将客户端登记⾃⼰的⼩本本上,缺点zabbix server压⼒⼭⼤(⽹段⼤,客户端多), 时间消耗多。(消耗服务端资源大,不建议使用)

安装agent

bash
# 配置zabbix源
rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-6.4-1.el9.noarch.rpm

# 安装agent
dnf -y install zabbix-agent2
systemctl enable zabbix-agent2 --now

# 在服务端测试
zabbix_get -s IP -p 10050 -k 'agent.ping'

创建自动发现规则

配置 —> 自动发现 —> 创建自动发现规则

  • 名称:自定义如:主机自动发现
  • IP范围:设置自己IP地址段192.168.148.0-254
  • 更新间隔:设置自动发现时间间隔
  • 检查:
    • 检查类型:Zabbix客户端
    • 端口范围:默认10050
    • 键值:system.unamezabbix定义的变量
  • 设备唯一性准则:IP地址
  • 主机名称:DNS名称
  • 可见的名称:主机名称

添加发现动作

配置 —> 动作 —> 发现动作 —> 创建动作

动作

  • 名称:自定义如:主机自动发现
  • 条件:
    • 类型:自动发现规则
    • 自动发现规则:选择之前创建的主机自动发现自动发现规则

操作

  • 第一条

    • Operation:添加主机
  • 第二条

    • Operation:添加到主机群组

    • 主机群组:Linux Servers

  • 第二条

    • Operation:与模板关联

    • 模板:Templates—> Linux by Zabbix agent

自动注册

主动方式的自动注册功能主要用于Agent主动且自动向Server注册,即Agent处于主动模式,主动向Zabbix-Server发送数据进行注册。与自动发现具有同样的功能,都能够实现将设备自动添加到监控系统中。但是主动方式的功能更适合于在特定的环境中使用,当一个条件未知(如Agent的IP地址,Agent的操作系统版本信息等)时,仍然可以实现自动添加监控。他特别适合于当前云环境下的监控,在云环境中IP地址分配、操作系统版本等都可能随机,该功能可以很好的解决类似的问题。

安装agent

bash
# 配置zabbix源
rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-6.4-1.el9.noarch.rpm

# 安装agent
dnf -y install zabbix-agent2
systemctl enable zabbix-agent2 --now

# 在服务端测试
zabbix_get -s IP -p 10050 -k 'agent.ping'

配置agent

bash
cat >> /etc/zabbix/zabbix_agent2.conf << EOF
HostnameItem=system.hostname
HostMetadata=Linux linux_host
HostMetadataItem=system.uname
EOF

systemctl restart zabbix-agent2
  • HostnameItem:获取主机名的key,当设置Hostname后此参数失效
  • HostMetadata:主机元数据标识
  • HostMetadataItem:获取元数据的key,当设置HostMetadata参数后,此参数失效

创建自动注册规则

配置 —> 动作 —> 自动注册动作 —> 创建动作

动作

  • 名称:自定义如:主机自动注册
  • 条件:
    • 类型:主机源数据
    • 操作者:包含
    • 值:Linux这里匹配的是HostMetadata包含的信息

操作

  • 第一条

    • Operation:添加主机
  • 第二条

    • Operation:添加到主机群组

    • 主机群组:Linux Servers

  • 第二条

    • Operation:与模板关联

    • 模板:Templates—> Linux by Zabbix agent