【项目部署】网页无法打开,xxx.xxx.xxx.xxx目前无法处理此请求

问题背景

这个报错发生在之前部署的一个前后端分离的项目中。后端使用的Spring Boot,前端使用的JavaScript,前后端交互使用Thymeleaf框架。

现象

现象大概是这样,项目组的小伙伴突然跟我说所有网页都打不开了,网页显示"目前无法处理此请求",如下图。

服务器上的日志是这样的:

这个异常是由一个Python定时脚本抛出的。这个脚本会定时请求服务的某个接口,请求中的url写的是公网IP。

问题排查

关于这个问题,我第一次处理,所以初步有几个猜想:

  1. 服务停止了
  2. 服务器网络断开了

服务是否停止?

在服务器上,查看java进程是否有在运行:

  • 输入jps 命令,显示有jar进程在运行
  • 输入ps -ef | grep <jar包名称> | grep -v grep,显示有进程在运行

查看java服务端口是否正在监听:

  • 输入netstat -tuln | grep <服务端口>,显示LISTEN

排查到这里,说明服务正常运行,端口也是在监听的,说明服务没有停止。

网络是否断开?

网络排查,首先就是ping:

  • 在服务器上ping百度,能ping通
  • 在本地ping服务器,能ping通

说明网络没问题。然后我尝试了telnet访问服务器的服务端口:

  • 在服务器上用公网IP + 服务端口 telnet自己的服务端口,显示telnet: Unable to connect to remote host: Connection refused
  • 在本地用公网IP + 服务端口 telnet服务器的服务端口,显示无法打开到主机的连接,连接失败
  • 在服务器上用localhost + 服务端口 或者127.0.0.1 + 服务端口 telnet自己的服务端口,能够正常连接,显示Connected to localhost.

到这里,发现只要用公网IP和端口,就访问不了。我又尝试了用curl命令访问服务,发现也是这样,只要用公网IP就访问不了,不管是在本地还是在服务器上进行访问。我很好奇,这里localhost、127.0.0.1、公网IP明明都表示同一台机器,但是只有公网IP访问不了。

查资料才发现,如果用公网IP,数据包会离开本机 ,通过网络接口传输到互联网上(即到达路由器上),然后根据路由表和网络配置在网络上传输。而如果用localhost,数据包不会离开本机,只会在计算机内部循环。

所以到这里,猜测可能是路由器的服务器端口映射变了(关于端口映射,涉及到内网、外网的概念,可以参考:什么是端口映射?路由器如何设置端口映射?),导致ping虽然能ping通,但是telnet无法访问。

最后问了服务器那边的人员,发现是网站没有备案,导致被强制关闭了外网访问。

总结

网站无法打开,从以下几个方面排查问题:

  • 网络是否正常
  • 服务是否正常启动
  • 路由器端口映射是否发生改变
  • 是否由于没有备案,导致被强制关闭外网访问

也学习到了一些计算机网络的知识:

  • ping localhost,数据包只在本机内部循环,不会到公网上
  • ping本机的公网IP,数据包会离开本机,到达路由器上,然后再根据路由器配置发送到本机
相关推荐
李白的粉3 小时前
基于springboot的在线教育系统
java·spring boot·毕业设计·课程设计·在线教育系统·源代码
唯独失去了从容3 小时前
WebRTC服务器Coturn服务器中的通信协议
运维·服务器·webrtc
小马爱打代码4 小时前
SpringBoot原生实现分布式MapReduce计算
spring boot·分布式·mapreduce
iuyou️4 小时前
Spring Boot知识点详解
java·spring boot·后端
一弓虽4 小时前
SpringBoot 学习
java·spring boot·后端·学习
姑苏洛言4 小时前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
光而不耀@lgy4 小时前
C++初登门槛
linux·开发语言·网络·c++·后端
方圆想当图灵5 小时前
由 Mybatis 源码畅谈软件设计(七):SQL “染色” 拦截器实战
后端·mybatis·代码规范
Run1.5 小时前
深入解析 Linux 中动静态库的加载机制:从原理到实践
linux·运维·服务器
毅航5 小时前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis