Zabbix Agent2(v6.0+)原生内置插件仅支持docker、postgresql、mysql、kafka(需JMX启用)、redis;其余中间件如Nginx、Tomcat等需通过system.run或自定义插件实现监控。

Zabbix Agent2 能直接监控中间件,前提是中间件提供可访问的指标接口(如 HTTP API、TCP 端口响应、本地 socket 或 CLI 输出),且 Agent2 有对应插件或可通过 system.run 安全调用。它不是万能采集器,不自带对所有中间件的开箱即用支持。
Agent2 自带插件能监控哪些中间件
Zabbix Agent2(v6.0+)原生支持的中间件插件有限,目前明确内置的只有:docker、postgresql、mysql、kafka(需 Kafka Broker 启用 JMX)、redis(通过 TCP 连接 + RESP 协议交互)。其他如 Nginx、Tomcat、ZooKeeper、Elasticsearch 等,Agent2 默认不带专用插件。
常见误区是以为“装了 Agent2 就能自动监控 Redis”,其实必须满足两个条件:一是配置中启用了 redis 插件(默认可能禁用),二是 redis.conf 允许本地连接(bind 127.0.0.1 + protected-mode no 或配密码)。
-
zabbix_agent2.conf中需取消注释并配置插件段,例如:Plugins.Redis.Endpoint = "127.0.0.1:6379" Plugins.Redis.Password = "mypass"
- 插件键值固定,如获取 Redis 内存使用:
redis.mem.used[];查连接数:redis.clients.connected[] - PostgreSQL 插件依赖
libpq库,若报错failed to load plugin "postgresql",说明系统缺少postgresql-libs包
没有插件时,用 system.run 安全采集中间件指标
当 Agent2 没有对应插件(比如监控 Nginx stub_status、ZooKeeper mntr、或自定义 Python 脚本输出),最常用也最可控的方式是走 system.run,但必须严格限制执行权限和超时。
关键点不是“能不能跑命令”,而是“怎么防失控”:
- 在
zabbix_agent2.conf中显式启用:EnableRemoteCommands=1 UnsafeUserParameters=0
(UnsafeUserParameters=0是安全前提,否则无法用system.run) - 避免在
UserParameter中直接写curl或echo—— 改用封装脚本,例如:UserParameter=nginx.active.conn,/usr/local/bin/zbx_nginx_conn.sh
- 脚本内必须设硬超时:
timeout -s KILL 3s curl -s http://127.0.0.1/nginx_status 2>/dev/null | awk '/Active/ {print $3}' - 禁止脚本中出现
rm、dd、变量未引号包裹等高危操作;所有路径用绝对路径,不依赖$PATH
主动模式下 system.run 的间隔与性能陷阱
如果监控项类型设为 Zabbix agent (active),system.run 命令会在 Agent 进程内执行,但不会自动继承 Timeout 配置 —— 它只受全局 Timeout=4(秒)约束。一旦被监控服务响应慢(如 ZooKeeper mntr 在集群脑裂时卡住),整个 Agent 主动上报线程会阻塞,导致后续所有指标延迟甚至丢失。
解决方法很实际:
- 对所有
system.run类型监控项,手动在 Web UI 的“更新间隔”里设为 ≥15s,避免高频重试加重压力 - 不要把多个中间件指标塞进同一个脚本里返回多行 —— Zabbix 不解析多行输出,只会取第一行。应拆成多个独立
UserParameter - Redis 插件本身已做连接池复用,比反复
system.run redis-cli更轻量;MySQL 插件比system.run mysql -e "SELECT ..."少一次进程 fork 开销
为什么 Docker 插件能直接用而 Kafka 不行
Docker 插件工作原理是直连 /var/run/docker.sock UNIX socket,无需认证、无网络开销、响应极快;Kafka 插件则依赖 JMX RMI,而 JMX 默认绑定 localhost 且启用 SSL 和认证,Agent2 的 Kafka 插件目前不支持 SSL client auth 或动态 JMX URL 发现。
所以实际部署中:
- Docker 监控开箱即用,只要
zabbix用户在docker组里:usermod -aG docker zabbix
- Kafka 若强行用插件,得关闭 JMX 认证、改
com.sun.management.jmxremote.host=0.0.0.0(不推荐),更稳妥的是用system.run调jmxterm或暴露 Prometheus Exporter 再由 Zabbix 抓取 - 所有插件的
Endpoint配置项(如Plugins.Redis.Endpoint)不支持环境变量展开,不能写成"${REDIS_HOST}:6379",必须硬编码或靠部署工具注入


















