一、基礎監控方法
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進程。