服务器上Tomcat启动不了,九成以上是端口被占用、JAVA_HOME没配好、启动脚本没权限、内存不够或者某个配置文件写错了,而定位问题唯一的正确姿势不是瞎猜,是打开日志看报错。
tomcat启动失败怎么排查?先看日志别乱猜
Tomcat最讲道理,它起不来一定会写日志,错在哪儿基本都写在日志里,很多人习惯先检查端口、再检查防火墙、再重启机器,折腾一圈回来发现还是起不来,其实第一步就该去logs目录翻日志。
看哪个日志文件?Tomcat的logs下面通常有这几个关键文件:
catalina.out:标准输出和错误输出汇总,最常看的就是它catalina.<日期>.log:Tomcat自身运行日志,按天滚动localhost.<日期>.log:应用部署和Servlet初始化相关的日志manager.<日期>.log:Host Manager界面的操作记录
怎么快速定位?启动失败的时候,去logs目录执行这条命令:
tail -50 catalina.out
看到SEVERE、Exception、Error这些词,往上一翻几行,基本就是根因,还有一种情况是日志停在某一句话后不再往下走,比如卡在Deploying web application archive,说明是应用解压或者初始化出了问题,那就得去看localhost.<日期>.log。
如果日志文件里啥都没有呢?那就跑一次前台启动,进到Tomcat的bin目录,执行:
./catalina.sh run
这会把所有报错直接怼到屏幕上,比翻日志还直观,前台启动是排查tomcat启动失败最直接的手段,这个方法在大多数排障场景里都能用上。
tomcat端口被占用:最常碰到的启动卡壳原因
这是tomcat启动失败的原因里最常见的一个,启动时如果报Address already in use或者Port 8080 required by Tomcat is already in use,说明8080端口被别人占了,占端口的往往有三种情况:上一次的Tomcat没完全杀掉、别的Web服务用了同一个端口、或者你自己改了server.xml但没保存成功。
tomcat端口被占用怎么解决?两个思路
第一个思路:把占用端口的进程干掉。Linux上先查谁在占用:
ss -lntp | grep 8080
或者用老的netstat指令:
netstat -tlnp | grep 8080
找到PID之后杀掉,再重新启动Tomcat,Windows上对应的命令是:
netstat -ano | findstr :8080 taskkill /PID <进程号> /F
第二个思路:换一个端口。如果你的服务器上还有Nginx、Spring Boot应用或者其他服务已经在用8080,那换个端口更稳妥,改conf/server.xml里Connector的port属性即可,注意这里有个坑:server.xml里的8080、8009(AJP端口)、8005(SHUTDOWN端口)如果被系统改了别的地方,最好都确认一遍,三个端口不能互相冲突。
一个常见场景得提一下。用Nginx做反向代理转发到Tomcat的时候,改动Tomcat端口之后,记得把Nginx配置里的proxy_pass对应端口一起改掉,经常有人改了Tomcat端口,Nginx没同步,然后页面直接502。
JAVA_HOME没配好:Tomcat找不到Java就罢工
Tomcat是纯Java写的,启动全靠JVM,它启动的时候会去读环境变量里的JAVA_HOME或JRE_HOME,找不到就直接撂挑子,典型的报错是:
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
这在服务器上非常常见,特别是刚装好JDK就急着部署Tomcat的场景,解决办法很朴素,编辑/etc/profile或~/.bashrc,加上环境变量,然后source一下让配置立即生效:
export JAVA_HOME=/usr/local/jdk-17 export PATH=$JAVA_HOME/bin:$PATH
检查是否生效,执行echo $JAVA_HOME。
还有一种情况更隐蔽:JAVA_HOME配了,但版本不对。Tomcat 10及以上要求JDK 11起步,Tomcat 8.5和Tomcat 9用JDK 8就行,如果你装了Tomcat 10,环境变量却指向JDK 8,启动时会报UnsupportedClassVersionError或直接提示Unsupported major.minor version,行业共识认为,JDK版本和Tomcat版本不匹配导致启动失败的案例,在服务器运维新手手里占了相当大的比例,查这个问题,执行java -version看一下当前Java版本,再对照你Tomcat的版本号就知道问题出在哪儿了。
linux服务器tomcat启动不了?权限问题别忽略
不少linux服务器tomcat启动不了,不是配置问题,是脚本和目录的权限不对。典型报错有两种。
第一种:Permission denied。执行./startup.sh的时候直接提示没有权限,这是因为脚本没有可执行权限,给它加上就行:

chmod +x bin/.sh
注意不光是startup.sh和shutdown.sh,bin目录下所有.sh脚本建议都加上执行权限。
第二种:/bin/bash^M: bad interpreter。报错消息里带一个^M,这是典型的Windows换行符问题,很多人在Windows上编辑过脚本,再上传到Linux服务器上跑,就会被这个坑卡住,解决办法是把文件的换行符转成Unix格式:
sed -i 's/r$//' bin/.sh
或者用dos2unix工具直接转换。
还有一个容易忽略的:目录所有权。Tomcat运行时需要往logs、work、temp、conf目录里写文件,如果这些目录的属主不是当前启动用户,启动过程会卡在初始化阶段,或者日志写不进去导致catalina.out是空的,看一眼目录属主:
ls -ld logs work temp conf
如果不是tomcat用户所有,就执行:
chown -R tomcat:tomcat /opt/tomcat
这里顺带提一句,别图省事用root用户跑Tomcat,真被入侵了损失的是整台服务器,权限这件事还是严肃对待。
内存不够:Tomcat进程还没爬起来就被系统杀了
内存不足导致的tomcat启动失败,症状很有迷惑性:执行了startup.sh,没有任何报错,但ps -ef | grep tomcat一看,进程不见了,这种情况多半是Linux的OOM Killer把Tomcat进程给杀了。
怎么确认是OOM?执行:
dmesg | tail -30
看到输出里有Out of memory或者Killed process关键词,基本就实锤了,除了物理内存本身吃紧,更常见的是JVM自己设置的堆内存太大了,改Tomcat的内存配置,编辑bin/catalina.sh,找到JAVA_OPTS那一行,按服务器的实际内存来调:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"
云服务器内存低于2GB的机器,这个配置算是比较稳妥的,最好不要一上来就-Xmx2048m,另外Tomcat创建的线程栈也需要占用内存,最大线程数配得过高也会加剧内存压力,业内专家指出,云服务器上的Tomcat启动失败,相当一部分是因为新手照搬了网上大内存服务器的配置导致堆空间超卖。
配置文件写错:server.xml和web.xml的锅

改过conf/server.xml之后Tomcat启动不了,大概率是这个文件被你改坏了,常见情况有:端口号重复定义、<Connector>标签的属性拼写错误、标签没有正确闭合,Tomcat解析XML文件时一旦碰到格式错误,会直接拒绝启动,并在catalina日志里给出具体的行号提示。
验证XML文件格式是否合法,Linux上可以用xmllint命令快速检查:
xmllint --noout conf/server.xml
没有输出说明格式没问题,有报错会直接告诉你第几行出了问题。
web.xml同样要注意,不仅是全局的conf/web.xml,各个Web应用WEB-INF/web.xml写错也会导致这个应用部署失败,从而让Tomcat启动流程中断,症状通常是日志停在Deploying web application这条记录上,然后后续报出解析异常。
配置方面给个实用建议:每次改动配置文件之前先备份一个,比如cp server.xml server.xml.bak,改坏了就立刻还原,比什么都管用。
Q&A:tomcat端口被占用和日志无异常怎么处理
tomcat启动报java.net.BindException: Address already in use是什么原因?
端口被占用,且多数情况下是8080端口被其他进程占用,先用ss -lntp确认占用进程的PID,再确认这个进程能否结束如果是不认识的进程,建议先查清楚再操作,如果是旧Tomcat进程残留,直接kill -9杀掉然后重启,如果是别的业务服务,改Tomcat端口是更正确的选择。
启动tomcat时catalina.out日志里没有报错,但进程起不来,为什么?
说明Tomcat主流程已经正常执行了,但进程在后续被外部因素终止,优先检查dmesg里有没有OOM记录,同时确认logs目录是否可写如果日志和临时文件目录权限不对,进程可能卡在初始化阶段然后被系统回收,还有一点,如果启动脚本是从Windows上传到Linux的,注意检查startup.sh有没有^M换行符问题。
Tomcat启动后立即退出,没有任何提示,该怎么办?
在前台直接运行./catalina.sh run -security,让Tomcat以安全模式启动并强制打印所有输出,然后把输出内容逐行核对,尤其是包含Error、Exception的行,如果连这个命令都没有输出,检查是否设置了CATALINA_HOME环境变量,指向了一个错误或不存在的目录,这种情况下Tomcat脚本会静默退出。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/805492.html

