Tomcat 监控与管理
概述
没有监控的 Tomcat 就像盲人开车——只有出问题才知道,而且定位困难。Tomcat 的管理与监控有四个层次:JMX MBean(原生指标出口)、Manager 应用(运维操作)、Psi-Probe(可视化界面)、Prometheus 生态(规模化采集告警)。本文按这四条线展开,最后落到生产环境的监控体系搭建。
一、JMX:Tomcat 的原生指标出口
1.1 开启 JMX
Tomcat 内置 MBean 注册到 JMX,需在 JAVA_OPTS 开启远程 JMX:
bash
JAVA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9090 \
-Dcom.sun.management.jmxremote.rmi.port=9091 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.password.file=/opt/tomcat/conf/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/opt/tomcat/conf/jmxremote.access \
-Djava.rmi.server.hostname=10.0.0.11"生产环境务必开启认证与 SSL,并限制 JMX 端口访问范围;仅内网监控网段可达。
1.2 核心 MBean 域
Tomcat 的 MBean 以 Catalina: 为域前缀,常用对象:
| MBean 域 | 关键指标 | 说明 |
|---|---|---|
Catalina:type=GlobalRequestProcessor,name="http-nio-8080" | requestCount、errorCount、maxTime、processingTime | 连接器总请求量与耗时 |
Catalina:type=ThreadPool,name="http-nio-8080" | currentThreadCount、currentThreadsBusy、maxThreads | 线程池水位 |
Catalina:type=Connector,port="8080" | maxThreads、acceptCount、connectionCount | 连接器参数与连接数 |
Catalina:type=Manager,host=localhost,context=/app | activeSessions、expiredSessions、maxActive | 会话统计 |
Catalina:type=GlobalRequestProcessor | 各应用请求统计 | 应用维度 |
1.3 命令行访问
bash
# jconsole / jvisualvm 图形访问
jconsole 10.0.0.11:9090
# jmxterm 命令行脚本化
# 或直接用 jstat/jmap 访问 JVM 层
jstat -gcutil 12345 1000 # GC 统计每秒刷新二、Manager 应用:运维操作台
2.1 启用与授权
Tomcat 自带 /manager(部署管理)与 /host-manager(虚拟主机管理)。配置 conf/tomcat-users.xml:
xml
<role rolename="manager-gui" />
<role rolename="manager-script" />
<role rolename="manager-jmx" />
<role rolename="manager-status" />
<role rolename="admin-gui" />
<user username="ops" password="xxxxx"
roles="manager-gui,manager-script,manager-status" />| 角色 | 权限 |
|---|---|
manager-gui | HTML 界面:部署、卸载、启动停止、会话查看 |
manager-script | 纯文本/API 操作,供脚本调用 |
manager-status | 只读查看服务器状态 |
manager-jmx | JMX 代理访问 |
2.2 常用管理操作
bash
# 列出已部署应用
curl -u ops:xxxxx "http://localhost:8080/manager/text/list"
# 部署(上传 WAR)
curl -u ops:xxxxx -F "deployWar=@order.war" \
"http://localhost:8080/manager/text/deploy?path=/order"
# 停止 / 启动 / 卸载
curl -u ops:xxxxx "http://localhost:8080/manager/text/stop?path=/order"
curl -u ops:xxxxx "http://localhost:8080/manager/text/start?path=/order"
curl -u ops:xxxxx "http://localhost:8080/manager/text/undeploy?path=/order"
# 服务器状态(文本)
curl -u ops:xxxxx "http://localhost:8080/manager/status"2.3 安全加固
- 不需要管理功能时删除
webapps/manager与webapps/host-manager - 必须保留时:绑定内网 IP、启用强密码、定期更换
manager-script的 API 调用走 HTTPS 并加来源 IP 白名单(RemoteAddrValve)
三、Psi-Probe:可视化监控界面
Psi-Probe(原 Tomcat Probe)是开源的 Tomcat 监控工具,弥补 Manager 界面简陋的短板,部署为一个独立 Web 应用。
3.1 部署方式
将 psi-probe.war 放入 webapps/,并在 tomcat-users.xml 授予角色:
xml
<user username="monitor" password="xxxxx"
roles="manager-gui,manager-script,manager-jmx,manager-status,probe" />3.2 核心功能
| 功能 | 说明 |
|---|---|
| 实时状态 | 连接器流量、线程池、内存、GC 图表 |
| 会话管理 | 活跃会话列表、过期操作 |
| 应用管理 | 各应用的部署信息、类加载器层级、Servlet 列表 |
| 数据源监控 | 连接池使用率、空闲/活跃连接 |
| 日志查看 | 在线查看 catalina.out 等日志 |
| 告警 | 内存/线程阈值告警邮件 |
Psi-Probe 适合单机或小规模的日常巡检;规模上来后,指标采集应交给 Prometheus。
四、Prometheus + Grafana:规模化监控
4.1 指标采集方案
| 方案 | 方式 | 说明 |
|---|---|---|
| JMX Exporter | 独立进程读 JMX,暴露 HTTP 指标 | 通用、无需改代码 |
| Micrometer + Prometheus 注册表 | 应用内埋点 | 需应用接入依赖 |
| 访问日志采集 | Filebeat/Promtail 采集 access log | 请求维度分析 |
4.2 JMX Exporter 接入
yaml
# jmx_exporter_config.yml(采集规则)
rules:
- pattern: 'Catalina<type=GlobalRequestProcessor, name=(\S+)><>(requestCount|errorCount|processingTime)'
name: tomcat_$2
labels:
processor: "$1"
help: "Tomcat $2"
- pattern: 'Catalina<type=ThreadPool, name=(\S+)><>(currentThreadCount|currentThreadsBusy|maxThreads)'
name: tomcat_threadpool_$2
labels:
pool: "$1"bash
# 启动 JMX Exporter
java -jar jmx_prometheus_javaagent.jar 9099:jmx_exporter_config.yml
# 验证指标
curl http://localhost:9099/metrics | grep tomcat_4.3 Prometheus 抓取配置
yaml
scrape_configs:
- job_name: 'tomcat'
static_configs:
- targets:
- '10.0.0.11:9099'
- '10.0.0.12:9099'
labels:
env: 'prod'4.4 关键告警规则
yaml
groups:
- name: tomcat-alerts
rules:
# 线程池打满
- alert: TomcatThreadsExhausted
expr: tomcat_threadpool_currentThreadsBusy / tomcat_threadpool_maxThreads > 0.9
for: 5m
annotations:
summary: "Tomcat 线程池使用率超过 90%"
# 请求错误率
- alert: TomcatErrorRateHigh
expr: sum(rate(tomcat_requestCount_total{processor=~".*"}[5m])) > 0
and sum(rate(tomcat_errorCount_total[5m])) / sum(rate(tomcat_requestCount_total[5m])) > 0.05
for: 5m
# 活跃会话异常增长
- alert: TomcatSessionsSurge
expr: tomcat_sessions_activeSessions > 50000
for: 10m4.5 核心监控指标看板
| 指标 | 含义 | 关注阈值 |
|---|---|---|
| 请求量 QPS | rate(requestCount[5m]) | 与容量模型对比 |
| 错误率 | errorCount / requestCount | 正常接近 0 |
| 响应耗时 P99 | processingTime / requestCount | 与 SLO 对比 |
| 线程使用率 | currentThreadsBusy / maxThreads | 持续 >80% 告警 |
| 活跃会话 | activeSessions | 突增可能泄漏 |
| GC 指标 | JVM exporter 的 gc 系列 | Full GC 频率 |
五、监控体系搭建总览
Tomcat(JMX)
├── JMX Exporter ──▶ Prometheus ──▶ Grafana 看板
│ └──▶ AlertManager ──▶ 钉钉/邮件/企业微信
├── Manager App ──▶ 运维脚本 / CI/CD 部署
├── Psi-Probe ──▶ 人工巡检界面
└── 访问日志 ──▶ ELK/Loki ──▶ 请求链路分析落地优先级:
- 先有数据:JMX Exporter + Prometheus + Grafana 基础看板
- 再有告警:线程池、错误率、GC、会话数四条基础告警
- 再求精细:访问日志分析、容量模型、压测基线
六、常见监控问题排查
| 现象 | 原因 | 处理 |
|---|---|---|
| JMX 连不上 | 防火墙/rmi 端口未开放 | 检查 9090/9091 端口与 java.rmi.server.hostname |
| 指标不更新 | JMX Exporter 规则不匹配 | 用 jconsole 对照实际 MBean 名修正规则 |
| Manager 403 | 角色未配置或 IP 被限 | 检查 tomcat-users.xml 与 Valve |
| Prometheus 抓取超时 | 指标太多或抓取间隔过短 | 加大 scrape_timeout、拆分 job |
| 告警风暴 | 阈值过敏感或未去重 | 合理设置 for 时长与分组 |
参考链接: