根本原因是Tomcat默认仅监听127.0.0.1,未配置address="0.0.0.0"导致外网请求无法进入;还需检查云平台安全组、系统防火墙、用户权限及端口一致性。

为什么配置完 JAVA_HOME 和 CATALINA_HOME 还是外网打不开
根本原因不是环境变量没配对,而是 Tomcat 默认只监听 127.0.0.1(本地回环),不对外网暴露。哪怕 startup.sh 显示启动成功、catalina.out 里有 Server startup in xxx ms,只要 server.xml 里没显式放开绑定地址,外网请求就根本进不来。
常见错误现象:
- 本地
curl http://localhost:8080能返回汤姆猫页面,但用服务器公网 IP 访问超时 - 宝塔面板显示“运行中”,但安全组已放行端口,
telnet 公网IP 8080直接拒绝连接 -
netstat -tuln | grep :8080显示的是127.0.0.1:8080或::1:8080,不是*:8080或0.0.0.0:8080
实操建议:
- 打开
$CATALINA_HOME/conf/server.xml,定位到<Connector port="8080" ...>这一行 - 在该标签内添加
address="0.0.0.0"(不要写成127.0.0.1)或直接删掉已有address属性(默认即为所有接口) - 确保没有其他
<Connector>段落意外覆盖了这个设置(比如 AJP 或 HTTPS Connector 也写了address="127.0.0.1") - 重启 Tomcat:
$CATALINA_HOME/bin/shutdown.sh && $CATALINA_HOME/bin/startup.sh
阿里云/腾讯云等云服务器上还差哪一关
即使 Tomcat 已监听 0.0.0.0:8080,外网仍无法访问,90% 是卡在云平台的安全组规则上——它和本机防火墙是两层独立控制。
实操建议:
- 登录云控制台 → 找到对应 ECS 实例 → 进入「安全组」→ 「配置规则」
- 添加入方向规则:协议类型选
TCP,端口范围填你实际用的端口(如8080或8081),源 IP 填0.0.0.0/0(或按需限制) - 确认规则状态为「启用」,且应用到了当前实例(有些平台要手动「关联实例」)
- 别忘了检查云服务器自带的系统防火墙(如 CentOS 的
firewalld):sudo firewall-cmd --list-ports看是否包含目标端口,没有就加:sudo firewall-cmd --add-port=8080/tcp --permanent && sudo firewall-cmd --reload
宝塔面板里 Tomcat 启动了却没生效?查 setenv.sh 和用户权限
宝塔安装的 Tomcat 不读取系统级 /etc/profile,它只认自己 bin/ 目录下的 setenv.sh,而且默认以 www 用户运行。这两点一旦错位,进程看似在跑,其实 JVM 根本没起来。
实操建议:
- 确认
$CATALINA_HOME/bin/setenv.sh存在且有执行权限:ls -l $CATALINA_HOME/bin/setenv.sh;若无,新建并写入:export JAVA_HOME=/www/server/jdk export JRE_HOME=$JAVA_HOME/jre
- 检查
catalina.out开头几行有没有Unrecognized VM option或Permission denied;如果有,大概率是JAVA_HOME路径不对,或logs/目录属主不是www - 修复权限:
sudo chown -R www:www $CATALINA_HOME/{logs,work,temp} - 别用
root手动执行过startup.sh,否则残留文件会卡住后续www用户启动
改了端口但浏览器还在输 8080?这是最常被忽略的细节
很多人改完 server.xml 里的 port="8081",重启 Tomcat 后,还是习惯性地在浏览器敲 http://xxx.xxx.xxx.xxx:8080 ——然后理所当然地失败。这不是配置问题,是人脑缓存没刷新。
实操建议:
- 改端口后,立刻记下新端口号,贴在终端窗口边或写进注释里
- 用
grep -A 2 -B 2 "Connector.*port" $CATALINA_HOME/conf/server.xml快速确认当前生效的 port 值 - 在浏览器访问前,先用
curl -v http://公网IP:新端口测试,比图形界面更早暴露连接拒绝或 404 - 如果用了反向代理(如 Nginx),确保它的
proxy_pass指向的是新端口,而不是硬编码的8080
真正卡住外网访问的,往往不是某一个配置项写错了,而是监听地址、安全组、用户权限、端口记忆这四层漏掉一层。尤其要注意 address="0.0.0.0" 这个显式声明,它不像端口修改那么直观,但缺了它,前面所有操作都白搭。

















