把Zabbix部署这件事写成"保姆间教程",是因为这几年帮团队落地监控系统,真正卡住人的往往不是Zabbix本身,而是环境准备和几个高频报错。如果你正打算用Zabbix搭一套能同时盯着服务器、数据库、交换机的中小型监控体系,按这篇的路径走一遍就够了:环境准备、服务端安装、Web前端汉化、添加第一台Linux主机,再到最让人头疼的"zabbix server is not running"和权限报错排查,一条线讲完。
我习惯先把丑话说在前面:Zabbix不是最简单的监控系统,但它是开源监控里覆盖面和成熟度最均衡的一个。它自带阈值告警、可视化图表、权限体系和一套完整的管理后台,不像Prometheus那样需要从头拼一堆组件。对于以Linux服务器、Windows机器、网络设备为主的传统IT环境,Zabbix开箱即用,社区资料也足够撑起日常排障。这篇教程面向的是从零开始的人,所以每一步我都会解释"为什么要这样操作",而不是把命令堆完就完事。
1. 部署前必须想清楚的几件事:架构角色、版本选型与部署方式
1.1 先确认Zabbix适合你的场景
很多初学者容易把Zabbix和Grafana、Prometheus混在一起。简单区分一下:Zabbix是一个完整的监控系统,它自己负责采集数据、存储数据、触发告警、展示图表;Prometheus只是监控生态里的采集与存储组件,告警要靠Alertmanager,展示要靠Grafana,链路更长。Zabbix的优势在于传统IT基础设施监控:Linux、Windows、VMware、交换机和各种数据库中间件,模板库非常庞大,装上就能用。
如果你要监控的场景以容器和Kubernetes为核心,Prometheus那一套确实更顺手;但如果你要管的是几十台到几百台传统服务器和网络设备,Zabbix的投入产出比是最高的。这也是为什么很多企业内部从Zabbix起步,几年后也没有换掉它的原因——它一直在迭代,6.0、7.0版本对性能和数据存储做了大量优化,已经完全不是早年那个卡顿的Zabbix了。这篇保姆间教程就以最常见的场景为例:一台全新的Linux服务器,装上Zabbix Server,再把另一台Linux主机接入监控目标。
1.2 版本与数据库选型,别等装完再后悔
版本这块是第一个容易踩坑的地方。目前主流是6.0 LTS和7.0 LTS,5.0 LTS已经进入维护末期,不建议新项目使用。新部署我推荐直接上7.0 LTS,它对历史数据存储做了重构,在大数据量场景下性能比6.0强不少,而且官方对7.0的技术支持周期很长,不用刚装完就考虑迁移。
数据库选择上,Zabbix支持MySQL、MariaDB和PostgreSQL。7.0版本建议MySQL 8.0或更新版本,字符集必须用utf8mb4,排序规则建议utf8mb4_bin,否则后面导入官方Schema的时候很容易报错。不推荐在这步贪图省事用系统自带的旧版MariaDB,除非你已经很了解它的兼容性边界。Zabbix本身的数据写入模式是高频批量写入,数据库的innodb_buffer_pool_size和磁盘IO对整体性能影响非常大,这台数据库服务器尽量别和业务数据库混用。
1.3 部署方式对比:包安装、源码还是Docker
部署方式我直接给结论:生产环境用官方RPM/DEB包安装,测试环境用Docker,源码编译只适合有特殊需求的场景。理由很简单——包安装走systemd管理,升级和回滚都方便,日志、配置目录、权限都会帮你放好;源码编译虽然能自定义路径,但每次升级都要重新编译,维护成本完全划不来。
有人会问Docker部署不是更快吗?确实快,但Zabbix的Docker方案会把Server、数据库、前端拆成多个容器,数据持久化和版本升级的复杂度更高,对于没有容器化经验的团队反而容易产生新的坑。尤其生产环境,我见过太多"docker run一遍装好,三个月后数据全没了"的案例。这篇教程就以Rocky Linux 9为例做RPM包安装,其他RHEL系发行版操作基本一致,Ubuntu/Debian的差异我会在相应位置标注出来。
2. 从空服务器到数据库就绪:每个依赖和参数都标清楚了
2.1 操作系统选择与基础环境调整
系统版本方面,Zabbix 7.0官方支持Rocky Linux 9、AlmaLinux 9、Ubuntu 22.04这种较新的发行版。如果你手头还是CentOS 7,我建议要么把系统升级到Rocky/AlmaLinux 9,要么装Zabbix 6.0 LTS,因为7.0在CentOS 7上会有一堆PHP依赖冲突,解决起来非常折磨人。国内很多老旧生产环境还在CentOS 7上,这种情况我一般直接劝退装7.0的想法,6.0在CentOS 7上还能跑,但也要注意PHP版本必须大于等于7.2。
拿到一台新机器后,先更新系统和设置主机名:
dnf update -y hostnamectl set-hostname zabbix-server exec bash主机名会直接影响Zabbix Server自身监控里的显示名称,建议在一开始就设置成有意义的名称,比如zabbix-server、监控服务器,不要用默认的localhost。这一步虽然不影响功能,但后面配置告警通知时,邮件和钉钉消息里显示的主机名如果是一堆随机字符,会让人看得头皮发麻。
2.2 时间同步、防火墙与SELinux细节
时间同步是Zabbix部署里最容易被忽略、但问题最多的一环。Zabbix的Agent到Server之间、主动模式和被动模式的心跳判断,都依赖时间一致性。如果Server和Agent的系统时间差了哪怕30秒,就会出现数据采集不到、图表显示异常、告警误触发等一堆莫名其妙的问题。
dnf install -y chrony systemctl enable --now chronyd timedatectl set-timezone Asia/Shanghai chronyc sources -v如果是在内网环境,建议直接把chrony配置里的默认NTP服务器换成内网可用的NTP源,或者保持默认的公网源也要确保能通外网。这一步没有做好,后面无论怎么排查"Zabbix server is not running"都查不出问题,因为根本原因在时间上。这一点是无数人踩过的坑,我也踩过,后来养成了习惯:任何监控系统的部署文档,第一步永远是时间同步。
防火墙和SELinux的处理原则是:内网测试环境可以直接关掉,生产环境必须放行端口而不是关闭防火墙。需要放行的端口有:Web前端用的80或443,Zabbix Server接收Agent数据用的10051,Agent监听用的10050。如果主机之间还有额外防火墙设备,同样要放行。
systemctl stop firewalld systemctl disable firewalld # 或者生产环境只放行必要端口: # firewall-cmd --permanent --add-port=80/tcp --add-port=10050/tcp --add-port=10051/tcp # firewall-cmd --permanent --add-service=http # firewall-cmd --reload setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/configSELinux这块我多说一句:如果你不想关闭SELinux,就必须给Zabbix相关的服务手动添加策略模块,过程比较繁琐。对于大多数企业内部网络环境来说,关闭SELinux是常见选择,但如果你所在企业对安全基线有严格要求,还是建议查一下官方文档里SELinux相关的配置说明,不要直接一刀切。
2.3 数据库安装与初始化参数
数据库是Zabbix的存储底座,安装和初始化直接影响后续能否正常导入Schema。这里以MySQL 8.0为例:
dnf install -y mysql-server systemctl enable --now mysqldMySQL 8.0在RHEL系上需要先配置官方仓库,或者用系统自带的mysql模块。密码策略默认是强密码策略,测试环境可以调整,生产环境建议保持默认复杂度。登录MySQL后创建Zabbix专用数据库和用户:
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'YourStrongPassword'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; FLUSH PRIVILEGES;这里有两个关键点:第一,字符集必须utf8mb4,排序规则必须utf8mb4_bin,这个组合是官方要求,如果用了默认的utf8mb4_general_ci,后面导入Schema或者查看中文数据时可能出问题。第二,数据库用户名我建议直接用zabbix,不要图个性用别的名字,因为后面Zabbix Server的配置文件里默认值是zabbix,保持一致能少踩一个坑。
MySQL的参数优化里,最重要的是innodb_buffer_pool_size。如果给Zabbix独立部署的服务器内存有8GB,可以把这项设置为4GB左右;4GB内存的机器就设置2GB。另外max_allowed_packet建议设置为64M以上,避免采集到的某些大报文写入失败。这些配置在/etc/my.cnf.d/目录下加一个配置文件即可:
[mysqld] innodb_buffer_pool_size = 2G max_allowed_packet = 64M log_bin = ON binlog_format = rowbinlog这里建议开启但不要保留太长时间,一般保留1到2天就够了,因为Zabbix的数据本身刷新频率很高,长期保留binlog会很占磁盘空间。如果机器磁盘小于100GB,建议直接关闭binlog或者用专门的备份策略替代,否则很可能撑满磁盘。
3. 服务端安装与初始化:原本最耗时的环节这样能一次过
3.1 安装Zabbix仓库与Server/Web/Agent组件
Zabbix的安装包通过官方仓库下发,第一步是装仓库:
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el9.noarch.rpm dnf clean all dnf makecache如果服务器访问外网速度慢,可以把仓库地址换成国内镜像源。方法很简单,把/etc/yum.repos.d/zabbix.repo里的baseurl修改为镜像站地址,比如清华源或阿里源。这里我提醒一下:一定要在makecache之前改源,否则缓存了官方源元数据,后面还是会走慢速通道。
接下来安装服务端相关组件:
dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-agent2zabbix-agent2装在这里是为了监控Zabbix Server自己。生产环境我建议Server本身的Agent一定要装,这样你会有第一个"自监控"数据来源,后面排查问题时会非常有用。zabbix-web-mysql会自动拉取Apache和PHP相关依赖,这一步网络通畅的话大约需要几分钟。
3.2 创建数据库并导入初始Schema
安装完成后需要把官方预置的Schema导入数据库。这里有个易错点:不同版本Schema脚本路径不同。7.0的脚本路径是/usr/share/zabbix-sql-scripts/mysql/server.sql.gz:
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -pYourStrongPassword zabbix这条命令是整个安装过程中最耗时的一步,视机器性能可能需要几分钟。如果中途报错,最常见的原因就是字符集排序规则不对制,或者MySQL版本低于8.0。导入期间不要中断,否则会产生残缺的表结构,后面查问题会非常痛苦。
验证导入是否成功:
mysql -uzabbix -pYourStrongPassword zabbix -e "USE zabbix; SHOW TABLES;"执行后如果能看到几十张表,就说明Schema导入成功。常见的users、hosts、items、triggers这些表都会出现。如果表数量明显偏少,大概率是导入过程被中断过,需要drop database后重新来一遍,不要直接在上面的基础上继续,因为后续初始化建表会各种报错。
3.3 修改Server配置并启动服务
Zabbix Server的核心配置文件是/etc/zabbix/zabbix_server.conf,需要修改的主要是数据库连接信息:
vim /etc/zabbix/zabbix_server.conf找到这几行并修改:
DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=YourStrongPasswordDBHost这里有个隐藏细节:如果填localhost,Zabbix Server会通过MySQL的socket文件连接;如果填127.0.0.1,走的是TCP连接。在某些系统上socket路径不一致会导致连接失败,报错信息里能看到类似Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'。如果遇到这种情况,把DBHost改成127.0.0.1基本能解决,这也是我推荐直接写127.0.0.1的原因,能少一个变量。
PHP这边需要调整时区。RHEL系安装zabbix-web-mysql后,PHP配置文件在/etc/php-fpm.d/zabbix.conf,里面有一项:
php_value[date.timezone] = Asia/Shanghai确认时区为Asia/Shanghai后,重启所有服务并设置开机自启:
systemctl restart zabbix-server zabbix-agent2 httpd php-fpm systemctl enable zabbix-server zabbix-agent2 httpd php-fpm启动后监听端口检查:
ss -lntp | grep -E '10051|80'正常情况下10051端口是Zabbix Server在监听,80端口是Apache在监听。如果10051没起来,先查看/var/log/zabbix/zabbix_server.log,不要反复重启,日志会告诉你真实原因。最常见的就是数据库连接失败,其次是数据库用户密码携带了特殊字符导致配置解析出错。
4. Web前端配置与中文化:当心这几步操作改错了要重来
4.1 Web安装向导与PHP依赖检查
服务端启动后,浏览器访问http://服务器IP/zabbix,会自动进入安装向导。第一步是语言选择,直接选Chinese (zh_CN)也能走下一步,但我个人建议先选English,等登录后再切成中文,因为安装向导本身是Zabbix校验环境参数的必经流程,英文状态下报错信息有时更好在搜索引擎里定位。
安装向导会检查PHP前置条件,页面上会列出所有必选项。如果出现红色的"Fail"项,常见需要安装的PHP扩展有:
| PHP检查项 | 缺失时的安装命令(RHEL系) |
|---|---|
| php-bcmath | dnf install -y php-bcmath |
| php-mbstring | dnf install -y php-mbstring |
| php-gd | dnf install -y php-gd |
| php-xml | dnf install -y php-xml |
| php-ldap | dnf install -y php-ldap |
装完扩展后需要重启php-fpm和httpd,再刷新页面。这一步不要跳过任何红色项,否则即使强行走完安装向导,后面登录、图形展示都可能有隐患。等所有检查项都变绿,填写数据库连接信息:数据库类型选MySQL,主机填127.0.0.1,端口3306,数据库名zabbix,用户zabbix,密码为你设置的值。
4.2 首次登录、汉化与安全设置
安装向导完成后,默认账号是admin,默认密码是zabbix。登录进去第一件事是改密码,这不用我多说。Zabbix 7.0的界面已经比较现代,但操作逻辑依然是:Configuration管采集配置,Monitoring管数据和告警展示,Administration管用户、媒体、系统设置。
汉化路径是点击右上角头像进入User profile,在Language里选择Chinese (zh_CN),保存后刷新就会变成中文界面。注意是老版本是Preference里改语言,6.0和7.0在用户资料里,如果你看到的是英文界面但找不到改语言的位置,多半是把位置找错了。
改完语言后,还有一个安全细节需要处理:默认安装向导在完成后仍然保留,任何人都可以通过访问/zabbix/install.php重新触发安装流程。生产环境建议把这个文件删除或改名:
mv /usr/share/zabbix/install.php /usr/share/zabbix/install.php.bak虽然Zabbix新版对重复安装有保护机制,但保险起见,删除或改名是最稳妥的做法。这也是很多安全扫描器会报出来的中危风险点。
4.3 中文乱码与图形字体修复
Zabbix切到中文后,默认图表里如果出现中文标题或告警内容,大概率会显示成一堆方块。这是因为默认图形字体是DejaVu Sans,不支持中文字符。这个问题几乎每个中文用户都会遇到,解法也简单:系统中安装一个中文字体,然后让Zabbix使用它。
以文泉驿微米黑为例:
dnf install -y wqy-microhei-fonts cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/zabbix/assets/fonts/修改字体定义文件:
vim /usr/share/zabbix/include/defines.inc.php找到类似这样的配置行:
define('ZBX_GRAPH_FONT_NAME', 'wqy-microhei');有些版本是在$fonts数组里定义,把其中一项的值改成wqy-microhei即可,具体格式取决于版本。改完后清一下浏览器缓存或强制刷新,再去看图形,中文就正常了。如果在defines.inc.php里找名字找不到,也可以直接新建一个自定义字体数组,把'graphfont'指向你复制进去的字体文件名。
这一步做完,Web层面的基础配置才算完整。很多教程到这里就结束了,但对于真正要上监控的人来说,后面的Agent接入才是重头戏。
5. 把第一台Linux主机接入监控:Agent安装、模板选择与连通性验证
5.1 Agent vs Agent2:选哪个更省事
Zabbix有两代Agent:zabbix-agent(第一代)和zabbix-agent2(第二代)。新部署我推荐直接用Agent2,它支持插件机制,监控MySQL、PostgreSQL、Redis这些中间件时不需要再单独写脚本,插件装好就能用,而且官方持续在新版本中为Agent2增加功能。第一代Agent虽然稳定,但功能边界已经定型了,没有太多扩展空间。
安装Agent2:
dnf install -y zabbix-agent2 systemctl enable --now zabbix-agent2这步在Zabbix Server本机执行也可以,在你要监控的目标机器上执行也可以,安装包来源必须是同一个Zabbix仓库。版本一致性很重要,尽量让Agent2和Server保持同大版本,跨大版本的Agent连Server有时会出现部分key不兼容的情况。
5.2 Agent配置:主动模式与被动模式
Agent2的核心配置文件是/etc/zabbix/zabbix_agent2.conf,里面有三个关键参数:Server、ServerActive、Hostname。理解这三个参数是理解Zabbix工作方式的关键。
默认情况下,Zabbix用的是被动模式:Zabbix Server主动向Agent发起请求,Agent收到请求后返回数据。此时需要在Agent配置里写:
Server=10.0.0.10这个IP就是Zabbix Server的IP,Agent只接受来自这个IP的采集请求。
主动模式则是Agent按照固定周期主动把数据推给Server,此时需要配置:
ServerActive=10.0.0.10:10051 Hostname=web-01ServerActive告诉Agent往哪里推数据,Hostname告诉Server这一批数据是哪台主机的。注意Web端添加主机时,主动模式下主机名必须和Agent配置文件的Hostname完全一致,否则Server拒绝接收数据。
两种模式的场景差异:少量几台机器用被动模式就够,Server主动拉取是最直观的;但如果监控几百台机器且机器分布在多个网段,主动模式能显著减轻Server压力,也更容易穿透NAT。实际生产里两种模式可以混用,即同时配置Server和ServerActive,这样既能被Server拉取,也能主动推送。这种混用模式也是我推荐的生产配置,灵活性和稳定性兼顾。
5.3 Web端添加主机、链接模板与验证
回到Zabbix Web界面,进Configuration -> Hosts -> Create host。核心配置项:
- Host name:填主机名。如果Agent配置了主动模式,必须和zabbix_agent2.conf里的Hostname一致。
- Visible name:显示名称,可以随便填,比如"Web服务器-01"。
- Templates:搜索"Linux by Zabbix agent"并选择对应模板。如果Agent是主动模式,选择"Linux by Zabbix agent active";被动模式则选择"Linux by Zabbix agent"。两个模板都链接也可以,但如果主动被动混用,部分item会重复采集。
- Interfaces:添加Agent接口,填Agent机器的IP地址,端口默认10050。
保存后大概等几秒钟到几分钟,列表里主机的ZBX标识会从灰色变成绿色,说明连通正常。如果一直是灰色,先做手动连通性测试:
dnf install -y zabbix-get zabbix_get -s 10.0.0.101 -p 10050 -k agent.ping返回1说明Agent已正常响应,是Web端配置问题;返回超时则说明网络或Agent进程有问题,需要检查防火墙和Agent进程状态。这一步能快速你想问题的边界,不会让你瞎猜。
模板链接上之后,过两三分钟进Monitoring -> Latest data,选择这台主机,就能看到CPU、内存、磁盘、网络等一堆监控项的数据了。看到数据在跳,第一台主机接入完成,Zabbix部署的"骨架"已经搭好。
6. "zabbix server is not running"与权限报错:一条完整的排查链路
6.1 Server is not running的典型原因拆解
"Zabbix server is not running: the information displayed may not be current."这段红字是所有Zabbix使用者迟早会碰到的。它的意思是Web前端连不上后端Server进程,数据无法刷新。这个错误我已经处理过无数次了,每次的排查链路都是一样的:
第一步看进程:
systemctl status zabbix-server如果进程没在跑,直接看日志:
tail -n 50 /var/log/zabbix/zabbix_server.log日志是所有排障的第一信息源,90%的"not running"根源都能在这里找到。看到access denied去查数据库账号,看到cannot start preprocessing handler去查内存配置,看到cannot send data to database去查数据库连接。
第二步验证数据库连接:
mysql -uzabbix -pYourStrongPassword -h 127.0.0.1 zabbix -e "SELECT 1;"手动能连上,说明是和zabbix_server.conf的配置或权限不一致;手动都连不上,先去数据库端解决。
第三步看端口:
ss -lntp | grep 1005110051端口没监听,服务器进程肯定没正常起来,或者起来了又崩了,继续回到日志。
第四步是PHP的坑。如果zabbix-server在跑,Web前端还是显示not running,检查php-fpm是否启动:
systemctl status php-fpm另外PHP的date.timezone必须设置,否则前端会因为时区配置错误而拒绝和后端正常通信,表现出来也是一样的红字。7.0版本对次数的内存要求更高,如果你机器内存只有1GB,CacheSize这些参数最好手动调小,比如:
CacheSize=64M HistoryCacheSize=16M TrendCacheSize=16M否则Server进程会频繁OOM,表现也是进程不在、或者起来了又死。
第五步查磁盘:
df -h根分区或/var/log分区写满,Zabbix Server写入日志失败也会退出。这一步在长期运行的机器上很常见,尤其是默认把所有数据都放在系统盘、系统盘又只有20G的环境里。
还有一个适合内网机器的情况,就是SELinux没有关闭。RHEL系上如果忘记处理SELinux,Zabbix Server能起来但连不上数据库,或者无法监听端口,日志里会有类似Permission denied的信息,这种问题用常规思维去查会卡很久。
6.2 replace_user权限报错的真正来源
Zabbix报错里有一句非常经典的:Access denied for user 'replace_user'@'localhost' (using password: YES)。我为什么会把这个单独拉出来讲?因为这个词几乎直接暴露了问题来源——很多网上的安装教程在创建数据库用户时会写:
CREATE USER 'replace_user'@'localhost' IDENTIFIED BY 'replace_password'; GRANT ALL PRIVILEGES ON *.* TO 'replace_user'@'localhost';这里的replace_user和replace_password是占位符,意思是让你换成自己的用户名和密码。但很多新手直接照抄,于是数据库里真的创建了一个叫replace_user的用户。后续配置zabbix_server.conf时写的是DBUser=zabbix,Server拿着zabbix这个用户去登录MySQL,MySQL说不认识你,于是报Access denied for user 'zabbix'@'localhost',或者如果你把配置也改成了replace_user,那报错就是英语字面的那个样子。
排查方式很明确:
SELECT user, host FROM mysql.user;看看数据库里到底有哪些用户。如果发现zabbix没有,直接创建正确用户再授权;如果zabbix存在但密码不对,修改密码或重新授权:
ALTER USER 'zabbix'@'localhost' IDENTIFIED BY 'NewPassword';然后同步更新zabbix_server.conf里的DBPassword,重启zabbix-server。另外提醒一点:如果密码里有特殊字符,比如@、#、^,zabbix_server.conf的DBPassword不支持转义,容易解析错。遇到这种问题,最安全的办法就是把数据库用户密码改成纯字母数字组合,或者用Zabbix配置工具重新生成。
另一种常见情况是zabbix-server.conf里DBHost填了localhost,但PHP和Server找的MySQL socket路径不一样,也会报Can't connect through socket或者Access denied。这种情况把DBHost改成127.0.0.1,强制走TCP,绕过socket路径差异就解决了。
6.3 其他高频故障:Unreachable、Not supported
除了Server本身的报错,日常碰到最多的是主机状态变成红色ZBX或灰色ZBX。灰色ZBX加"Host unreachable"表示Agent连不上,通常的排查链路是:ping一下主机IP通不通,确认非本机防火墙拦截10050端口,检查Agent进程是否正常运行,最后用zabbix_get手动采集key。按这个顺序来,不用慌。
另一个高频状态是ZBX_NOTSUPPORTED,鼠标放到监控项上会提示Not supported的原因。这代表Server连上了Agent,但Agent不认这个key。最常见原因是模板类型不匹配:你在Web端用的模板是Linux by Zabbix agent(被动模式),但Agent配置的Hostname和ServerActive和主动模式相关,导致某些key的指标获取方式不对;或者Agent2插件的某个模块没有启用。还有一种情况是Agent版本太老,不支持模板里某些新key,把Agent升级到和Server同版本基本能解决。
7. 从交换机到告警通知:让Zabbix真正用起来的几个进阶配置
7.1 用SNMP监控交换机
部署好了服务器监控,很多人下一步就想把交换机纳入监控。Zabbix通过SNMP协议实现对网络设备的监控,不需要在交换机上装任何Agent,只需开启SNMP服务。以常见交换机为例,先在设备上配置SNMP读社区字符串:
snmp-server community public ro然后在Zabbix Web端添加主机时,接口类型选择SNMP,填写交换机的管理IP,端口默认161,SNMP community填public。模板选择"Networking by SNMP"这一类的通用模板,就能自动带上接口状态、流量、CPU、内存等监控项。
在把设备接入Zabbix之前,建议先手动验证SNMP联通性:
snmpwalk -v2c -c public -On 10.0.0.253 .1.3.6.1.2.1.1能返回一堆系统信息就说明SNMP配置没问题。如果snmpwalk没有返回数据,Zabbix这边怎么配都是白费劲。注意SNMP版本:老设备可能只支持SNMPv1或v2c,新设备支持SNMPv3,有安全要求的环境建议用v3,虽然配置麻烦一点,但Community明文传输在安全性上确实是个短板。
7.2 接报警:钉钉/企业微信/邮件
监控建起来之后,报警通知是让监控系统真正发挥价值的环节。Zabbix的告警链路是:触发器(Trigger)产生事件,动作(Action)将事件推送到媒体(Media type),媒体再发送到你的钉钉、企业微信或邮箱。
以钉钉机器人告警为例,先在钉钉群里添加一个自定义机器人,拿到Webhook地址。然后在Zabbix里创建Media type,选择Webhook类型或使用社区现成的钉钉告警脚本模板,填入Webhook URL。接下来给用户配置媒体接收人:Administration -> Users -> 选择你的用户 -> Media -> Add,选择刚才创建的钉钉媒体类型,输入接收人的手机号或群机器人设置的手机号。
最后创建动作:Configuration -> Actions -> Trigger actions -> Create action。条件里选Trigger severity大于等于Warning,操作里配置发送消息给指定用户组,恢复操作也配一条,告警恢复时也能收到通知。触发器表达式举例:
last(/Linux by Zabbix agent active/system.cpu.util[,5m])>80这个表达式表示最近5分钟的CPU平均使用率超过80%时触发告警。阈值不要直接用默认值,要根据业务机器实际负载来调,否则默认触发器很容易误报,或者真正该告警的反而没告。
我强烈建议:任何告警动作都要同时配置"问题发生"和"问题恢复"两个操作,否则告警恢复时你完全不知道,只能一直处于焦虑状态。这就好比你家的烟雾报警器只响铃但不解除,谁也受不了。
7.3 大屏展示与数据保留策略
Zabbix 7.0内置的Dashboard已经很好用了,通过拖拽不同Widget组成一个大屏页面,可以放CPU趋势、内存使用、磁盘空间、网络流量等几种图形。进入Monitoring -> Dashboard,默认有一个全局概览,可以新建自定义Dashboard并分享链接,放在办公室大屏幕上,所有团队成员都能看到整体资源水位。
如果觉得Zabbix内置图表不够好看,可以接Grafana。Grafana通过插件连接Zabbix API:
grafana-cli plugins install alexanderzobnin-zabbix-app数据源类型选Zabbix,API地址填http://Zabbix服务器IP/api_jsonrpc.php,账号用Zabbix的管理员账号和密码。这样就能在Grafana里用更灵活的图表面板来展示Zabbix采集的数据,适合那种需要给领导做汇报展示的场景。
数据保留策略是运维层面的必修课。Administration -> General -> Housekeeping里可以设置历史数据保留天数与趋势数据保留天数。默认历史数据保留31天,趋势数据保留365天。如果磁盘有限,历史数据改成7天或14天就够,毕竟老数据用到的频率并不高。Zabbix自带的分区表优化(TimescaleDB)在7.0里也更好用了,大数据量下性能会有明显提升,但对数据库架构有要求,需要安装时选PostgreSQL才能用,如果已经是MySQL,注意控制历史保留天数来避免磁盘膨胀。
我自己在实际使用中的体会是,监控系统部署完成只是一个开始,真正花精力的往往是后面的告警调优和阈值治理。Zabbix的默认模板只是给了一个合理起点,你不能指望开箱即用的默认阈值完全适配你的业务。建议先把基础资源监控跑上两周,观察正常时期的CPU、内存、磁盘水位,再根据这些真实基线去调整触发器的阈值和告警级别,这样才能真正让告警在关键时刻响起来,而不是天天半夜被不痛不痒的通知吵醒。另外,从交换机到告警通知这些进阶功能,不要一天之内全部配完,每加一类监控就观察一段时间,Zabbix的部署力不大,但维护好告警质量才是长期的事。