Zabbix监控Tomcat与Java微服务应用实践完整指南
前言
在Java企业级应用架构中,Tomcat作为主流Servlet容器承载着大量Web应用,而基于Spring Boot等框架构建的Java微服务则逐渐成为新一代应用部署的主流形态。对这两类Java应用进行有效的性能监控,是保障业务系统稳定运行的关键。
Zabbix提供了完善的Java监控方案:通过Java Gateway + JMX协议实现对Tomcat的监控,通过自定义脚本 + Zabbix Sender实现对微服务的自动发现与监控。本文将分别详细介绍这两种监控方案的完整部署流程。
一、实验环境说明
| 组件 | 配置 |
|---|---|
| Tomcat服务器 | 麒麟V10(IP: 192.168.38.33) |
| 微服务服务器 | 麒麟V10(IP: 192.168.38.34) |
| Zabbix Server | 192.168.38.30 |
| Zabbix Java Gateway | 已部署,端口10052 |
| Tomcat JMX端口 | 12345 |
| Java版本 | OpenJDK 11 |
二、整体架构与数据流程
Zabbix监控Java应用的整体数据流程如下:

核心组件说明:
| 组件 | 作用 | 端口 |
|---|---|---|
| Zabbix Java Gateway | 充当Zabbix Server与Java应用之间的桥梁 | 10052 |
| Java Poller | Zabbix Server端的采集进程,连接Java Gateway | - |
| JMX Agent | Java应用端暴露的管理接口 | 12345(可配置) |
当Zabbix Server需要获取Java应用的性能指标时,会启动Java Poller进程连接Java Gateway,Java Gateway再通过JMX管理API向Java应用程序发起查询。Java应用程序需在启动时开启JMX远程访问功能,并暴露一个固定端口供Java Gateway连接。

三、监控Tomcat应用
3.1 配置Tomcat JMX远程访问
在需要监控的Tomcat服务器上,编辑Tomcat启动脚本 catalina.sh,在文件开头或JAVA_OPTS配置区域加入以下JMX参数:
CATALINA_OPTS="-server \
-Xms256m \
-Xmx512m \
-XX:PermSize=64M \
-XX:MaxPermSize=128m \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=192.168.38.33 \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.rmi.port=12345"
⚠️ 关键配置说明:
参数 说明 注意事项 -Dcom.sun.management.jmxremote开启JMX远程管理功能 必选 -Dcom.sun.management.jmxremote.port=12345指定JMX监听端口 需确保端口未被占用 -Djava.rmi.server.hostname=192.168.38.33指定服务器IP 必配! 否则会导致RMI连接失败 -Dcom.sun.management.jmxremote.authenticate=false关闭认证(测试环境) 生产环境建议启用认证 -Dcom.sun.management.jmxremote.ssl=false关闭SSL(测试环境) 生产环境建议启用SSL
生产环境安全建议:
# 启用认证和SSL的配置示例
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.password.file=/etc/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/etc/jmxremote.access
配置完成后,启动Tomcat服务:
[root@tomcat-server ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/lib/jvm/java-11
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar
Tomcat started.
3.2 验证JMX端口是否正常监听
[root@tomcat-server ~]# netstat -tlnp | grep 12345
tcp6 0 0 :::12345 :::* LISTEN 12345/java
3.3 部署Zabbix Java Gateway
Zabbix Java Gateway是Zabbix官方提供的Java应用数据采集中间件,监听10052端口。
验证Java Gateway是否正常运行:
[root@zabbix-server ~]# netstat -tlnp | grep 10052
tcp6 0 0 :::10052 :::* LISTEN 1234/java
3.4 配置Zabbix Server连接Java Gateway
修改Zabbix Server配置文件(容器部署已预配置),主要参数如下:
# /etc/zabbix/zabbix_server.conf
# Java Gateway地址
JavaGateway=192.168.38.30
# Java Gateway端口
JavaGatewayPort=10052
# Java Poller进程数量(根据监控的Java应用数量调整)
StartJavaPollers=5
配置完成后重启Zabbix Server:
[root@zabbix-server ~]# systemctl restart zabbix-server
3.5 Zabbix Web端配置JMX监控
3.5.1 为主机添加JMX接口
-
登录Zabbix Web管理界面
-
进入 数据采集(Data collection) → 主机(Hosts)
-
选择Tomcat目标主机(192.168.38.33)
-
切换到 接口(Interfaces) 区域,点击 添加(Add)
-
接口类型选择 JMX
-
填写IP地址:
192.168.38.33,端口:12345
如下图所示:

3.5.2 链接监控模板
-
进入主机详情页,切换到 模板(Templates) 选项卡
-
点击 链接新模板(Link new templates)
-
搜索并勾选以下两个模板:
-
Apache Tomcat by JMX —— Tomcat专用监控模板
-
Generic Java JMX —— Java通用JMX监控模板
-
-
点击 更新(Update) 保存配置
如下图所示:

3.6 Tomcat监控指标解读
链接模板后,Zabbix会自动采集以下核心指标:
| 监控类别 | 监控项 | 说明 | 监控意义 |
|---|---|---|---|
| 堆内存 | Heap Memory Usage | JVM堆内存使用量 | ⚠️ 核心指标,接近上限需扩容 |
| 非堆内存 | Non-Heap Memory Usage | 方法区/元空间使用量 | 监控类加载情况 |
| 线程数 | Thread Count | 当前活动线程数 | 监控线程泄漏风险 |
| 类加载 | Loaded Class Count | 已加载类数量 | 监控类加载器状态 |
| GC次数 | GC Collection Count | GC发生次数 | 评估GC频率是否合理 |
| GC时间 | GC Collection Time | GC总耗时 | ⚠️ 长时间GC需排查 |
| 会话数 | Active Sessions | 活跃Session数量 | 监控用户在线情况 |
| 请求处理 | Request Processing Time | 请求处理耗时 | 反映应用响应性能 |
| 连接器状态 | Connector Status | 连接器线程池状态 | 监控连接处理能力 |
四、监控Java微服务
4.1 微服务监控面临的挑战
微服务架构具有以下特点,给传统监控带来挑战:
| 特点 | 监控挑战 |
|---|---|
每个微服务以 java -jar service.jar 方式独立运行 | 不依赖Tomcat,无法通过Tomcat模板监控 |
| 每台服务器上的微服务数量不固定 | 手工添加/删除主机配置非常繁琐 |
| 微服务端口动态分配 | 端口管理混乱,难以静态配置 |
解决方案:采用 自动发现(Discovery) + Zabbix Sender 的方式实现动态监控。
4.2 整体监控架构

4.3 安装必要工具
4.3.1 安装JDK开发工具(提供jstat、jps)
[root@ms-server ~]# yum install -y java-11-openjdk-devel
验证工具是否可用:
[root@ms-server ~]# jps -l
12345 /opt/services/user-service.jar
12346 /opt/services/order-service.jar
12347 /opt/services/payment-service.jar
4.3.2 安装Zabbix Sender工具
从Zabbix官方仓库下载并安装zabbix-sender:
[root@ms-server ~]# cd /tmp
[root@ms-server tmp]# wget http://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-sender-6.4.2-release2.el9.x86_64.rpm
[root@ms-server tmp]# rpm -ivh zabbix-sender-6.4.2-release2.el9.x86_64.rpm
验证安装:
[root@ms-server ~]# zabbix_sender --version
zabbix_sender (Zabbix) 6.4.2
4.4 自定义监控脚本
4.4.1 脚本功能介绍
本文使用 jstat.py 脚本实现对微服务的全面监控。脚本主要功能:
| 参数 | 功能 | 输出 |
|---|---|---|
--jvmname | 获取当前所有运行中的JVM进程名称 | 进程列表(JSON格式) |
--jvmport | 获取JVM进程端口信息 | 端口列表(JSON格式) |
--data | 采集所有JVM性能指标并通过zabbix_sender发送 | 发送状态 |
脚本内容较长,请从课程附件中获取完整文件,或联系作者获取。
4.4.2 部署监控脚本
创建脚本目录并上传脚本:
[root@ms-server ~]# mkdir -p /etc/zabbix/scripts/java
[root@ms-server ~]# cp jstat.py /etc/zabbix/scripts/java/
[root@ms-server ~]# chmod +x /etc/zabbix/scripts/java/jstat.py
[root@ms-server ~]# chown -R zabbix:zabbix /etc/zabbix/scripts/
验证脚本是否可用:
[root@ms-server ~]# python /etc/zabbix/scripts/java/jstat.py --jvmname
["user-service","order-service","payment-service"]
[root@ms-server ~]# python /etc/zabbix/scripts/java/jstat.py --data
Sending data to Zabbix Server: 192.168.38.30
Data sent successfully: 45 items
4.5 配置Zabbix Agent 2
4.5.1 创建自定义监控项配置文件
在 /etc/zabbix/zabbix_agent2.d/ 目录下创建 userparameter_java_discovery.conf 文件:
# 获取JVM进程名称列表(用于自动发现)
UserParameter=jvmname, sudo /usr/bin/python /etc/zabbix/scripts/java/jstat.py --jvmname
# 获取并发送JVM性能数据
UserParameter=jvmdata, sudo /usr/bin/python /etc/zabbix/scripts/java/jstat.py --data
4.5.2 配置Zabbix用户sudo权限
脚本需要以zabbix用户身份执行,但需要获取系统中所有Java进程信息,因此必须配置sudo权限:
[root@ms-server ~]# visudo
在文件末尾添加以下内容:
zabbix ALL=(ALL) NOPASSWD: ALL
安全建议:如果希望权限最小化,可精确限制命令:
zabbix ALL=(ALL) NOPASSWD: /usr/bin/python /etc/zabbix/scripts/java/jstat.py
4.5.3 确认Agent配置
确保 /etc/zabbix/zabbix_agent2.conf 中以下配置正确:
PidFile=/var/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=192.168.38.30
ServerActive=192.168.38.30
Hostname=192.168.38.34
Include=/etc/zabbix/zabbix_agent2.d/*.conf
4.5.4 重启Agent服务
[root@ms-server ~]# systemctl restart zabbix-agent2
[root@ms-server ~]# systemctl status zabbix-agent2
● zabbix-agent2.service - Zabbix Agent 2
Loaded: loaded (/usr/lib/systemd/system/zabbix-agent2.service; enabled)
Active: active (running) since ...
4.6 导入微服务监控模板
4.6.1 模板功能说明
自定义模板 Template Jvm Process Discovery.xml 的核心功能:
| 功能模块 | 说明 |
|---|---|
| 自动发现规则 | 自动发现服务器上所有JVM进程 |
| 监控原型 | 为每个发现的JVM自动创建CPU、内存、GC等监控项 |
| 触发器原型 | 自动生成内存溢出、GC频繁等告警规则 |
| 图形原型 | 自动生成JVM性能趋势图 |
4.6.2 导入模板
-
登录Zabbix Web管理界面
-
进入 数据采集(Data collection) → 模板(Templates)
-
点击右上角 导入(Import) 按钮
-
选择模板文件
Template Jvm Process Discovery.xml -
确保所有规则选项均已勾选
-
点击 导入(Import) 完成操作如下图所示:
如下图所示:

4.7 链接模板到主机
-
进入 数据采集(Data collection) → 主机(Hosts)
-
选择微服务目标主机(192.168.38.34)
-
切换到 模板(Templates) 选项卡
-
点击 链接新模板(Link new templates)
-
搜索并选择 Template Jvm Process Discovery
-
点击 更新(Update) 保存配置
如下图所示:

4.8 验证监控数据
4.8.1 检查自动发现结果
-
进入 数据采集(Data collection) → 主机(Hosts)
-
选择微服务主机,点击 自动发现(Discovery)
-
查看是否自动发现了所有JVM进程
4.8.2 检查性能数据
-
进入 监控(Monitoring) → 最新数据(Latest data)
-
筛选主机 192.168.38.34
-
查看是否有各微服务的CPU、内存、GC等监控数据
4.8.3 命令行验证
# 测试JVM自动发现
zabbix_get -s 192.168.38.34 -k "jvmname"
# 测试数据采集与发送
zabbix_get -s 192.168.38.34 -k "jvmdata"
五、监控指标详解
5.1 微服务核心监控指标
| 指标类别 | 指标项 | 采集方式 | 告警意义 |
|---|---|---|---|
| 堆内存使用 | Heap Used | jstat | ⚠️ 接近-Xmx需扩容 |
| 堆内存使用率 | Heap Usage % | 计算 | ⚠️ 持续>80%需关注 |
| GC次数 | GC Count | jstat | 频繁GC表示内存压力大 |
| GC时间 | GC Time | jstat | ⚠️ 耗时长影响响应速度 |
| 线程数 | Thread Count | jstat | 异常增长可能有线程泄漏 |
| 类加载数 | Loaded Classes | jstat | 异常增长可能热部署问题 |
| CPU使用率 | CPU Usage | jstat | ⚠️ 持续高位需排查代码 |
| 进程存活 | Process Alive | 检测 | 立即告警 |
5.2 常见触发条件配置
# 建议的触发条件示例
- JVM堆内存使用率 > 90%: 严重告警
- JVM堆内存使用率 > 80%: 警告告警
- Full GC频率 > 5次/10分钟: 严重告警
- GC总时间 > 1000ms/分钟: 警告告警
- JVM进程消失: 灾难告警
- CPU使用率 > 200%: 警告告警(多核)
六、常见问题排查
6.1 Tomcat监控常见问题
| 问题现象 | 排查步骤 |
|---|---|
| JMX端口未监听 | 检查catalina.sh配置是否正确,查看Tomcat启动日志 |
| Java Gateway连接失败 | 检查Zabbix Server的JavaGateway配置,确认10052端口连通性 |
| 监控数据为空 | 检查Java Poller进程是否启动:ps aux | grep java_poller |
| RMI连接超时 | 确认-Djava.rmi.server.hostname配置了正确的IP地址 |
快速诊断命令:
# 检查Java Poller日志
tail -f /var/log/zabbix/zabbix_server.log | grep -i java
# 检查JMX连接是否可用
jconsole 192.168.38.33:12345
6.2 微服务监控常见问题
| 问题现象 | 排查步骤 |
|---|---|
| 无JVM发现数据 | 检查jps命令是否可用:which jps |
| 脚本执行失败 | 手动执行脚本查看报错:python /etc/zabbix/scripts/java/jstat.py --jvmname |
| 权限被拒绝 | 检查sudo配置是否正确:sudo -u zabbix jps |
| 数据未发送到Server | 检查zabbix_sender是否安装,Server地址配置是否正确 |
日志排查:
# 查看Agent日志
tail -f /var/log/zabbix/zabbix_agent2.log
# 查看脚本执行日志(如果脚本中有日志输出)
tail -f /var/log/zabbix/zabbix_java.log
七、性能优化建议
7.1 Tomcat JVM参数优化
# 生产环境推荐配置
CATALINA_OPTS="-server \
-Xms2048m -Xmx2048m \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:G1ReservePercent=25 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.port=12345 \
-Djava.rmi.server.hostname=192.168.38.33"
7.2 微服务JVM参数优化
# 微服务启动参数示例
java -server \
-Xms512m -Xmx512m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=0 \
-jar /opt/services/user-service.jar
7.3 Zabbix Poller性能优化
| 参数 | 建议值 | 说明 |
|---|---|---|
| StartJavaPollers | 5-20 | 根据Java应用数量调整 |
| JavaGateway | 配置内网IP | 避免跨网段延迟 |
| 采集间隔 | 60s | 避免过于频繁采集影响JVM性能 |
八、总结
本文详细介绍了两种Java应用监控方案:
Tomcat监控(JMX方案):
-
通过配置JMX参数暴露管理接口
-
利用Zabbix Java Gateway进行数据采集
-
使用官方模板实现标准化监控
微服务监控(自动发现方案):
-
通过jstat脚本采集JVM性能数据
-
利用自动发现规则动态识别微服务进程
-
通过Zabbix Sender主动上报数据
-
实现灵活增减微服务无需手工维护
两种方案相互补充,共同构建了完整的Java应用监控体系。在实际生产环境中,建议结合业务特点选择适合的方案,并配置合理的告警规则,实现对Java应用的主动运维。
📌 相关文章推荐:
《Zabbix监控MySQL与Redis应用实践》
《Zabbix监控Nginx+PHP-FPM应用实践》
《Zabbix监控Apache与Nginx应用实践》
如需要脚本和模板文件,请在评论区留言或私信联系。感谢阅读!
原创文章,转载请注明出处。
更多推荐
所有评论(0)