ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zabbix 7.0 从零搭建监控系统:环境部署、主机纳管与钉钉告警实战

Zabbix 7.0 从零搭建监控系统:环境部署、主机纳管与钉钉告警实战 1. 项目概述1.1 这玩意到底是干嘛的Zabbix搞运维的人应该都听过。简单说它就是一个开源的分布式监控系统能帮你盯着服务器、网络设备、数据库、中间件等各种IT资源。CPU飙了、内存爆了、磁盘满了、服务挂了它都能第一时间发现并通过邮件、钉钉、企业微信等各种方式告诉你。这年头一个生产环境动辄几十上百台机器总不能每台都手动登录上去看吧我在实际运维中就吃过这种亏某天凌晨磁盘被日志打满第二天用户投诉才知道那种被动挨打的感觉实在难受。搭好Zabbix之后这事儿就变成了磁盘使用率超过85%钉钉消息5分钟内就到手机上连加班的夜都少了。这次要分享的是整套从零开始的搭建过程基于当前比较稳定成熟的技术组合Rocky Linux 9.8 Zabbix 7.0 LTS。7.0是Zabbix的长期支持版本功能上比之前的版本强了不少Web界面重做得很现代化原生支持了更多开箱即用的监控模板新增了业务服务树这种实用功能监控大屏也比老版本好看太多。这篇文章适合谁看刚接触Zabbix的运维新人、想从0搭一套测试环境练手的学习者、以及准备把Zabbix用到生产环境但还没正式动手的同仁。不管你是哪个角色跟着这篇文章走一遍一套能用的监控系统就能跑起来。先说下我的测试环境方便你对照参考操作系统Rocky Linux 9.8和RHEL 9系完全兼容CentOS替代方案里谁用谁知道Zabbix版本7.0 LTS数据库MySQL 8.0Zabbix官方推荐的就是MySQL/PostgreSQL我这边选了MySQL 8.0Web服务NginxApache其实也行但Nginx在性能上更轻快我习惯用Nginx被监控主机Windows/Linux各一台演示Agent 2模式监控我这里用的是Rocky Linux如果你是CentOS、RHEL、AlmaLinux这些RedHat系系统操作完全一样命令直接复制粘贴都没问题。1.2 为什么我推荐Zabbix 7.0先聊个大家都关心的问题监控工具有那么多Prometheus、Nagios、Cacti什么的为什么选ZabbixPrometheus这几年确实火尤其在Kubernetes容器监控领域几乎是事实标准。但它的设计偏向于拉取模式需要在每个目标端暴露metrics接口对传统服务器资源的深度监控比如CPU、内存、磁盘、网络设备的SNMP采集反而没有Zabbix那么顺手。Nagios配置太老派插件全靠手写脚本自适应和自动发现能力弱界面也像上个时代的产物。Zabbix的优势在于自动发现机制成熟新加主机不需要手工一条条加监控项内置模板丰富Linux、Windows、MySQL、Nginx、Redis这些常见场景都有官方现成模板告警通知渠道多样邮件、钉钉、企业微信、Webhook都支持分布式架构支持机器多了可以直接上Proxy分担压力关键的是7.0版本Web界面做了全新改版功能不变但好看了不止一个档次所以综合下来Zabbix在同类型监控工具里依然是很能打的选择特别适合传统IT基础设施监控场景。7.0相比6.0更新了几个很实用的功能我挑重点说加密监控项Encrypted metrics支持对敏感监控数据进行加密传输安全性提升不少改进的VMware监控虚拟机发现和监控项采集效率大幅提升原生Webhook强化钉钉、飞书、Slack的告警集成更简单了业务服务树Business Services可以定义服务间的依赖关系故障影响范围一目了然更好看的大屏预置了几个仪表盘模板开箱即用这些改进让7.0成为Zabbix历史上最值得升级的版本之一这也是我这次专门写7.0搭建教程的原因。2. 环境准备与服务安装2.1 服务器与系统配置先准备一台干净的系统。生产环境建议至少2核4GB内存起步如果监控的机器数量比较多比如超过50台建议4核8GB以上。我自己测试用的是4核8GB跑起来很轻松。系统安装就不多说了Rocky Linux 9.8从官网下载ISO装好就行。安装时记得选Server with GUI或者Minimal Install都无所谓反正咱们后面全用命令行操作。有一点要特别注意SELinux建议先设为disabled或者设为permissive否则后面Nginx和PHP各种权限问题能折磨死人。安装完系统后先做基本更新和配置# 更新系统软件包 dnf update -y # 设置主机名 hostnamectl set-hostname zabbix-server # 配置时间同步Zabbix对时间精度要求高时间不准会导致监控数据异常 dnf install -y chrony systemctl enable --now chronyd # 关闭SELinux sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config提示SELinux修改后需要重启系统才能生效。如果你不想重启可以用setenforce 0临时关闭但下次重启还是要确认配置文件改对了没有。我通常在安装阶段直接改配置文件然后重启一次一劳永逸。时间同步这块很多人不注意但非常重要。Zabbix Server和Agent之间时间偏差过大会导致监控数据采集异常、告警误报甚至历史数据丢失。chrony配置好之后用timedatectl确认时间状态是synchronized这是最省心的做法。2.2 安装Zabbix 7.0仓库Zabbix官方针对不同系统提供了对应的软件仓库直接用官方源安装是最稳的不要图省事用系统自带的源里那种老版本。官方源的配置方式如下# 安装Zabbix官方仓库对应Rocky Linux 9 / RHEL 9 rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm # 清空缓存并重新生成 dnf clean all dnf makecache装完仓库后可以确认一下源是否生效dnf repolist | grep zabbix正常情况下应该能看到zabbix相关的repo出现在列表里。这一步出现问题的概率很低如果确实拉不下来检查一下网络或者用国内镜像源替换repo文件里的URL也很简单。用官方源最大的好处是版本一致性有保障zabbix-server、zabbix-agent、zabbix-web这些组件版本完全对齐不会出现某些组件版本不一致导致的兼容性问题。2.3 安装MySQL 8.0并初始化Zabbix Server需要一个数据库来存配置、历史数据、告警记录这些。Rocky Linux 9自带的仓库里就有MySQL 8.0直接安装就行。dnf install -y mysql-server systemctl enable --now mysqldMySQL装完后要做基本的安全加固和初始化。Zabbix官方其实提供了一个初始化数据库的脚本但在执行之前我们要先手动建一个数据库账号。我用MySQL的习惯是先建一个专用账号权限最小化mysql -uroot -p进入MySQL命令行后执行-- 创建Zabbix专用数据库 CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; -- 创建Zabbix专用账号实际生产请换成强密码 CREATE USER zabbixlocalhost IDENTIFIED BY YourStrongPassword; -- 授权Zabbix账号访问zabbix库 GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; -- 刷新权限 FLUSH PRIVILEGES;注意这里字符集一定要用utf8mb4Zabbix 7.0官方明确要求。如果用了utf8或者latin1后面导入数据或者存储监控项名称时遇到中文字符或特殊字符就可能报错或者乱码。我最早搭5.0的时候贪省事用了utf8后来监控项名称里加中文备注直接乱码倒腾了很久才改过来这个坑不值得踩。还有一个细节MySQL 8.0的默认认证插件是caching_sha2_passwordZabbix 7.0的PHP连接器是支持这个认证方式的。如果你用的是老版本Zabbix比如5.0以前可能还需要改成mysql_native_password但7.0没有这个烦恼。2.4 安装Zabbix Server与前端组件接下来正式安装Zabbix Server、前端、Agent。这里我选择Nginx作为Web服务器方案。Zabbix官方在RHEL系仓库里为7.0提供了两个前端包zabbix-web-nginx和zabbix-web-apache二选一即可。我推荐Nginx性能更好配置也更熟悉。# 安装Zabbix Server、Nginx前端、Agent dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent2这里我把zabbix-agent2也一起装上了。Agent 2是Zabbix的新一代AgentGo语言写的性能更好扩展更方便还内置了很多Plugins。在Server这台机器上也装一个Agent作用是监控Zabbix Server自身这样你就能在Zabbix的监控面板里看到这台服务器的运行状态了。安装完成后需要做两件重要的事导入初始数据库和配置Server连接数据库。先导入Zabbix官方提供的初始化数据库脚本# 解压数据库脚本zabbix-server装好后会自带 zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-setutf8mb4 -uzabbix -p zabbix这一步会创建Zabbix系统运行所需的全部数据表和数据脚本比较大导入可能需要一两分钟。执行过程中如果卡住不动别急着CtrlC耐心等一下。导入完成后可以用下面的命令确认数据表是否创建成功mysql -uzabbix -p -e USE zabbix; SHOW TABLES; | wc -l正常情况下会输出200多张表看到这个数字就说明导入成功了。然后修改Zabbix Server配置文件告诉它数据库的地址、账号和密码vim /etc/zabbix/zabbix_server.conf需要修改的内容DBHostlocalhost DBNamezabbix DBUserzabbix DBPasswordYourStrongPassword经验分享如果数据库和Zabbix Server不在同一台机器生产环境常见做法DBHost要填数据库服务器的IP同时数据库账号需要授权为远程访问权限并且确认数据库服务的3306端口对Zabbix Server开放。另外千万别忘了检查防火墙和MySQL的bind-address配置这两处是远程连接失败的常见原因。配置完成后启动服务systemctl restart zabbix-server systemctl enable zabbix-server systemctl status zabbix-server看到active (running)就是正常了。如果起不来查看日志排查tail -f /var/log/zabbix/zabbix_server.log2.5 配置Nginx与PHP前端Zabbix的Web前端跑在PHP上需要在Nginx里配置好对应的虚拟主机并启用到PHP的连接。Zabbix的nginx-conf包安装后会生成一个示例配置文件位置在/etc/nginx/conf.d/zabbix.conf内容大体如下server { listen 80; server_name zabbix.example.com; root /usr/share/zabbix; index index.php; location / { try_files $uri $uri/ 404; } location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }这里需要根据实际环境改一下server_name如果你暂时没有域名直接用IP访问也行server_name填IP或者改成_都可以。PHP方面的参数Zabbix前端对PHP有几个硬性要求通常在/etc/php-fpm.d/zabbix.conf或/etc/php.ini里配置。Zabbix官方仓库的包会自动装好大部分但有几个关键参数还是值得确认一下max_execution_time 300max_input_time 300post_max_size 16Mdate.timezone需要设置成你的时区确认无误后启动Nginx和PHP-FPMsystemctl restart nginx systemctl restart php-fpm systemctl enable nginx php-fpm到这一步Zabbix Server的安装配置就全部完成了。浏览器里访问http://你的IP就能看到Zabbix的初始化安装向导界面。3. Web界面配置与基础调优3.1 前端初始化向导用浏览器打开Zabbix地址后会进入一个安装向导流程。第一次配置的时候你会看到一系列页面下面我按顺序逐个走过每一步都直接给出结论性的建议帮你这几步顺利走完第一步就是语言选择这里我建议选英语或者选中文也完全可以Zabbix 7.0的中文语言包很成熟基本不会出现缺翻译的情况。考虑到绝大多数人可能更习惯看中文界面选简体中文即可。之后点Next step进去。第二步是检查前置条件。这一步很关键Zabbix会把PHP环境、权限等前置要求的检查结果列成一个清单缺什么它会标红提示你。正常情况下如果都通过了直接点下一步。如果存在标红的项一定要先解决再继续否则后面会出现各种诡异问题。最常见的缺失项是PHP的某个扩展没装比如php-gd、php-mbstring、php-bcmath通过dnf装对应扩展然后重启php-fpm就行。第三步是配置数据库连接。数据库类型选MySQL主机填localhost或占位用的IP端口填3306名称填zabbix用户填zabbix密码填之前设的密码。填完之后点击下一步Zabbix会自动测试连接。第四步是设置Zabbix服务器的一些基本信息包括主机名、监听端口、时区。主机名可以设置一个有意义的名字时区选择Asia/Shanghai。第五步是确认信息汇总并完成安装。点击完成按钮后Zabbix前端会自动写入配置文件。一切顺利的话页面会显示Congratulations之类安装成功的提示。这里顺便提一句很多初学者在前端初始化时遇到“Unable to connect to database”的报错90%的原因是DBName、DBUser、DBPassword这三项填错了或者MySQL没开远程访问权限仔细检查一下基本能解决。安装完成后就可以用默认账号登录了用户名Admin密码zabbix登录进去后第一件事务必修改管理员密码。这个默认密码是公开的生产环境不换等于裸奔。路径是Users → Admin → Change passwor。3.2 PHP时区与字符集的小坑刚才说到前置检查里面有两项经常报问题时区和字符集。如果在初始化时区那一步没有正确设置Zabbix前端页面可能会显示一些奇怪的时间偏移告警时间也对不上。修改方式是这样的vim /etc/php.ini找到date.timezone改成date.timezone Asia/Shanghai字符集方面PHP默认的字符集非UTF-8会导致Zabbix前端在显示中文时出现乱码。在php.ini里也需要确认default_charset UTF-8改完之后记得重启PHP-FPMsystemctl restart php-fpm注意修改php.ini前先备份一份是个好习惯用cp /etc/php.ini /etc/php.ini.bak留个底改坏了还能快速还原。3.3 初始化完成后建议做的几个优化登录进Zabbix Web界面之后有几项基础配置建议写上这些都是生产环境中很实用、也是经验里积累下来的日常经验修改时区与语言用户设置页面语言选中文zh_CN时区选(UTC08:00) Asia/Shanghai。这个设置在User Settings里能改但默认是跟随浏览器支持的语言如果系统是英文环境可能还是会显示英文最好手动指定一下。关闭“界面自动登录”风险项这点虽然不一定所有人都觉得重要但建议留意一下在Administration → Users → Admin users里看一下当前用户的权限和认证方式。Zabbix默认允许前端通过HTTP Basic认证如果你不需要建议把认证方式改成Zabbix内部认证并且妥善保管Admin密码。启用服务端主动监控默认情况下Zabbix Server是被动模式由Server主动去连接各Agent拉取监控数据。对于外网环境或者Agent数量很多的情况更推荐开启Agent主动上报。关于这个我们后面会细讲先在这里留个印象。调整历史数据保留策略Zabbix默认会保留历史数据91天、趋势数据365天。如果监控的机器很多这个保留时间会导致数据库快速增长。我的建议是历史数据保留7-14天就够用了趋势数据保留365天趋势是每小时聚合一次数据量小很多可以留久一点。修改路径Administration → General → Housekeeping。配置定期备份Zabbix数据库里的配置信息主机、监控项、告警动作是核心资产而历史数据丢了其实影响有限。日常备份只需要备份数据库配置即可。配合crontab做每日自动备份是非常推荐的做法尤其是生产环境。我用的备份脚本很简单粗暴#!/bin/bash # 每日凌晨备份Zabbix数据库 mysqldump -uzabbix -pYourStrongPassword zabbix --ignore-tablezabbix.history --ignore-tablezabbix.history_uint --ignore-tablezabbix.history_str --ignore-tablezabbix.history_text --ignore-tablezabbix.history_log --ignore-tablezabbix.trends --ignore-tablezabbix.trends_uint /backup/zabbix_config_$(date %Y%m%d).sql注意命令里--ignore-table后面跟的历史表和趋势表是不需要备份的大表它们只是监控数据丢了不影响配置这样能大幅减小备份文件体积。历史久了这招能帮你省下几个G的备份空间。4. 添加被监控主机与监控项配置4.1 在Linux主机上安装Zabbix Agent 2被监控的Linux机器上需要安装Agent程序。以Rocky Linux 9.8系统为例和Server端一样先从官方仓库装起rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm dnf clean all dnf makecache dnf install -y zabbix-agent2装完之后改配置文件vim /etc/zabbix/zabbix_agent2.conf关键参数ServerZabbixServer的IP地址 ServerActiveZabbixServer的IP地址 Hostname这台机器的名字解释一下这三个参数的区别这是新手最容易迷糊的地方Server允许哪些Zabbix Server地址来主动连我Agent是被采集方多个地址用逗号分隔ServerActive我主动向哪个Zabbix Server上报数据这是主动模式的配置Hostname这台机器在Zabbix里显示的名字必须和Web界面添加主机时填的名字一致否则主动模式的数据上报会找不到对应主机改完后启动Agentsystemctl restart zabbix-agent2 systemctl enable zabbix-agent2如果Zabbix Server和Agent之间通了防火墙记得放行10050端口Agent被动模式监听的端口。主动模式的话是Agent连Server的10051端口这个注意看方向# Server到Agent方向的10050端口放行 firewall-cmd --permanent --add-port10050/tcp firewall-cmd --reload4.2 在Windows主机上安装Zabbix Agent 2Windows主机监控也是运维中的常见需求。Zabbix官方提供Windows版本的Agent 2程序从官网下载对应的MSI安装包双击安装即可。安装过程中有一个重要配置项就是需要填Zabbix Server的IP地址和主机名格式类似Server192.168.1.10和ActiveServer192.168.1.10。安装完成后服务会自动注册为Zabbix Agent 2并启动。安装完建议去服务管理器里确认一下服务状态如果启动失败大概率是配置文件里的Server地址填错了或者防火墙没有放行10050端口。Windows防火墙放行端口的方式netsh advfirewall firewall add rule nameZabbix Agent 2 dirin actionallow protocolTCP localport100504.3 在Zabbix Web界面添加主机Agent装好了接下来就要在Zabbix Server上把它纳管进来。登录Web界面走一遍添加主机的流程进入 Data collection → Hosts → Create host主机名称Host name填一个你容易识别的名字要和Agent配置文件里的Hostname一致模板Templates这一步很关键直接决定了Zabbix会自动给这台主机创建哪些监控项。Linux主机选Linux by Zabbix agent active或者Linux by Zabbix agentWindows主机选Windows by Zabbix agent。如果你自己装了nginx、mysql等应用也可以继续在模板里搜索Nginx by Zabbix agent之类的官方模板把模板加进去主机组Host groups选择或新建一个分组相当于给主机分类比如按业务线分、按地区分接口Interfaces添加Agent接口填被监控主机的IP和端口10050然后点击Add按钮保存稍等一两分钟回到 Hosts 界面如果主机状态变成了绿色可用性Availability显示ZBX绿色图标说明已经成功建立连接了。4.4 常用监控项配置示例添加主机时如果关联了模板Zabbix会为这台主机自动创建一整套监控项包括CPU使用率、内存使用率、磁盘空间、网络流量、系统负载等三四十个监控项基本不需要自己手动去配这也就是为什么我反复强调模板很重要的原因。不过模板毕竟覆盖不了所有需求加一些自定义监控项是经常会遇到的实际情况。举个实际例子监控一个进程是否存活。进入 Data collection → Hosts → 找到目标主机 → Items → Create item然后按下面的方式填入字段名称Process check - nginx类型Zabbix agent (active) 或 Zabbix agent被动键值proc.num[nginx]这是Zabbix内置的proc.num监控项统计进程数量信息类型Numeric (unsigned)更新间隔30s这样添加一个监控项每隔30秒就会采集一次nginx进程数量。如果配合触发器设置proc.num[nginx]1就告警那么在nginx挂掉的时候告警就生效了。再举个例子监控某台服务器上的MySQL服务是否在监听3306端口。监控项键值用net.tcp.port[3306]返回1表示端口通0表示不通。配合触发器返回值为0就报警。4.5 监控项与数据可视化监控项采集到的数据在Monitoring → Latest data里可以查看最近的数据。但光看表格不够直观Zabbix 7.0的仪表盘支持自定义创建图表、仪表盘、大屏。进入 Dashboards → All dashboards → Create dashboard然后添加Widget比如Graph图、Item value监控项数值、Problem hosts有问题的机器等拖拽几下就能拼出一个很直观的监控大屏。我一般习惯在仪表盘上放这几个核心WidgetCPU和内存使用率趋势图最近1小时、24小时磁盘IO和网络流量图各主机可用性总览最近的问题事件列表这样每天早上扫一眼大屏整个环境的健康状态一目了然比逐个看告警邮件省事多了。5. 告警通知配置联动钉钉群机器人5.1 为什么推荐用钉钉做告警渠道监控系统不通知等于白搭告警通知渠道的选择直接影响故障响应速度。邮件是最传统的告警方式但存在明显的缺点垃圾邮件太多重要告警容易被淹没手机邮件客户端如果不是24小时在线告警到达的及时性就没保障。而钉钉/企业微信这类IM工具是目前国内运维场景用得最多的告警渠道因为大家随时随地都要看手机消息消息到达率高而且可以通过群里人解决“告警没人看”的问题。这篇文章重点讲钉钉告警联动因为Zabbix 7.0对钉钉的支持更完善了配置起来比6.0之前简单得多。5.2 创建一个钉钉群机器人第一步创建一个钉钉群或者使用已有的群然后进入群设置 → 智能群助手 → 添加机器人 → 自定义机器人。按提示给机器人起个名字比如“Zabbix告警”安全设置这里有很多种验证方式推荐选“加签”方式。你会得到两个关键信息Webhook地址和加签密钥。这两个信息务必保存好后面配置要用。注意创建钉钉自定义机器人时安全设置如果不选任何方式机器人就完全裸奔任何知道Webhook地址的人都能往群里发消息会被轰炸甚至传虚假告警。所以务必至少开启加签或IP白名单。我个人推荐加签因为它能确保消息只有持有密钥的人能发配置也很简单。5.3 Zabbix 7.0里配置Webhook对接钉钉Zabbix 7.0的告警媒介里已经内置了Webhook类型并且有专人维护的第三方告警集成方案。官方在Media types里预置了DingTalk这个方案吗实际上在较新版本中Zabbix 7.0内置了多个Webhook集成模板包括DingTalk的相关整合。如果没有内置也不用担心通过提供的标准Webhook方式也可以很轻松地配置起来下面两种方式我都介绍一下。先说内置的模板方式进入 Administration → Media types搜索或直接新建一个Webhook类型把钉钉机器人的Webhook URL填入对应的参数中。具体到7.0版本在Media types列表中如果能看到DingTalk那就简单了点进去把Webhook URL和加签密钥填到对应字段然后在Message templates里可以自定义告警消息标题和内容。Zabbix支持{ALERT.SUBJECT}、{ALERT.MESSAGE}这些宏变量可以用来动态地填充告警的主机名、监控项名称、触发值等。如果没有内置第二种方式是自定义Webhook脚本这也是老版本Zabbix钉钉告警的经典方案在Media types里新建一个类型选Webhook在Script里粘贴下面这段基于Python脚本方式实现的通用版我实测可用的#!/usr/bin/env python3 import requests import sys import json import time import hmac import hashlib import base64 import urllib.parse webhook sys.argv[1] subject sys.argv[2] message sys.argv[3] # 钉钉加签 secret 你的加签密钥 timestamp str(round(time.time() * 1000)) secret_enc secret.encode(utf-8) string_to_sign {}\n{}.format(timestamp, secret) string_to_sign_enc string_to_sign.encode(utf-8) hmac_code hmac.new(secret_enc, string_to_sign_enc, digestmodhashlib.sha256).digest() sign urllib.parse.quote_plus(base64.b64encode(hmac_code)) url webhook timestamp timestamp sign sign headers {Content-Type: application/json} data { msgtype: markdown, markdown: { title: subject, text: ## subject \n\n message } } r requests.post(url, headersheaders, jsondata) print(r.text)这段脚本接收三个参数Webhook地址、告警主题、告警内容。把钉钉机器人Webhook和加签密钥填进去测试的时候直接命令行执行就能验证。5.4 配置用户媒介和告警动作媒介建好后还需要两步才能真正用起来。第一步把媒介关联到用户。路径Users → 选择要接收告警的用户比如Admin→ Media → Add。在弹窗里选择刚才创建的DingTalk类型填上收件人的信息对于钉钉只要填个随便什么比如群机器人的名称就行告警级别勾选上保存。第二步创建告警动作。路径Alerts → Actions → Create action。这里就是设置什么情况下触发告警的核心逻辑。基本配置是这样的名称比如“钉钉告警”触发条件Conditions可以设置告警级别大于等于Warning时触发也可以设置所有问题都触发操作Operations在Message模板里写具体的告警内容然后“Send to users”选择Admin通过DingTalk媒介发送告警内容模板我常用的写法是主机{HOST.NAME} IP地址{HOST.IP} 监控项{ITEM.NAME} 当前值{ITEM.LASTVALUE} 触发时间{EVENT.DATE} {EVENT.TIME} 当前状态{TRIGGER.STATUS}这样钉钉群里收到的告警消息就是一条包含主机信息和故障原因的格式化消息不用打开Zabbix界面就能快速判断问题。配置好之后别忘了测试。随便找一个监控项把阈值设置得非常容易触发比如磁盘使用率超过1%就告警过一两分钟应该就能在钉钉群里收到告警消息。收到消息说明整条链路已经打通了。5.5 告警升级与恢复通知告警通知相比更让人觉得成熟的是告警升级和恢复通知。Zabbix 7.0支持在一个Action里配置多个Operations实现分级告警。我习惯的做法是第一个Operation故障发生立即通知钉钉群消息第二个Operation故障超过30分钟再次通知钉钉到具体负责人第三个Operation故障超过60分钟升级到管理者重复通知更高优先级表述同时在Action里启用“Recovery operations”这样故障恢复时群内也会收到一条“XX已恢复”的消息形成完整的告警闭环。6. 常见故障排查与避坑指南6.1 access denied for user replace_userlocalhost 报错这个报错在Zabbix安装过程中出现频率极高热搜词里也提到了它。它翻译过来的意思就是数据库拒绝了用户replace_userlocalhost的访问。出现这个报错基本都是以下三种原因之一原因一数据库账号未创建或密码错误。很常见的一种情况就是新手复制某个教程的配置照着把配置文件里的DBUser和DBPassword写成了replace_user和replace_password实际上这只是别人教程里的占位符。解决方法是把/etc/zabbix/zabbix_server.conf里的DBUser改成实际创建的zabbix账号DBPassword改成对应的密码。原因二MySQL 8.0认证插件不兼容。刚才提到过但这里再强调一次。如果你的Zabbix是7.0之前的老版本PHP连接MySQL 8.0时可能因为caching_sha2_password认证插件导致连接失败。解决办法是给Zabbix账号指定用mysql_native_passwordALTER USER zabbixlocalhost IDENTIFIED WITH mysql_native_password BY YourStrongPassword; FLUSH PRIVILEGES;原因三MySQL服务没起来或者端口不通。检查MySQL服务的运行状态systemctl status mysqld ss -lntp | grep 3306如果3306端口没监听说明MySQL没启动启动它就行。这个排查思路适用于所有类似报错不只是replace_user看到数据库连接失败先按这个顺序查MySQL服务状态 → 账号密码是否正确 → 认证插件 → 端口连通性。6.2 Zabbix Agent 显示不可用的原因添加主机后Availability字段显示红色ZBX说明Zabbix Server连不上Agent。常见原因有以下几种Agent服务没启动去被监控机器上看systemctl status zabbix-agent2是否在运行防火墙拦了10050端口这是最常见的。在Agent所在机器上执行firewall-cmd --list-all看端口是否放行Agent配置文件Server项的IP填错了注意Server参数填的是Zabbix Server的IP不要填被监控机器自己的IP网络不通在Zabbix Server上执行telnet 被监控IP 10050测试连通性排查的时候按顺序来从网络层到应用层一步一步缩小范围比瞎猜快得多。6.3 告警没发到钉钉群里的排查路径告警配置完成后最怕的就是“告警没动静”。遇到这种情况我一般按这个顺序查确认Zabbix里有没有生成告警事件。进入Monitoring → Problems看有没有当前未恢复的问题。如果这里都是空的说明触发器或者监控项的问题还没到告警通知那一步确认用户媒介是否关联成功。Users → Admin → Media看DingTalk媒介是否在列表里确认Action是否启用。Alerts → Actions确认该Action的Status是Enabled去Reports → Action log里看有没有发送记录。如果这里显示发送失败会给出具体的错误信息比如HTTP 401表示加签密钥错误HTTP 400表示消息格式有问题确认Webhook地址和密钥是否正确。可以手动在命令行执行Webhook脚本如果能手动发送成功问题就出在Zabbix侧如果手动发送也失败那就是Webhook配置错了这套排查思路基本上能覆盖绝大部分“告警没动静”的场景。6.4 数据库体积膨胀的处理方法Zabbix跑久了MySQL的体积会越来越大特别是history和trends表几台机器跑几个月就有几个GB。如果不加管理磁盘被数据库撑爆是迟早的事。常规做法有这几个方法一调低数据保留周期。在 Administration → General → Housekeeping 里把历史数据保留期从默认的91天改到7-14天趋势数据保留期可以保留365天。保存后会在数据库层面自动清理过期数据。方法二启用分区表。Zabbix 7.0的原生功能支持了数据库表分区在Zabbix Server的配置文件里设置HistoryStorageTypesuint,dbl,str,log,text HistoryStorageURL... HistoryStoragePipe...当然这是很复杂的配置了大部分场景用不到。对于中小规模环境直接用默认存储配合合理的保留周期就足够了。方法三定期手工清理大表。不推荐在生产环境直接DELETE删除history表数据锁表时间长影响正常采集。建议用DROP或TRUNCATE的方式重建表不过要备份好已有的需要保留的数据。一个简单实用的建议是历史数据保留2周是性价比最高的方案。保留太长数据库压力大会拖慢Zabbix性能保留太短排查问题时又找不到历史数据。2周时间足够你发现和定位绝大多数问题的。7. 从测试到生产的最后几步7.1 配置Server端性能参数Zabbix Server默认的配置参数对中大规模的监控场景来说偏低。如果监控的主机数量比较多超过100台建议在/etc/zabbix/zabbix_server.conf里调整以下参数StartPollers10 StartPollersUnreachable2 StartTrappers5 StartDiscoverers5 CacheSize256M HistoryCacheSize64M TrendCacheSize64M ValueCacheSize64M这些参数分别控制并发采集线程数、缓存内存大小。数值具体设多少取决于你的机器规格和监控规模。机器配置越高、监控数量越多可以适当调大。改完配置后记得重启zabbix-server服务。CacheSize不够的话Zabbix Server日志里会频繁输出History cache is full或者Value cache is full的警告一旦看到这种日志第一优先就是调大对应CacheSize。7.2 配置Zabbix Proxy应对大规模监控如果你的监控规模上了几百台或者被监控主机分布在不同机房、跨多个网段单靠一个Zabbix Server直连所有Agent性能会成为瓶颈。这时就需要引入Zabbix Proxy。Zabbix Proxy是一个介于Server和Agent之间的中间层它代替Server去采集数据然后异步地把数据回传给Server。好处是减轻Server压力Server只需要处理Proxy上报的数据解决跨网段连通性问题Proxy部署在远端机房Agent只需能和Proxy通信Server和Proxy之间即使短暂断网Proxy也能本地缓存数据网络恢复后再补传Proxy的部署方式不复杂装一个zabbix-proxy-mysql包配置好数据库和Server地址然后Web界面在 Data collection → Proxies 里添加Proxy主机。之后添加Agent主机时在Agent的配置里指向Proxy即可。对于从0到1搭建Zabbix的读者这个阶段先把核心Server的搭建和使用跑通是在不断的实践中逐步进阶的。7.3 监控模板与自动发现的高阶用法Zabbix的自动发现功能用得好能大幅降低重复劳动。举例来说你有一批Linux服务器它们上面装了各种不同的服务有的是Nginx有的是MySQL有的是Redis。如果手动给每台机器添加对应的监控模板操作量大且容易漏。Zabbix的低级别自动发现LLD机制配合Agent 2自带的插件可以自动发现被监控主机上运行的服务并自动创建对应的监控项。比如在Linux模板里启用Mounted filesystem discovery它会自动发现系统上所有已挂载的文件系统并为每个文件系统创建磁盘空间监控项。这样你加一台新主机磁盘的监控完全不需要手工操作系统自动就配好了。这属于持续实操中必定会遇到的进阶用法这里先点到为止。7.4 日常使用小技巧最后分享几个日常运维Zabbix时非常实用的小技巧。技巧一批量添加主机。如果一批机器的配置完全相同可以使用Host page的批量操作功能勾选需要添加的主机一次性添加模板和主机组省去重复填写的时间。技巧二维护模式的使用。系统发布、升级、维护时如果不希望Zabbix产生大量告警可以在 Maintenance 里创建一个维护窗口选择需要维护的主机设置开始和结束时间。在维护窗口内这些主机的所有触发器都不会告警避免维护期间被告警刷屏。技巧三模板的版本管理。Zabbix的模板本质上是XML文件可以通过 Configuration → Templates → Export 导出然后把导出的文件放进Git仓库管理。这样模板改动了什么、回滚到哪个版本都一清二楚。在多人协作的运维团队里这是一个很容易被忽略但非常重要的好习惯。技巧四善用外接脚本扩展监控项。Zabbix的监控项不止内置的那些如果你需要监控自定义的指标比如业务接口的响应时间、某个队列的长度、订单量等可以在Agent 2的配置文件里启用UserParameter指向一个自定义脚本。具体格式是UserParametercustom.business.check,/usr/local/bin/my_check.sh然后在Zabbix的监控项键值里填custom.business.check就可以采集脚本输出的值了。这种东西在对接业务指标的时候特别实用让Zabbix从单纯的基础监控工具变成了业务监控平台。写在最后从最开始准备系统环境到装好Zabbix Server、MySQL、Nginx到Web界面初始化再到给Linux和Windows主机安装Agent并纳管添加监控项最后配置钉钉告警打通整个告警链路这一整套流程走下来一套能实际使用的监控系统就完整跑起来了。整个过程中最容易踩坑的几个地方我再帮你圈一下重点SELinux和防火墙要提前排查一遍别等连不上Agent再去猜Zabbix Server配置文件里的数据库账号别照抄教程里的占位符dbpassword这种低级错误真的会出现在你身上钉钉机器人务必配置加签防止告警群被陌生人刷消息历史数据的保存策略要在部署时就规划好否则几个月后数据库体积会让你怀疑人生。如果按这篇文章走完还是有不顺利的地方重点关注一下zabbix_server.log和agent的日志Zabbix的日志体系很完善90%的问题在日志里都有明确的报错信息。祝你的监控系统一切正常最好永远收不到告警。
返回列表