Tomcat部署javaweb项目遇到的奇怪问题

问题:tomcat部署javaweb项目(war包)后,启动正常,但是项目页面不能访问。

环境:Linux下tomcat9.0.27。

排查:

  1.首先排除启动异常,无论是tomcat日志还是应用自身的日志,都没有异常记录;

  2.然后排除端口和路径异常,tomcat首页(猫图)可以正常访问,且webapps文件夹下新建静态资源页面可以访问到。但是项目页面不能访问,也不返回404,就是一片空白。若输入错误的项目名,则会返回404;(网上多数都是这里的问题,但我不是-_-||)

  3.然后排除项目本身的异常,在其他服务器上,同版本的tomcat部署同样的war包,启动后可以正常访问,且在这个访问不了的服务器上,项目后台一直在运行,每天设置的定时任务都可以正常执行并产生日志。

推测:

  如此看来,很可能就是目标机器的环境问题了,上过linux的都知道,这个环境要素是相当重要的,无论在上面干点啥都敏感得一批,稍有不慎就会丢给你一堆莫名其妙、刷新你三观的问题。既然tomcat可以正常启动,且webapps下的纯静态资源可以访问到,那么,就很可能是tomcat对java资源的编译问题了。

  项目用的是jsp页面(甲方要求的),小众所知,tomcat上的jsp页面,会随着浏览器请求逐一编译成java和class文件,并存放在work目录下。查看了一下work目录,下面有Catalina/localhost/项目名/org/apache/jsp/项目jsp资源路径,里面对应于所有被访问到的jsp页面生成了一对.java、.class文件,如index.jsp被访问过就会有index_jsp.java和index_jsp.class这对cp,一次访问,终身保留,以后每次光顾的都是这里,直到资源被修改或服务重启。没有被请求过的资源则不会出现在这里。

  我看到的这个work目录下,只有index.jsp被编译进来,因为其他的根本没机会被请求。问题是这个index既然进来了,就表明请求已经收到,那为何不返回给客户端呢?洗都洗好了,不让人碰,什么情况?是编译后的index异常,拿不出手?还是中间被什么拦截了?放一个在别的地方被正常使用过的index_jsp.java和index_jsp.class来替换一下试试吧。(实际并没有试,因为发现问题可能不在这里。)

  (未完待续……)

  书接上回……

  昨天突然想到一个问题,项目的首页jsp并没有什么实际内容,在被访问到的时候,它会判断一下当前用户状态,然后跳转到其他页面。所以,在linux上直接用curl http://....访问,会被瞬间弹走。那么就要加上另一个option了,这样:curl -L http://.....哎,这回有内容了,果然是跳转后的页面!那么本地访问是没问题的,不信的话进到work里面再去看看,果然又多了一对刚才访问到的页面编译后的java类文件。这时又想到另一个文件(之前就是没关注这个,后来经人提醒才想到。。。),tomcat/logs下面的访问日志“localhost_access_log.2020-06-08.txt”,这里面存有所有成功抵达的来访记录,包括来访者IP、时间、请求方式、请求资源以及返回的http状态码。看了下,刚才的访问果然有记录:

127.0.0.1 - - [08/Jun/2020:09:37:18 +0800] "GET /xmm HTTP/1.1" 302 -
127.0.0.1 - - [08/Jun/2020:09:38:10 +0800] "GET /xmm/index.jsp HTTP/1.1" 302 -
127.0.0.1 - - [08/Jun/2020:09:47:12 +0800] "GET /xmm/ HTTP/1.1" 302 -
127.0.0.1 - - [08/Jun/2020:09:47:12 +0800] "GET /xmm/login/main.do?reqId=10010 HTTP/1.1" 302 -
127.0.0.1 - - [08/Jun/2020:09:47:12 +0800] "GET /xmm/login/login.do;jsessionid=D570B19A7F2B44C05FD425E2DD659011 HTTP/1.1" 200 10086
127.0.0.1 - - [08/Jun/2020:09:55:43 +0800] "GET / HTTP/1.1" 200 11215

那就再试试浏览器访问,还是熟悉的空白页面

有我无图

再进访问日志,果然没有新增任何记录。可以确定访问请求没有真实抵达tomcat无疑了。之前走的都是弯路,要是早注意到这里会节省不少时间。

确定问题:

  那么问题就在访问过程上了。既然webapps下的纯静态html页面是可以访问的,那说明路本身是通的,只是因为javaweb和jsp本身的特殊性导致请求没进来。你看,首页它就用了个跳转——跳转往往伴随的是重定向,而重定向又跟通讯方式息息相关……哎,似乎有线索了。应该就是javaweb使用的jsp页面重定向跳转出了问题,但是本地可以正常跳转(加-L),外部则进都不让进来,那么通讯协议就有着莫大的干系了。

解决:

  现在焦点转向服务网络架构,这个项目部署在甲方的环境,他们采用的是内网服务器tomcat部署,外网访问使用nginx代理转发,且配置了SSL加密。也就是浏览器通过https协议,使用域名访问nginx,nginx再通过http协议转发给tomcat。这种方式访问普通的前端资源或许没问题,但是涉及到java那种老式的前后端高度耦合的jsp页面就很有问题了。因为不擅长这个,果断搜寻资料,网上还是有很多人遇到过这种坑的。接下来就是按照筛选后的比较靠谱的资料各种改配置和测试,在正确配置了nginx和tomcat后,终于可以通过浏览器访问了!

  这里关键有两点,一是要能够有权限配置和重启nginx与tomcat,一是要根据自己的实际情况筛选靠谱的资料。没有权限或者没有管理员的现场支持,那就只能干着急;一般的问题,网上资料形形色色,各有各的理,没有最好的,只有最合适的。

结语

  问题的排查和解决过程大体如上,因为环境不在自己家,来来回回的费了不少时间。这种情况一般首先从自己项目找原因,然后再排查服务环境的问题,确定问题的范围非常重要。希望能够帮助同样入坑的小伙伴,也希望有大神指正谬误之处。

最后感谢这位老哥的博文:解决nginx部署https后,原tomcat部署的javaweb项目http不能正常加载js、css资源问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章