Tomcat 网页打不开,网页十有八九不是网页 Tomcat 的错。你信我,网页先别急着重启服务,网页看看那个黑乎乎的网页 DOS 窗口,是网页不是已经报了一长串异常,然后悄无声息地退出了。网页
我上周就栽在这上面。网页项目跑得好好的网页,中午出去吃碗拉面,网页回来刷新页面,网页转圈圈,网页然后直接 "无法访问此网站"。网页第一反应是网页端口被占了。netstat -ano | findstr 8080,网页结果干干净净,啥都没有。进程都没了,谈何端口。
去 logs 目录翻 catalina.out,尾巴上写着 "SEVERE: A fatal error has been detected by the Java Runtime Environment"。好家伙,JVM 崩了。再往上看,一堆 "OutOfMemoryError: Metaspace"。这就对上了——我那个项目里有个定时任务,每五分钟拉一次外部接口,数据解析后存内存缓存,结果缓存没设上限,跑了一上午,元空间被撑爆了。
解决倒是简单,catalina.sh 里加一句 JAVA_OPTS="-XX:MaxMetaspaceSize=256m",重启,完事。但这事让我琢磨出一个规律:Tomcat 打不开,你得先分清是"起不来"还是"连不上"。
如果是起不来,看启动日志比看浏览器靠谱得多。常见的有三种:端口被占用,报 java.net.BindException: Address already in use;部署的应用有问题,报 Context [/xxx] startup failed;再就是上面说的内存不够。前两种好查,后一种容易被忽略,因为 Tomcat 本身启动时内存占用不大,真正吃内存的是你那些 Servlet 里的静态集合、ThreadLocal 没清理、或者像 C3P0 连接池泄漏。
要是连不上呢?情况就多了。有次我同事改了个 server.xml,把 Connector 的 port 从 8080 改成了 8081,结果前端代码里 axios 写死了 8080,页面死活打不开。他折腾了半天,最后发现是后端改了端口没同步前端。这种低级错误其实最常见——配置文件被改,但没人记得。
还有一种情况,Tomcat 明明起来了,浏览器也显示连接成功,但页面白屏或者 404。这时候别慌,先看访问的路径对不对。Tomcat 默认的 ROOT 应用是那个"小猫"欢迎页,如果你把项目打成 war 包丢进 webapps,访问路径得带项目名,比如 http://localhost:8080/myapp/。直接访问根路径,看到的是 404 或者那个默认页面,这不算 Tomcat 打不开,是你没找对门。
最坑的一次,是在 Linux 服务器上。防火墙没开 8080 端口,外部机器访问超时,但本机 curl localhost:8080 一切正常。排查到最后,发现是 iptables 规则问题。所以远程访问不了的时候,先 curl -v http://127.0.0.1:8080 测本地,能通就是网络层问题,不能通才是应用层问题。
说句实在话,Tomcat 这东西,报错信息写得比很多中间件都清楚。你只要愿意花五分钟去翻 logs 目录下的 localhost.log 和 catalina.out,绝大多数问题都能定位。怕就怕你连日志都不看,直接百度"tomcat打不开",然后照着网上的教程改一通,越改越乱。
最后一个个人经验:改完配置记得确认一下文件编码。有次在 Windows 上编辑 server.xml,默认 GBK 编码,里面有中文注释,Tomcat 启动直接报解析错误,页面自然打不开。那破问题浪费了我一下午。现在我的习惯是,所有配置文件统一 UTF-8,注释全删,能不用中文就不用中文。
Tomcat 打不开,核心就一句话:先看日志,再谈其他。别让浏览器那个"无法访问"的页面吓住你,它只是表象,真正的答案藏在那些密密麻麻的堆栈信息里。