干运维这些年最怕的就是半夜被手机震醒。哪怕只是某台机器CPU飙到99%在没上监控的那段日子里我都是等到用户投诉才知道出问题。后来决心把监控体系好好搭起来调研了一圈最终选了Zabbix。用过之后再回头看这玩意确实是传统IT基础设施监控里最稳的选择之一开源免费、组件清晰、文档齐全社区模板又多从服务器、虚拟机到网络设备都能管。这篇博文就把我完整搭建Zabbix平台的过程和经验一步步写出来包括安装部署、Agent接入、自定义监控项、告警联动钉钉和各类报错排查亲测有效照着走基本一次能通希望能帮你少踩几个坑。如果你是刚接触Zabbix的运维新人或者正在评估监控方案这篇内容应该会对你有用。1. 监控平台怎么选我为什么最终坚持用Zabbix1.1 Zabbix到底能监控哪些东西先说一个很多新手都会问的问题Zabbix能监控什么简单来讲凡是能暴露数据接口的东西它基本都能纳入监控范围。最常见的是Linux、Windows服务器的CPU、内存、磁盘、网络流量和进程状态这些通过Zabbix Agent就能拿到数据库方面MySQL、PostgreSQL、Oracle、Redis都有成熟模板中间件和Web服务比如Nginx、Tomcat、Apache也有对应的监控方式。网络设备像路由器、交换机、防火墙只要支持SNMP协议Zabbix也可以直接采集端口流量、CPU负载、在线状态这些指标。更进阶一点的你还能通过IPMI监控物理服务器的硬件状态通过JMX监控Java应用甚至用自定义脚本把业务层面的数据也采集进来比如订单量、接口耗时、队列积压数。从我自己日常使用的情况来说Zabbix真正厉害的地方不是某个单项监控能力而是它能用一套体系把服务器、网络、业务全串起来配合触发器做告警配合报表看趋势。面试中如果被问到“Zabbix监控哪些东西”你可以往这个方向答监控对象分硬件、系统、应用、业务四个层次采集手段分Agent、SNMP、IPMI、JMX等多种协议数据最终汇总到Zabbix Server统一处理。这个答案比干巴巴背几个监控项要有说服力得多。1.2 核心组件与数据流搞懂这些才能少走弯路Zabbix是一套典型的Client-Server架构主要由几个部分组成Zabbix Server是大脑负责接收数据、触发判断、发送告警Zabbix Agent部署在被监控主机上负责采集指标并上报Zabbix Proxy是可选的分布式组件适合跨机房、大规模场景由Proxy先采集再转发给ServerZabbix Web则是PHP写的管理界面用来配置和查看数据后端数据库默认用MySQL/MariaDB或PostgreSQL所有配置和历史数据都存在里面。理解数据流很重要。默认情况下Agent会按照监控项的采集间隔主动把数据推给Server或者Server按间隔去Agent抓取这个过程有主动和被动两种模式后面我会详细展开。Server拿到数据后写入数据库同时会跑触发器表达式做判断如果条件满足就产生事件事件经过告警动作和媒体类型配置最终以邮件、钉钉、企业微信等方式发出来。整个过程可以理解成监控项负责采集数据触发器负责判断健康状态动作和媒体类型负责把异常告诉人。把这个流程搞清楚了后面配置什么都有方向感不会像没头苍蝇一样乱点。2. 从零到一Zabbix Server安装部署实战2.1 环境准备系统、数据库与仓库选型先说我的实验环境我这次是在一台Rocky Linux 9系列的机器上部署8G内存、4核CPU、100G磁盘系统是最小化安装。Rocky Linux 9.8这样的新版本也适用因为你不需要管大版本里的具体小版本号Zabbix官方仓库会对整个9.x系列提供适配装出来的效果是一致的。数据库我选了MySQL 8.0分支的MariaDB对于中小规模监控完全没有问题二三十台服务器、几千个监控项这个量级资源占用很从容。需要提醒的是装Zabbix Server之前一定先把基础环境弄干净不然排查问题时会疯掉。首先确保系统时间正确最好配置好NTP或chrony因为Zabbix的告警和数据记录都严重依赖时间Server和Agent之间时差太大会出现数据延迟、触发器误报这类怪问题。其次如果开启了SELinux建议先查一下状态虽然可以配置放行规则但大多数实践场景里内网监控服务器直接设置为permissive更省事当然生产环境建议还是按安全规范来。防火墙方面Zabbix Server需要放行10051端口Web界面需要80端口后面加Agent主机时还要在Agent上放行10050端口。仓库配置这里有个小坑国内网络环境从官方源下载很慢我实测下来用阿里云镜像或者清华镜像的Zabbix仓库速度会好很多。配置好仓库后直接执行安装命令安装的包包括zabbix-server-mysql、zabbix-web-mysql、zabbix-nginx-conf和zabbix-sql-scripts如果你想让前端跑在Apache上那就装zabbix-apache-conf二选一即可。我习惯用Nginx省内存配置也直观。2.2 数据库初始化与Server配置安装完包之后第一步是初始化数据库。这里要特别提醒很多新手报错“access denied for user replace_userlocalhost”就是在这一步出了问题等下我在问题排查章节会重点讲。正确的做法是先启动MariaDB登录进去建一个独立的Zabbix用户和空库然后从Zabbix自带的SQL脚本导入初始表结构。初始脚本路径一般在/usr/share/zabbix-sql-scripts/mysql/server.sql.gz导入时加上--default-character-setutf8mb4参数避免中文乱码。我在导入时还习惯先做一些参数调整。打开MariaDB的配置文件在[mysqld]段下把innodb_buffer_pool_size调大一些比如2G把innodb_log_file_size提高到64M这些参数对Zabbix这种频繁写入历史数据的场景帮助非常大。如果数据量真的很大后续还要考虑分区表Zabbix默认的housekeeper会清理过期数据但分区表在高负载下效率更高这个属于进阶玩法初期不用强上。数据库搞定后编辑Zabbix Server的主配置文件路径在/etc/zabbix/zabbix_server.conf需要改动的不多核心是DBHost、DBName、DBUser、DBPassword这几项一定要和你建库时保持一致。我见过有人改完DBPassword忘了改DBUser结果连上去权限不对还以为是密码写错了。另外如果你是让Zabbix通过Unix Socket连数据库DBHost就写localhost注意和PHP端配置保持一致前端也要能连上数据库才显示安装界面。2.3 启动服务与Web初始化安装Server和数据库都配置好后依次启动服务并设置为开机自启。注意启动顺序先启动数据库再启动Zabbix Server最后启动Nginx和PHP-FPM。PHP-FPM有个默认配置是时区需要修改为Asia/Shanghai否则前端会有时区报错。这些做完以后浏览器访问http://服务器IP就能看到Zabbix的Web初始安装页面。Web初始化向导其实就是检查环境依赖、填写数据库连接信息、设置Zabbix Server主机名和端口最后一步会让你配置前端管理员的初始密码策略。这里有个细节数据库连接信息要和zabbix_server.conf保持一致否则前端连不上库会直接卡在检查环节。我见过有人数据库密码里带了特殊字符写入配置文件时没注意转义导致后面服务起不来或者前端连不上建议初期密码用纯字母数字组合跑通了再改复杂密码。安装完成后默认管理员账号是Admin密码是zabbix登录进去第一件事就是改密码。另外前端界面默认是英文点右上角用户头像进入Profile设置把Language改成Chinese再刷新页面就是中文界面了。中文界面对新手友好很多但也要注意Zabbix的部分术语翻译后反而不容易和文档对应上所以进阶阶段我建议切回英文尤其是查官方文档时中英对照着看效率更高。3. 新主机接入云主机怎么添加到Zabbix监控3.1 被动检查与主动检查模式选择直接决定架构新主机接入之前先把Agent的主动和被动模式理解透因为这是Zabbix使用中最高频的概念也是面试题常客。被动检查是默认模式由Zabbix Server发起到Agent的连接向Agent要某个监控项的数据Agent收到请求后返回结果通俗讲就是Server上门取数据Server监听10051端口Agent监听10050端口。这种模式适合服务器数量不多、网络是互通内网的场景配置简单问题排查也直观。主动检查则是Agent按配置的采集周期自己去Server那边取任务列表然后采集数据后主动推到Server的10051端口通俗讲就是Agent送货上门。这种模式最大的好处是减轻了Server的并发压力而且Agent可以配置多个Server源适合大规模集群和跨网段部署。实际生产里我习惯混用能主动就主动尤其是几百台机器的大集群小规模实验环境用被动就够了。判断用哪种模式有个简单规律Server能直接连通Agent的10050端口用被动模式如果跨防火墙、跨VPC或者Agent数量多到Server主动采集会超时就果断换主动模式。还有一种混合模式Agent同时监听10050并主动上报但这种方式不建议一开始就用逻辑会比较绕。3.2 安装并配置Zabbix Agent给被监控主机装Agent先添加官方仓库然后安装zabbix-agent2或者zabbix-agent。很多新版本开始推荐zabbix-agent2它用Go重写支持更多插件性能也更好而且配置文件和原版Agent基本兼容。我这里以zabbix-agent2为例安装完成后编辑配置文件/etc/zabbix/zabbix_agent2.conf最核心的改动是Server、ServerActive和Hostname三项。如果你用被动模式Server后面填Zabbix Server的IP即可如果用主动模式ServerActive也填上Server地址同时Hostname一定要和Web界面里添加主机时填的名称保持一致否则主动模式数据上报会显示不可达。这里有个经验很多新手配置完Agent启动也正常但Web界面里主机状态就是显示红色原因往往是Hostname没对上。Zabbix的主动模式是靠Hostname来识别主机的Agent配置里写的是host-01你在Web界面添加主机时填的是Host-01大小写不一致都会采集不到数据。建议从一开始就统一命名规范比如全部用小写加中划线连数据库都建一个hosts命名规则表时间长了运维会感谢你的。Agent启动后用ss -lntp确认10050端口处于监听状态。然后可以在Zabbix Server上用telnet 被监控机IP 10050测试连通性通了再继续。这一步很关键能省掉后面一大半的排查时间。3.3 在Web界面添加主机与链接模板Agent就绪后进入Zabbix Web界面的“数据采集 - 主机”菜单点击创建主机。主机名称要和Agent配置的Hostname保持一致所属群组可以新建一个比如“Production Servers”。可见名称可以不填留空默认用主机名。最重要的部分是“接口”配置选择Agent类型IP地址填被监控机的实际IP端口默认10050。然后切到“模板”页签搜索“Linux by Zabbix agent”点击添加并更新。链接模板这步看起来简单但作用很大。我见过有人不链接模板只添加了主机结果等了半天一个监控项都没有这其实是对Zabbix的监控逻辑还没理解明白。主机本身只是一个空的对象数据从哪里来、怎么采、采什么全部由监控项决定而模板就是一堆现成监控项的集合。链接Linux模板后系统会自动为这台主机创建CPU、内存、磁盘、网络、系统启动时间等上百个监控项同时模板里还预置了对应的触发器比如磁盘使用率超过90%会自动报警这些都不用你手动配置。链接完模板过一两分钟回到“监测 - 最新数据”按主机筛选如果能看到数据在走就说明监控已经生效了。这个时候可以顺手做个小测试在被监控机上执行一条高CPU命令比如yes /dev/null 过几分钟去看触发器是否报警验证一下数据链路和触发链路是否都正常。测试完记得把进程杀掉。3.4 网络设备怎么加SNMP方式与深信服模板实战除了Linux/Windows服务器Zabbix还可以监控网络设备比如路由器、交换机、防火墙这时候就是用SNMP协议。有一次公司一台深信服AC上网行为管理设备频繁出问题用户反馈上网慢我一开始也不知道它负载怎么样后来直接在Zabbix里加了这台设备过程并不复杂。先在深信服管理后台开启SNMP服务设置只读团体名推荐用有强度一点的字符串尽量不要用默认的public。然后在Zabbix里添加主机时接口类型选择SNMP填IP和端口161版本选SNMPv2团体名填刚才设置的。模板方面Zabbix有自带的Network device模板能监控接口流量、状态、丢包率这些基础指标。如果你要更细的指标比如深信服设备特有的在线用户数、CPU使用率、内存使用率可以去Zabbix官方社区或网上的模板分享站点搜索“深信服”或“sangfor”找现成模板导入导入后修改OID即可。我自己用下来多数设备其实走通用SNMP模板就够了特殊业务指标按需自建模板不要一上来就追求大而全模板越多越难维护。自己新建一个监控项也不难关键是搞清楚OID。SNMP的OID结构看起来像一串数字点分字符串实际上它是在描述设备的某个具体信息对象。比如常见企业网卡接口的OID一般是1.3.6.1.2.1.2.2.1.10开头的ifInOctets表示入方向字节数。你可以先用MIB Browser工具或者snmpwalk命令在服务器上测试把想监控的OID探测出来确认能返回数值再填到Zabbix的监控项里。这一步的价值很大因为不同厂商设备的私有OID差异特别大网上查到的OID不一定适配你的型号实测是最靠谱的。4. 监控项、触发器与告警让Zabbix真正“干活”4.1 监控项的底层逻辑key、采集间隔与数据存储监控项是Zabbix最核心的配置单元理解了监控项整个Zabbix的使用就掌握了一半。一个监控项本质上就是一条采集指令它由key、信息类型、更新间隔、历史数据保留时间这几个要素组成。key是Agent端能识别的指令名称比如system.cpu.load表示CPU负载vfs.fs.size[/,free]表示根分区的剩余空间这些key是Zabbix预定义好的你也可以自定义脚本用自定义key采集任何你想要的指标。更新间隔决定数据采集频率默认是30秒到1分钟。这里要注意一个经验不是所有监控项都需要1秒一次CPU和内存可以高频采集但像磁盘容量这种变化很慢的指标5分钟采一次完全够用。采集频率越高数据库压力越大几百台机器如果每个监控项都30秒一次数据库很容易成为瓶颈。我在生产里会按监控项的重要性分级设置间隔基础指标1分钟业务指标30秒趋势类指标5分钟这样整体资源占用能下降一半以上。数据存储方面Zabbix会把采集到的原始数据保留一段时间称为历史数据同时会周期性地把历史数据聚合生成趋势数据用于长期图表展示。默认的历史保留时间是7天趋势保留时间是365天对大多数场景够用。如果你要长期保存原始数据建议通过API或者定时任务把历史数据导出到其他存储单纯调大保留时间会让数据库表膨胀得很快。4.2 触发器表达式让告警具备判断逻辑监控项只是采集真正判断系统是否健康要靠触发器。触发器本质上是一个逻辑表达式当表达式的结果为真时就产生一个事件表达式的写法类似last(/主机名/监控项的key) 80。比如我想监控某台机器的CPU负载是否过高生成磁盘使用率超过90%的告警可以写last(/web-01/system.cpu.util[,total]) 90。触发器这里有个新手容易忽略的点告警恢复条件。默认情况下触发器只在表达式为真的那一刻发一次告警如果后面数值降下来了触发器会恢复但如果你没配置恢复消息人可能就不知道问题已经平息了。我一般在配置告警动作时会把“问题”和“恢复”两个操作都加上恢复时发送一条“XX已恢复正常”的通知这样运维心里有数不会一个问题反复确认。这个操作的核心思路是告警不应该只是出问题时报一次而应该是一个完整的状态机。4.3 Zabbix 7.0新特性钉钉告警联动实战讲到告警通知就不得不提Zabbix 7.0里一个挺受欢迎的功能直接通过Webhook和钉钉联动。以前要在Zabbix里发钉钉告警得自己写脚本调钉钉机器人接口还得管理脚本路径、依赖环境麻烦且不稳定。7.0版本内置了钉钉Webhook媒体类型配置起来清爽很多。操作路径是“告警 - 媒体类型 - 钉钉”填写钉钉机器人Webhook地址。钉钉机器人的创建方式是在钉钉群添加自定义机器人设置一个安全关键字或者加签我推荐用加签方式因为关键字可以被绕过加签更安全。然后在“用户 - 报警媒介”里给管理员用户添加钉钉媒体类型填上手机号和机器人token最后在告警动作里指定操作发送给哪些用户。我实测下来7.0的钉钉Webhook消息能带上问题名称、主机、严重级别、当前值、时间这些变量信息比较完整。有一点要注意钉钉机器人官方对消息发送频率有限制如果监控项特别多、告警风暴严重短时间内大量消息会被钉钉拦截。我的做法是在告警动作里配置“操作条件”比如同一个主机同一个触发器5分钟内只发一次或者设置升级策略P1级别的告警直接发P3级别的告警先等15分钟如果没恢复再发。这个机制能有效避免告警轰炸人也愿意看告警群里的消息。4.4 自定义监控项把业务数据纳入监控体系模板自带的监控项只能管系统层面业务层的监控还得靠自定义。比如公司有个接口正常耗时应该在200毫秒以内如果超过1秒就要告警这个指标Zabbix默认不采集需要自己写脚本。思路很简单脚本探测接口耗时把结果打印到标准输出Zabbix Agent执行这个脚本拿到数字作为一个监控项的数据。具体操作是先在被监控机上写一个脚本/usr/local/bin/check_api_time.sh用curl计算接口响应时间然后在Agent配置里加上UserParameterapi.time,/usr/local/bin/check_api_time.sh。这个配置的意思是新增一个key叫api.timeAgent执行后面的命令并把输出返回给Server。接着在Web界面添加监控项key填api.time信息类型选浮点数更新间隔设30秒再配一个触发器last(/主机名/api.time) 1000就完成了。自定义监控项这块我有几个心得。第一脚本一定做异常处理接口超时不要返回空返回一个数比如9999方便触发器判断第二脚本执行权限要正确Zabbix Agent跑脚本的用户是zabbix经常见人脚本root能跑Agent跑不了第三先在本地以zabbix用户手动执行一次脚本确认输出格式再挂到监控项里。这三个坑我都踩过现在写脚本第一行条件反射就是检查执行用户和输出格式。5. 常见问题排查实录那些年我踩过的坑5.1 安装后报错access denied for user ‘replace_user’‘localhost’这个报错的热度真不是一般的高我身边好几个同事第一次装Zabbix都撞上过。细节是装完Zabbix Server启动服务或者跑SQL时提示数据库拒绝访问错误信息里的用户还是“replace_user”这种占位符。出现这个报错的原因绝大多数是Zabbix Server配置文件里数据库用户名没改或者改了但没对应上你实际创建的用户而且有时候官方文档给的安装命令里会留一个占位符大家复制粘贴时没有全部替换直接把replace_user写进了配置。解决办法分两步。第一步确认数据库里到底创建了哪些用户登录MariaDB执行select user, host from mysql.user;看看有没有你预期的zabbix用户如果没有就按官方流程重新创建并授权第二步检查/etc/zabbix/zabbix_server.conf里的DBUser和DBPassword确保和数据库里一致然后重启服务。还有一个隐藏坑如果你配置了PHP前端/etc/nginx/conf.d/zabbix.conf里可能也有一处数据库连接信息前端报错的话这个文件同样要检查。实际操作中我遇到过一个更隐蔽的问题数据库用户对Zabbix库只有普通权限没有ALTER和INDEX权限Zabbix初始化建索引时会失败表现为安装过程不报错但页面查询历史数据贼慢排查很久才发现是权限给小了建议直接按官方文档授权全部权限。5.2 Agent状态红色或数据不刷新Web界面里主机显示红色最常见的原因是Server和Agent之间网络不通或者Hostname不一致。排查顺序一般是看Server能不能ping通Agent看两者之间端口是否连通telnet 对方IP 10050测一下如果通不了就检查防火墙和安全组。防火墙这块Cloud平台主机还有个隐藏问题安全组规则修改后有时要等一会儿才生效容易被误判为配置错误。网络没问题后去Agent上看服务是否在运行再检查配置文件里的Server地址是否填对了IP最后看Web界面主机的主机名和Agent配置的Hostname是否严格一致。这几个点检查完八九成的问题都能解决。如果你用的是主动模式数据一直不更新的排查重点会不一样。主动模式下Server不会主动连Agent的10050端口而是Agent按周期连Server的10051端口这时候要确认ServerActive配置正确并且Server的10051端口在防火墙里放行了。还有个细节主动模式下Agent会周期性向Server要配置获取配置的周期是120秒所以你在Web界面改了监控项后主动模式Agent最长要等2分钟才会生效如果你刚好在改完后的1分钟内看数据没变化是正常的别急着反复重启Agent反而容易造成数据断点。5.3 中文乱码与图表字体问题Zabbix图形界面的中文乱码是另一个高频问题尤其是图片报表里的中文。原因很简单Zabbix前端生成图片时默认使用的字体不支持中文系统里又没有安装中文字体所以中文全部变成了方块。解决办法也很直接安装一个中文字体比如fonts-wqy-microhei然后把字体文件复制到Zabbix前端可用的字体目录修改对应的字体配置指向这个新字体。针对字体文件需要注意权限。如果不小心把字体文件的所有者设置成root而PHP-FPM进程用户是nginx或www-data图片生成时会因为没权限读取字体而报错。另外复制字体时记得把配置里的字体名改成新字体的实际文件名大小写要严格一致这个细节很多人漏掉改完字体配置但文件名没对上照样乱码。字体问题解决后所有图形的中文显示都会恢复正常包括主机名、监控项描述、仪表盘标题体验提升非常明显。5.4 时间同步、性能优化与日常维护小经验最后再补充几个我日常使用中积累的小经验。时间同步的重要性在前面说过重点再强调一下一旦Server和Agent时间偏差超过30秒告警判断就可能出错比如CPU负载已经恢复但由于时间差异触发器延迟恢复或者根本不恢复非常麻烦。维护Zabbix环境时我通常会在汇总信息里显示“服务器时间”这一项每次排查问题时先看它一眼。性能方面假如你的监控规模涨到了几百台机器Zabbix Server的配置文件里有几个参数可以调优。StartPollers控制被动模式下并发采集的进程数StartPollersUnreachable控制不可达主机重试的进程数CacheSize控制配置缓存的容量Timeout控制采集超时时间。建议从默认参数开始在监控上观察Server的负载和队列统计综合评估后再逐步上调。另外Zabbix自带的Housekeeper会定期清理过期历史数据如果发现数据库持续膨胀检查一下History和Trends表的大小必要时手动清理并优化表。备份策略也是不能漏的环节。数据库里包含了Zabbix所有配置和历史数据我每周定时用mysqldump备份一次保留最近4周同时每天早上自动备份/etc/zabbix目录的配置文件。备份脚本写好后一定要实际跑一次还原演练别等到真出问题才发现备份文件是坏的这算是我交过“学费”后的深刻教训。这套Zabbix平台搭好之后我又逐步把公司的几十台机器全部接进来又陆续配了短信告警、周报邮件、大屏展示现在半夜基本不会被无意义的告警吵醒了。如果你也是刚准备搭建监控体系建议先用一台测试机把这套流程完整走一遍从Server安装到Agent接入再到告警通知全通了再上生产期间遇到问题多翻官方文档别急着怀疑是“玄学”。Zabbix这东西配置看起来多但只要你把监控项、触发器、动作这三个核心概念吃透日常使用就会变得很顺手。