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。
数据采集流程
Agent 数据采集
- Agent 收集主机性能指标(如通过
/proc文件系统)。 - 支持自定义监控项(UserParameters)扩展采集范围。
- Agent 收集主机性能指标(如通过
数据传输
- 被动模式:Server 轮询 Agent(默认 10050/TCP 端口)。
- 主动模式:Agent 主动发送数据到 Server/Proxy(端口 10051)。
Server 数据处理
- 数据校验 → 触发器规则匹配 → 触发告警 → 存储到数据库。
数据存储与展示
- 数据库持久化存储 → 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-server | 192.168.148.105 | 2C4G | 20G | openEuler-24.03(LTS) | LNMP、zabbix_server、zabbix-agent2 |
| zabbix-agent | 192.168.148.106 | 1C2G | 20G | openEuler-24.03(LTS) | zabbix-agent2 |
Zabbix Server部署
安装Nginx
安装服务
dnf -y install nginx
# 创建程序用户
useradd -s /sbin/nologin -M www
chown -R www:www /var/lib/nginxnginx.conf
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启动服务
systemctl enable nginx --now安装MySQL
dnf -y install mysql-devel libevent-devel pcre-devel
dnf -y install mysql-server
systemctl enable mysqld --now安装PHP
安装基础依赖
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依赖
# 卸载旧版
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依赖
# 下载源码包
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依赖
# 安装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
下载源码包
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编译安装
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配置
# 创软连接
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配置
# 复制模板文件
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
php-fpm系统服务文件
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程序用户
useradd -Ms /sbin/nologin zabbix创建初始数据库和数据库用户
-- 创建数据库
create database zabbix character set utf8mb4 collate utf8mb4_bin;
-- 创建用户
create user zabbix@localhost identified by 'zabbix';
-- 为用户授权
grant all privileges on zabbix.* to zabbix@localhost;安装依赖包
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
# 下载源码包
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导入数据
# sql文件在zabbix-6.0.28/database/mysql/
mysql -B zabbix < schema.sql
mysql -B zabbix < images.sql
mysql -B zabbix < data.sql导入前端代码
# 代码在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,不用重启服务器或应用,刷新页面即可。
# 文件位置在zabbix-6.0.28/assets/fonts
cp DejaVuSans.ttf DejaVuSans.ttf.bak
# 比如华松中文字体
mv STZHONGS.TTF DejaVuSans.ttf
chown www:www DejaVuSans.ttf配置service管理文件
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
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
# 安装
dnf -y install zabbix-get
# 检查zabbix的联通性
zabbix_get -s 192.168.148.106 -k "agent.ping"
-s 指定客户端IP地址
执行结果是1,表示客户端配置正常部署zabbix agent
安装服务
# 设置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配置文件
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配置文件,最后一行追加
# 语法
# 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
- 监控项:选择
测试
# 在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
系统监控常用自定义监控项
内存相关
# 创建配置文件
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 相关的自定义项(未测试)
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 相关的自定义项
# 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相关的自定义项
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-server | 192.168.148.105 | java-gateway |
| zabbix-agent | 192.168.148.101 | JDK、tomcat、JMX |
zabbix-agent配置
提前装好JDK和Tomcat
配置 JMX
# 配置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
dnf install zabbix-java-gateway -y修改Zabbix Java gateway配置文件
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服务
systemctl enable --now zabbix-java-gateway
systemctl status zabbix-java-gateway
ss -antup | grep 10052配置zabbix server调用java gateway
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 状态
创建配置
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
systemctl restart zabbix-agent2
systemctl status zabbix-agent2验证
# 在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.jar和cmdline-jmxclient-0.10.3.jar两个包,根据在即tomcat版本下载,下载后放到tomcat的bin目录下。
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堆内存
# 指令查看
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
# 指令查看
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
# 指令查看
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
# 指令查看
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
# 指令查看
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
# 指令查看
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] # 内存池已用空间非堆内存
# 指令查看
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"] # 内存已用空间类加载
# 加载总数:
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线程
# 总开启线程
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线程
# 最大线程
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] # 繁忙线程网络流量
# 接收的字节
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请求
# 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出错请求解决问题
# 以上监控项找不到问题如:
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 MemoryPoolweb操作
添加主机
配置 —> 主机 —> 创建主机
- 主机名称:自定义
- 模板:
- 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 监控
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-agent2Zabbix 告警
管理 —> 报警媒介类型 —> 创建报警媒介类型
内置邮箱告警
获取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服务 —> 点击新增授权码
设置邮箱服务
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告警脚本
# 指定脚本路径
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/>条件:默认即可
测试
# 在agent客户端临时提升内存,以下是1C2G服务器测试用例
python3 -c "a = [bytearray(1024 * 1024) for _ in range(600)]; input('Press Enter to release...')"钉钉告警
钉钉配置
先到钉钉创建告警群然后添加机器人获取机器人Webhook地址
创建钉钉告警脚本
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
# 配置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
# 配置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
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
