ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Zabbix报错排查实战:从Access denied到告警推送全指南

Zabbix报错排查实战:从Access denied到告警推送全指南 没有哪个运维没被Zabbix折磨过。从装好服务端那一刻的Access denied到监控图上数据死活不出来再到钉钉告警怎么都推不出去这一路报错踩过去基本就等于把Zabbix的文档手册翻了一遍。今天我不讲理论、不贴官网原话直接把这些年攒下的Zabbix报错案例、排查思路和最终解决方案整理成一份“实战集锦”每一个都是真实环境里滚过的坑你照着看就行。这篇内容适合谁刚把Zabbix装起来准备搞监控的初学者被“监控项不支持”“主机不可达”逼疯的新手以及被钉钉联动、模板导入这些问题卡住的进阶用户。无论你是CentOS、Rocky Linux还是Ubuntu只要用的是Zabbix 6.x或7.x系列这篇都能帮你省下不少翻论坛的时间。1. 安装部署阶段的经典报错安装阶段的问题最多但也最套路化。因为Zabbix依赖的组件太多——数据库、PHP、Web服务器、Agent任何一个环节的版本或者配置对不上都会在安装或者初始化的时候炸出来。好消息是这类报错的排查路径非常标准掌握了套路基本都是一次过。1.1 Access denied for user zabbixlocalhost 数据库连接被拒这是Zabbix Server安装后最经典的报错没有之一。装上server包、导完数据库之后打开前端页面或启动服务时报这个错意思是Zabbix Server进程连不上MySQL/MariaDB。先别急着改密码要按顺序排查三件事。第一件事确认数据库账号和密码是否真的创建成功。很多人用的是各种一键脚本或者照搬博客的安装命令结果忽略了某个步骤。用下面这条命令手动验证一下mysql -uzabbix -p -h 127.0.0.1如果这里直接报错说明问题出在数据库侧检查用户是否创建、授权是否正确CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER zabbixlocalhost IDENTIFIED BY 你的密码; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; FLUSH PRIVILEGES;第二件事检查Zabbix Server配置文件里的数据库密码是否和实际一致。配置文件路径通常是/etc/zabbix/zabbix_server.conf找到这几行DBHostlocalhost DBNamezabbix DBUserzabbix DBPassword你的密码改完配置文件一定要重启服务并且用zabbix_server -t测试配置是否正确。第三件事最容易忽略的——SELinux。如果你用的是RHEL/Rocky Linux/CentOSSELinux很可能在暗中拦截。排查命令getenforce如果是Enforcing先临时关闭测试定位setenforce 0如果关闭后正常了说明就是SELinux的锅。不要图省事直接禁用SELinux用下面的命令放行Zabbix的相关权限setsebool -P zabbix_can_network 1 setsebool -P domain_kernel_load_modules 1注意有些老教程会让你关闭SELinux完事但生产环境千万别这么干。正确做法是放行必要选项安全合规和监控系统不冲突。第三件事的场景再补充一个变种如果配置了远程数据库DBHost写的是IP而不是localhost那么MySQL侧的用户授权就需要改成zabbix%或者zabbix你的ServerIP不然就算密码对了照样Access denied。这个坑在云服务器和Docker化部署时非常常见。1.2 数据表导入报错或导入后前端仍提示数据库错误另一个高频安装问题是导入create.sql.gz时报错或者导入成功但前端初始化页面一直提示数据库版本过低、表结构缺失。这通常不是Zabbix本身的问题而是数据库版本或者字符集不对。Zabbix 7.0要求MySQL 8.0.x或者MariaDB 10.5以上。如果你机器上自带的是MySQL 5.7老版本导入时大概率会碰到不兼容的语法错误。解决办法很简单先把数据库升级再重新导入。不要试图手动改SQL文件去匹配老版本Zabbix官方根本不支持这么干。字符集的问题更隐蔽。Zabbix的SQL文件明确指定了utf8mb4字符集但如果你手动建库时用了默认的latin1或者utf8mb3虽然导入不报错后面前端页面中文注释、告警内容、图表标题会出现乱码甚至是无法写入告警信息。建库时务必带上CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;导入命令用zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix这种方式执行一次性导入完成。导入之后用mysql -uzabbix -p -e USE zabbix; SHOW TABLES;检查表是否完整Zabbix 7.0在全新安装时应该有180张左右的表如果数量明显偏少说明导入过程被中断了重来一次。1.3 前端页面显示PHP环境不满足要求装完Zabbix服务端浏览器打开前端页面最常见的报错是“PHP option max_execution_time should be set to 300”这一类。Zabbix对PHP的各种参数有硬性要求统统在/etc/php.ini或者PHP-FPM的配置里调整。建议直接把下面这些参数一次性改到位max_execution_time 300 max_input_time 300 memory_limit 128M post_max_size 16M upload_max_filesize 2M date.timezone Asia/Shanghai改完之后别忘了重启PHP-FPMsystemctl restart php-fpm这里面最坑的是date.timezone。如果你不设置时区Zabbix前端能打开但所有图表、告警时间都会比本地时间慢8小时监控数据的时间轴全是错的。我也见过有人把 date.timezone 写在PHP的某个配置文件里但没写对位置PHP-FPM加载的其实是另一个配置文件。排查时可以新建一个info.php放到Web根目录访问后查看Loaded Configuration File那一行确认自己改的是不是真正生效的配置文件。1.4 前端打开404、页面空白或权限报错前端页面404大多和Web服务器的配置有关。如果你用Nginx PHP-FPM部署ZabbixNginx的root路径配置不对就404。Zabbix的前端文件通常装到了/usr/share/zabbixNginx配置里应该写root /usr/share/zabbix;而且location ~ \.php$里的fastcgi_param SCRIPT_FILENAME要配合root路径来写不然PHP文件解析不到。页面空白则可能是PHP的opcache扩展冲突或者PHP版本太高。Zabbix 5.0之后的版本对PHP 8.1支持良好但如果你用的是非常老的Zabbix 4.x配上PHP 8.1前端就会白屏。我在实际中遇到一次参考IBM的推荐方案降级PHP到7.4才解决。权限报错就简单了多半是/etc/zabbix/web/下的zabbix.conf.php文件不可写。Zabbix安装完成后这个文件需要可写权限才能保存配置安装完成后又要改回只读。用chmod 644设置后再给php-fpm用户通常是apache或nginx加读权限即可。2. 主机添加与监控项获取数据时报错服务端装好只是第一步真正开始干活是往里面加主机、配置监控项。这里报错的密集度比安装阶段更高而且错误提示往往看不懂比如主机状态是灰色、监控项显示“Not supported”、数据一直没值。这个阶段需要理解Zabbix的数据采集模型不然很容易被表象带偏。2.1 添加其他主机时状态为灰色或红色在Zabbix前端添加了一台新主机列表里显示红色不可达或者灰色从未连接。首先要分清楚这台主机是被Agent监控还是SNMP/IPMI监控不同方式排查路径不一样。以最常见的Agent监控为例先排除网络层面的问题。在Zabbix Server所在机器上执行telnet 目标主机IP 10050 nc -vz 目标主机IP 10050如果端口不通检查目标主机的防火墙firewall-cmd --permanent --add-port10050/tcp firewall-cmd --reload端口通了但还是灰色就要考虑Zabbix Agent的配置。Agent的配置文件/etc/zabbix/zabbix_agentd.conf里有几个关键项ServerZabbixServer的IP ServerActiveZabbixServer的IP Hostname主机名必须与前端的Host name一致这里最坑的就是Hostname。很多人在前端填主机名时随手写了一个“web-server-01”Agent配置里的Hostname却还是默认的Zabbix server结果是Agent起来了、端口也通了但Server不认这个主机名状态就一直灰色。前端的主机名和Agent的Hostname必须完全一致这是新手最容易忽略的。还有Agent的被动模式默认监听10050主动模式要连Server的10051端口。如果你只想用主动模式Agent主动上报那防火墙要放行的不是10050而是Server端的10051。这两个模式如果搞反了主机状态照样是灰色日志里会出现连接被拒绝的记录。排查时先看Agent日志/var/log/zabbix/zabbix_agentd.log里面有明确线索。2.2 监控项状态Not supported的处理方法监控项添加了但状态从“已启用”变成了“不支持”Not supported这是Zabbix使用过程中最多的问题。所谓Not supported就是Server在获取某个监控项的值时Agent返回了错误或者根本没有这个key。点开监控项的“最后一次数据”或者最近的“问题”通常会有具体的错误信息比如Cannot obtain item value或者更详细的zabbix_agentd [10050]: Check of parameter ... failed。最常见的场景是自定义key写错了。Zabbix自定义key的格式是key[参数1,参数2]在Agent配置文件里用UserParameter定义UserParametermytask.check,/usr/local/bin/check_task.sh然后前端监控项写mytask.check。问题出在几个地方第一Agent配置改了有没有重启systemctl restart zabbix-agent必须执行很多人改完配置不重启怎么折腾都是Not supported。第二脚本路径对不对UserParameter定义的是绝对路径脚本的可执行权限有没有chmod x漏掉的话脚本根本跑不起来。第三脚本是否依赖了环境变量Agent跑脚本是在非登录环境下脚本里如果用了source ~/.bashrc或者某个只有登录用户才有的环境变量执行就会失败。这个坑我踩过很多次解决方法是脚本开头写全/usr/bin/之类的绝对路径并且不依赖当前Shell环境变量。内建监控项Not supported也有规律agent.pingNot supported说明Agent进程挂了或者端口不通先重启Agent。system.cpu.load这类内建项也Not supported大概率是Agent版本和Server版本差太多比如Server是7.0Agent是4.0内建key的格式新版改了旧Agent不认识。vfs.fs.size[/]获取不到多半是权限问题某些系统需要Agent以root运行才能读取完整的文件系统信息。实操心得排查Not supported问题永远先看监控项最近一次的“错误信息”Zabbix会把失败原因写在里面。不要猜不要凭经验每次都直接点进去看基本问题就在错误信息里写得明明白白。2.3 SNMP设备监控超时或获取不到数据如果监控的是交换机、路由器、防火墙这类设备走的是SNMP协议。最常见的报错是Timeout while connecting to 192.168.1.1:161或者No Such Instance currently exists at this OID。超时的原因有四种可能。第一种设备的SNMP服务没开或者Community String写错了。Zabbix前端里主机类型要选择SNMP并填对Community比如public另外要注意SNMP版本选择v2c还是v3写错了也会超时。第二种防火墙拦了UDP 161端口。注意防火墙放行时要指定UDP协议只放TCP是不行的firewall-cmd --permanent --add-port161/udp firewall-cmd --reload第三种监控项的OID写错了。先在服务器上手动用snmpwalk验证snmpwalk -v 2c -c public 192.168.1.1 .1.3.6.1.2.1.1.1如果手动能取到值Zabbix里配置却超时那就是监控项的参数问题。第四种某些设备不走标准MIB厂商自定义的OID需要用snmpget验证。比如华为、H3C的设备CPU和内存的OID跟标准MIB不一样直接用标准模板会匹配不到。2.4 主动模式和被动模式的报错差异Zabbix Agent有主动、被动两种模式。被动模式是Server去连Agent的10050端口主动模式是Agent周期性地去Server的10051端口拉取监控项列表并上报数据。被动模式出问题上面的排查都覆盖了。主动模式容易出的报错是Agent日志里反复出现no server或connection refused。这通常意味着Agent配置里的ServerActive没有指向Server端地址或者Server端的10051端口没放行。还有一种是主动模式下监控项能取到数据但主机状态依然显示不可达。这个要分几个层面看主动模式下Agent是主动上报数据所以主机网络可达性检查icmp ping依然是Server独立执行的。如果主机禁ping状态就会显示红色但监控数据是正常的。解决办法是在前端主机配置里把“状态”和“可用性”分开判断或者主机配置里把这个IP的ICMP检查换成Agent pingagent.ping。3. 监控数据异常与数据库维护数据获取正常了接下来就是长期运维的事情。Zabbix跑久了数据库会变大监控项可能出现数据空洞图表偶尔会断线。这些问题不处理起初只是数据不好看时间长了整个监控平台可能直接崩掉。3.1 监控数据断断续续或历史数据丢失监控图表上数据时不时出现空白或者历史记录今天存在明天没有这通常是两类原因。第一类Agent主动模式下Server端处理能力不足。当监控的主机数量超过500台或者监控项总数超过2万默认配置可能扛不住。Zabbix Server的日志里会出现history syncer相关的耗时过高或者preprocessing worker繁忙。这时候需要调大 Zabbix Server 的StartPollers、StartPollersUnreachable、StartTrappers参数并合理设置CacheSize。这些参数调整后要重启Server才生效StartPollers160 StartPollersUnreachable40 StartTrappers20 CacheSize128M第二类数据库的InnoDB缓冲池太小。Zabbix对MySQL的压力大头在写入如果innodb_buffer_pool_size只有默认的128M数据量大一点就频繁刷盘导致写入延迟图表就会出现空洞。在/etc/my.cnf.d/zabbix.cnf里配置[mysqld] innodb_buffer_pool_size2G innodb_flush_log_at_trx_commit2 sync_binlog0注意innodb_flush_log_at_trx_commit2牺牲了极小的数据安全性换取了大幅度的写入性能提升对监控数据来说完全够用。这套配置改完重启MySQL图表断线的现象会明显改善。3.2 MySQL表碎片膨胀与housekeeper失效Zabbix跑几个月之后MySQL里的history和trends表会变得非常庞大即使设置过历史数据保留时间数据也没被及时清理。这通常不是Zabbix的bug而是MySQL的delete操作留下了大量碎片。Zabbix自带的housekeeper进程在Server的配置里控制HousekeepingFrequency1 MaxHousekeeperDelete5000但housekeeper再勤劳MySQL表碎片该整理还是要整理。长期运行的监控库建议定期执行OPTIMIZE TABLE history_log; OPTIMIZE TABLE history_str; OPTIMIZE TABLE history_text; OPTIMIZE TABLE history_uint; OPTIMIZE TABLE trends_uint;这些表都很大执行时间会很长建议放在凌晨低峰期跑而且一定是针对InnoDB表MyISAM表在OPTIMIZE期间会锁表。注意如果history表已经非常大几十GB直接执行OPTIMIZE会带来巨大的IO压力建议分两步第一步先删除过期数据第二步再执行OPTIMIZE。不要同时对所有大表操作一张一张来。3.3 磁盘空间被监控数据塞爆Zabbix的数据增长速度是很多运维没预料到的。一台主机几十个监控项每30秒采集一个值一天就是几万条记录。如果监控的主机多、保留时间长磁盘空间很快告急。判断是不是Zabbix数据占满磁盘用du -sh /var/lib/mysql/*如果history相关表占了几十个G说明保留周期设置太长或者采集频率太高。解决办法是调整前端“管理-常规-历史记录保留时间”把历史数据从默认的90天缩减到30天趋势数据可以保留365天不动。趋势数据是聚合过的占空间小得多。另外要养成习惯把MySQL的数据目录单独挂载到大容量磁盘别跟系统盘放在一起。Zabbix Server日志/var/log/zabbix/在调试模式下也会暴涨调试完记得把DebugLevel改回3我之前调试问题后忘了改回来150G日志把磁盘写满了差点把整个系统搞崩。3.4 时区导致监控数据时间轴偏移前面提到过PHP的时区问题但如果你用的是Docker方式部署时区问题还有另一层坑。Zabbix Server容器默认是UTC时区即使前端页面显示的是北京时间数据写入数据库的时间戳依然是UTC。排查这个问题的表现是告警时间和实际时间差了8小时图表横轴的时间也偏移。Docker部署时在docker-compose里设置环境变量environment: - PHP_TZAsia/Shanghai - TZAsia/Shanghai同时确保宿主机的/etc/localtime正确挂载进容器volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro改完重建容器然后到前端确认右上角用户设置里的时区也改成Asia/Shanghai。这一层是独立的用户设置默认可能是UTC需要单独改。4. 告警通知联动的排错经验Zabbix报警如果不能及时推出去监控系统等于白装。很多公司用钉钉、企业微信或者邮件接收告警这部分配置虽然有文档但实际踩坑率极高。尤其是7.0版本之后告警媒介的实现方式变化不小按老教程配置就很容易出问题。4.1 钉钉机器人收不到告警Zabbix 7.0开始官方推荐用Webhook方式来对接钉钉。用老版本的脚本方式alertscripts里调python脚本在新版本里还能用但已经不是最佳实践。最常见的“收不到告警”问题出现在自定义Webhook脚本的场景。如果你的告警动作配置正确、问题也触发了但钉钉群就是没消息按这个顺序排查第一看Zabbix Server的告警日志定位是否执行了脚本、执行是否报错。日志路径/var/log/zabbix/zabbix_server.log搜关键字alert或escalator会有很详细的记录。第二钉钉自定义机器人的安全设置。钉钉群里添加自定义机器人时可以选择“自定义关键词”、“加签”和“IP地址段”三种安全校验方式。Zabbix的默认Webhook脚本只支持加签方式而且需要把密钥填到Zabbix的媒介配置里。如果钉钉那边选了自定义关键词你的消息内容里没包含这个关键词消息就会被钉钉拦截。我遇到过一个人钉钉设置的是关键词“告警”但Zabbix发出的消息是纯英文和数字没有“告警”二字结果消息全被吞了。第三出方向网络问题。Zabbix Server必须能访问到钉钉的开放平台API。如果服务器在专线内网外网访问受限Webhook请求发出去了但没回包脚本在执行时表现为“无响应但未报错”。测试方法curl -X POST -H Content-Type: application/json \ -d {msgtype: text, text: {content: 测试}} \ 你的钉钉机器人WebhookURL如果curl也没反应那就是网络层面的问题跟Zabbix无关。想办法通过代理或者HTTP代理放行钉钉API的访问。4.2 告警脚本执行成功但消息内容为空钉钉消息能到但内容是一堆空变量或者乱码多半是告警脚本里引用的宏没有在Zabbix动作中正确传递。Zabbix的告警消息模板里有很多内置宏比如{ALERT.SUBJECT}、{ALERT.MESSAGE}、{ITEM.NAME}、{ITEM.LASTVALUE}等。在“管理-告警媒介类型-钉钉-消息模板”里要确保消息模板的“事件标题”和“事件内容”两个部分都填内容而且要用正确的大括号宏格式。有个经典BugZabbix 6.0之后动作里的“默认标题”如果为空Webhook脚本收到的就是空值钉钉群自然显示空白。解决办法是手动在消息模板里写完整内容主机{HOST.NAME} 告警{TRIGGER.NAME} 状态{TRIGGER.STATUS} 时间{DATE} {TIME} 当前值{ITEM.LASTVALUE}另外钉钉的markdown消息对空格和换行敏感。如果脚本里用的是markdown格式要检查消息内容里是否包含了不合法的制表符会被钉钉解析成特殊结构。遇到这种情况把消息格式改成text试试能定位是内容问题还是格式问题。4.3 邮件告警发不出去邮件告警是Zabbix最基础的告警方式但也是最让人头疼的。大部分Zabbix Server部署后没有本地的邮件服务sendmail/postfix没装告警脚本就报错sendmail: command not found。解决方案是使用外部SMTP服务器比如公司的企业邮箱SMTP或者用QQ邮箱、163邮箱的SMTP授权码。Zabbix 6.0以上版本自带了SMTP媒介不需要额外装sendmail。“管理-告警媒介类型-电子邮件”里配置SMTP服务器、端口、TLS方式和账号密码即可。如果配置了SMTP还是发不出去最常见的错误是525/535这类认证失败。原因是现在这些邮箱服务商都要求使用“授权码”而不是直接使用登录密码。你需要去邮箱设置里开启SMTP服务获取一串授权码填到Zabbix里。这个问题在163和QQ邮箱上极其常见几乎每一个因为我帮过的同事都会在这里卡住。还有一个小细节SMTP HELO字段不要留空填一个合法的域名有些服务器会因为HELO信息不合法而拒绝连接。比如填zabbix.yourdomain.com。5. 常见问题排查速查表到这里我把Zabbix安装、配置、使用中遇到的高频报错都拆解了一遍。为了方便你以后排错我把问题的现象、可能原因、解决思路做成一个速查表遇到问题先来这里对照。报错现象可能原因快速排查方法Access denied for user zabbixMySQL用户授权、密码错误、SELinux拦截手动用mysql命令登录验证再看zabbix_server.conf最后查SELinux日志前端页面404Nginx/Apache的root路径或PHP解析配置不对检查Web服务器配置确认root指向/usr/share/zabbix主机状态灰色Agent未连上、主机名不一致telnet 10050端口确认Agent配置中的Hostname与前端的Host name一致监控项Not supported自定义key错误、Agent未重启、版本不兼容点开监控项查看具体错误信息从Agent日志倒着查SNMP超时Community错误、UDP端口被墙、OID不匹配用snmpwalk手动验证OID是否能取到值告警脚本执行失败Webhook配置错误、网络不通、钉钉安全设置不匹配用curl测试webhook接口修复后再检查Zabbix告警日志数据空洞Poller数量不够、数据库写入瓶颈调整StartPollers参数优化MySQL的InnoDB配置时间偏移8小时PHP时区、Server容器时区、前端用户时区三层时区设置逐一检查历史数据不清理housekeeper效率低、表碎片调整HousekeepingFrequency定期OPTIMIZE大表邮件发不出去没有本地MTA、SMTP认证失败、HELO缺失配置外部SMTP使用授权码检查SMTP端口和认证方式6. 最后分享一点个人建议我处理Zabbix报错的经验里有一条最值钱永远先看日志。不管是/var/log/zabbix/zabbix_server.log、/var/log/zabbix/zabbix_agentd.log还是MySQL的错误日志报错信息永远比前端页面的提示更具体、更真实。Zabbix前端有时候只显示一个笼统的状态但日志里已经把根因写在第一行了。另一个建议是如果你在Zabbix 6.x和7.x之间版本跨度比较大很多旧教程里的配置就不再适用了。7.0之后媒介设置、模板机制、Agent配置文件都有些变化遇到问题先确认自己的版本再针对性搜索能少走很多弯路。这套报错集锦是基于我自己维护多套Zabbix监控环境的实际经验整理的没有覆盖你遇到的每一个问题毕竟Zabbix的报错形态实在太多但核心排查思路是通用的先确认链路通不通再看配置对不对最后查权限和版本兼容性。按这个顺序来绝大多数问题都能在半小时内定位到根因。
返回列表