先运行 ps aux | grep tomcat 查进程,再检查 /opt/tomcat 等路径是否存在,最后用 netstat -tuln | grep :8080 和 lsof -i :8080 确认端口占用情况。

怎么确认系统里没装过 Tomcat
很多人直接下载解压就开跑,结果发现 localhost:8080 打不开,或者提示端口被占——大概率是系统里已有残留的 tomcat 进程或旧版本服务在后台跑着。
先查干净再动手:
- 运行
ps aux | grep tomcat,看有没有java进程带catalina或tomcat字样 - 检查常见安装路径:
/opt/tomcat、/usr/local/tomcat、/var/lib/tomcat*是否存在 - 用
netstat -tuln | grep :8080确认 8080 端口是否真被占;如果是,lsof -i :8080(需装lsof)能直接看到进程 PID
用 tar.gz 包手动部署最稳,别碰 apt/yum 的 tomcat 包
Ubuntu/Debian 的 apt install tomcat9 或 CentOS 的 yum install tomcat 装出来的不是官方二进制包,而是发行版打包的“阉割版”:配置分散、日志路径不标准、CATALINA_HOME 和 CATALINA_BASE 混在一起,升级和排查都容易踩坑。
- 去官网 https://tomcat.apache.org/download.cgi 下载
apache-tomcat-*.tar.gz(不是.zip,Linux 别用错) - 解压到统一位置,比如
/opt/tomcat,并确保运行用户(如tomcat用户)有读+执行权限,但**不能有写权限到conf/和bin/目录**(防配置被意外覆盖) - 设环境变量时只配
CATALINA_HOME=/opt/tomcat,别设CATALINA_BASE——除非你要单机跑多个实例
启动失败常见报错和对应动作
运行 ./bin/startup.sh 后没反应,或 ps 看不到进程,十有八九是 Java 环境或权限问题。
-
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined:必须显式设置JAVA_HOME(指向 JDK 根目录,不是jre/子目录),且该路径下要有bin/java -
Permission denied: bin/catalina.sh:解压后脚本没执行权限,chmod +x bin/*.sh补上 - 启动后立刻退出,
logs/catalina.out末尾出现SEVERE: Failed to initialize connector:通常是 8005(shutdown 端口)、8009(AJP)、8080(HTTP)被占,改conf/server.xml里的port值即可 - 日志里反复刷
java.lang.OutOfMemoryError: Metaspace:说明 JVM 参数太激进,删掉bin/setenv.sh里多余的-XX:MetaspaceSize,先用默认值跑通再说
让 Tomcat 真正跑在生产环境的最小加固点
本地能访问不等于能上线。默认配置暴露太多信息,且没做基础隔离。
- 关掉默认管理页:删掉
webapps/manager和webapps/host-manager目录(哪怕你配了账号,也不建议暴露) - 改掉 shutdown 端口:
conf/server.xml里把port="8005"改成随机五位数,并设shutdown="SOME_RANDOM_STRING",防止远程发包强制关闭 - 别用 root 启动:创建专用用户
useradd -r -s /bin/false tomcat,用sudo -u tomcat ./bin/startup.sh启动 - HTTP Connector 加个
redirectPort="8443",哪怕暂时不配 HTTPS,也预留重定向入口,避免后续加 SSL 时要改应用逻辑
Tomcat 本身不难,难的是每次部署时漏掉一两个权限、路径或端口细节,导致花两小时找问题。盯住 logs/catalina.out,别猜,直接看它报什么——绝大多数问题,第一行错误就写了答案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










