一、基础监控方法
conf/tomcat-users.xml,添加具有manager-gui角色的用户(如<user username="admin" password="admin" roles="manager-gui"/>),然后访问http://<服务器IP>:8080/manager/html登录,可查看应用部署、会话数、请求处理时间等信息。bin/catalina.sh,添加以下配置启用JMX(无认证示例,生产环境建议开启认证):export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
使用JConsole或VisualVM连接<服务器IP>:9090,可监控内存使用、线程数、类加载、JDBC连接池等指标。通过Linux系统命令快速检查Tomcat运行状态:
ps -ef | grep tomcat,确认Tomcat进程是否存在;netstat -tuln | grep 8080(替换为Tomcat实际端口),确认端口是否监听;tail -f $TOMCAT_HOME/logs/catalina.out,实时查看Tomcat运行日志,快速定位错误。二、第三方监控工具(推荐)
https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar;jmx-exporter.yaml文件,定义需要采集的指标(如线程池、请求计数、会话数等)。示例配置:lowercaseOutputLabelNames: true
lowercaseOutputName: true
rules:
- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy)>'
name: tomcat_threadpool_$3
labels:
port: "$2"
protocol: "$1"
help: Tomcat thread pool $3
type: GAUGE
bin/catalina.sh,添加JMX Exporter代理参数:export JAVA_OPTS="$JAVA_OPTS -javaagent:/usr/local/prometheus/jmx_prometheus_javaagent-0.3.1.jar=9010:/usr/local/prometheus/jmx-exporter.yaml"
systemctl restart tomcat;prometheus.yml,添加Tomcat抓取任务:scrape_configs:
- job_name: 'tomcat'
static_configs:
- targets: ['<服务器IP>:9010']
企业级开源监控解决方案,支持Tomcat全方位监控(进程、端口、JVM内存、线程、请求响应时间等)。
zabbix_agentd.conf,设置Server和ServerActive为Zabbix Server IP;三、脚本监控与报警
编写Shell脚本定期检查Tomcat进程状态和接口可用性,异常时发送邮件报警。
tomcatMonitor.sh):#!/bin/bash
TOMCAT_NAME="apache-tomcat-8.5.6"
TOMCAT_HOME="/usr/local/$TOMCAT_NAME"
WEB_URL="http://localhost:8080/manager/status" # 替换为实际测试接口
EMAIL="admin@example.com"
LOG_FILE="/tmp/tomcatMonitor.log"
# 获取Tomcat进程ID
TOMCAT_PID=$(ps -ef | grep $TOMCAT_NAME | grep -v 'grep' | awk '{print $2}')
# 记录日志
echo "[$(date '+%F %H:%M:%S')] 开始监控Tomcat" >> $LOG_FILE
if [ -z "$TOMCAT_PID" ]; then
echo "[$(date '+%F %H:%M:%S')] Tomcat进程不存在,尝试重启..." >> $LOG_FILE
$TOMCAT_HOME/bin/startup.sh >> $LOG_FILE 2>&1
sleep 10
TOMCAT_PID=$(ps -ef | grep $TOMCAT_NAME | grep -v 'grep' | awk '{print $2}')
if [ -z "$TOMCAT_PID" ]; then
echo "[$(date '+%F %H:%M:%S')] Tomcat重启失败,发送报警邮件" >> $LOG_FILE
echo "Tomcat进程down,无法自动重启!" | mail -s "Tomcat报警" $EMAIL
else
echo "[$(date '+%F %H:%M:%S')] Tomcat重启成功,PID:$TOMCAT_PID" >> $LOG_FILE
fi
else
# 检查接口状态
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -m 10 --connect-timeout 10 $WEB_URL)
if [ "$HTTP_CODE" -ne 200 ]; then
echo "[$(date '+%F %H:%M:%S')] Tomcat接口异常(HTTP状态码:$HTTP_CODE),发送报警邮件" >> $LOG_FILE
echo "Tomcat接口异常,状态码:$HTTP_CODE!" | mail -s "Tomcat报警" $EMAIL
else
echo "[$(date '+%F %H:%M:%S')] Tomcat运行正常,PID:$TOMCAT_PID" >> $LOG_FILE
fi
fi
crontab -e添加每分钟执行一次脚本的任务:* * * * * /bin/bash /path/to/tomcatMonitor.sh
使用Supervisor监控Tomcat进程,进程挂掉后自动重启。
yum install epel-release -y
yum install supervisor -y
systemctl start supervisord
systemctl enable supervisord
/etc/supervisord.d/tomcat.ini:[program:tomcat]
command=/usr/local/apache-tomcat-8.5.6/bin/startup.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/tomcat.err.log
stdout_logfile=/var/log/tomcat.out.log
user=root
environment=JAVA_HOME="/usr/local/jdk1.8.0_161",CATALINA_HOME="/usr/local/apache-tomcat-8.5.6"
systemctl restart supervisord,即可自动守护Tomcat进程。