无法通过浏览器连接运行Tomcat的Amazon EC2实例,求排查方案
这种突然掉链子的访问故障确实闹心,既然你已经排查了实例重启、Tomcat重启和安全组这些基础项,咱们可以从更细节的维度一步步深挖:
登录EC2实例后,敲这两个命令之一检查端口绑定情况:
netstat -tulpn | grep 8080 # 或者更现代的ss命令 ss -tulpn | grep 8080
重点看输出里的监听地址:如果是127.0.0.1:8080,那Tomcat只允许本地访问,外部肯定连不上;得改成0.0.0.0:8080才行。要是完全没输出,说明Tomcat根本没启动成功,或者配置里改了端口。
用curl或者wget在Putty里试试访问本地Tomcat:
curl http://localhost:8080 # 或者 wget --spider http://localhost:8080
如果内部都拿不到响应,那问题大概率在Tomcat本身或者系统层面,比如Tomcat启动失败、JVM出问题,或者本地防火墙挡了端口。
别只盯着AWS安全组!Linux实例自带的防火墙(比如iptables或者firewalld)可能突然新增了规则堵了8080:
- 用
iptables -L -n查看有没有拒绝8080的规则 - 如果是用firewalld的系统,敲
firewall-cmd --list-all看看服务/端口列表里有没有8080
要是发现有拦截,赶紧调整规则放行8080。
Tomcat的日志一般在${CATALINA_HOME}/logs目录下,重点看这几个文件:
catalina.out:记录Tomcat启动和运行的所有报错信息,比如端口被占、权限不足、依赖缺失localhost.log:本地主机的请求和错误日志localhost_access_log.*.txt:所有访问请求的记录,能看到有没有请求真的打到Tomcat上
比如如果日志里出现Address already in use,就用lsof -i :8080找出占用端口的进程,杀掉再重启Tomcat就行。
很多人只检查安全组,忘了子网的网络ACL——这东西是双向的,入站和出站都得允许8080端口的流量。去AWS控制台的VPC模块里,找到实例所在子网的网络ACL,确认:
- 入站规则里有允许
0.0.0.0/0访问8080的条目 - 出站规则里有允许Tomcat回包的条目(比如允许所有出站流量,或者对应8080的回包)
打开${CATALINA_HOME}/conf/server.xml,看Connector节点的配置:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" address="0.0.0.0"/> <!-- 重点看address属性,别是127.0.0.1 -->
另外也看看web.xml里有没有新增安全约束,或者Tomcat的Valve配置有没有加IP白名单限制。
用top或者htop看看实例的CPU、内存占用率:如果内存爆了,Tomcat可能会崩溃或者无法处理请求;用df -h检查磁盘空间,要是根目录满了,Tomcat连日志都写不了,更别说处理请求了。
内容的提问来源于stack exchange,提问作者grantedfour

