无法在Google GCP实例上访问运行中的Tomcat服务
问题背景
我从Google一键部署的标准Tomcat镜像启动了一台Google GCP Tomcat实例,操作系统为Debian 9。尝试在浏览器中访问
IP.ADDRESS:8080时出现超时,但/etc/tomcat8下的Server.xml显示Tomcat运行在8080端口。Tomcat服务状态信息如下:
tomcat1@generator1-vm:/etc/tomcat8$ sudo service tomcat8 status ● tomcat8.service - LSB: Start Tomcat. Loaded: loaded (/etc/init.d/tomcat8; generated; vendor preset: enabled) Active: active (running) since Mon 2018-05-21 13:34:38 UTC; 1h 7min ago Docs: man:systemd-sysv-generator(8) Process: 29722 ExecStop=/etc/init.d/tomcat8 stop (code=exited, status=0/SUCCESS) Process: 29764 ExecStart=/etc/init.d/tomcat8 start (code=exited, status=0/SUCCESS) Tasks: 16 (limit: 4915) CGroup: /system.slice/tomcat8.service └─848 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.util.logging.config.file=/va May 21 13:34:33 generator1-vm systemd[1]: Starting LSB: Start Tomcat.... May 21 13:34:38 generator1-vm tomcat8[29764]: Starting Tomcat servlet engine: tomcat8. May 21 13:34:38 generator1-vm systemd[1]: Started LSB: Start Tomcat.. lines 1-13/13 (END)服务显示已正常运行,但浏览器访问
IP.ADDRESS:8080超时,请问还可排查哪些内容?
排查步骤
既然服务状态显示正常,那咱们从几个常见的方向入手排查:
确认Tomcat实际监听的端口和地址
别光看server.xml的配置,实际运行的Tomcat可能没按预期绑定地址。用以下命令检查实际监听情况:sudo ss -tulpn | grep java或者精准定位8080端口:
sudo netstat -plnt | grep 8080如果输出里显示的是
127.0.0.1:8080,说明Tomcat只绑定了本地回环地址,外部无法访问。这时需要修改/etc/tomcat8/server.xml里的Connector标签,要么删除address属性(默认监听所有地址),要么将其设置为0.0.0.0,然后重启Tomcat服务。检查本地防火墙规则
Debian 9默认使用ufw防火墙,先查看当前规则是否放行8080端口:sudo ufw status如果没有看到允许
8080/tcp的规则,执行以下命令添加:sudo ufw allow 8080/tcp若系统使用
iptables,则检查现有入站规则:sudo iptables -L -n确保存在允许8080端口入站的规则。
验证GCP VPC防火墙规则
这是GCP实例最容易忽略的点!就算本地防火墙开了端口,GCP的VPC防火墙如果没放行8080,外部还是访问不了。登录GCP控制台,进入VPC网络 > 防火墙页面,确认存在针对该实例所在子网的规则,允许tcp:8080的入站流量,且规则的目标范围包含你的实例(比如通过实例标签或IP段指定)。测试本地访问是否正常
在实例内部用curl测试本地访问:curl http://localhost:8080如果本地能正常返回Tomcat默认页面,说明问题出在网络层面(本地防火墙或GCP规则);如果本地也访问失败,那Tomcat可能存在启动异常,需要进一步查看日志。
查看Tomcat日志排查启动异常
Tomcat的日志文件默认在/var/log/tomcat8/目录下,重点查看catalina.out或localhost.log:sudo tail -f /var/log/tomcat8/catalina.out日志里可能会有端口占用、配置文件语法错误、权限不足等报错信息,这些都会导致Tomcat进程运行但无法正常提供服务。
确认实例公网IP正确性
有时候会误将实例的内部私有IP当成公网IP访问,尤其是临时公网IP可能会变动。登录GCP控制台的实例详情页,确认你访问的是实例的外部IP地址。
内容的提问来源于stack exchange,提问作者MayoMan

