大家好,又见面了,我是你们的朋友全栈君。
一、问题起因:
ssh登录远程服务器重启项目(第一次),未等tomcat启动完成,直接访问项目的对应后台管理系统网站,导致网页一直加载不出来,心急又去重复启动项目(第二次),再次访问网页报错:502 Bad Gateway nginx。
二、解决思路:
…这里饶了很多弯路。前面几步是没有解决的错误思路,想要看最终解决,直接跳过,去查看最后的总结…
1.首先想到去查看nginx日志,结果error.log内并无错误日志:
最新一条时间是10/17,明显不是nginx出了问题,并且另一个服务器端口转发是正常的,故排除。
重启项目之后依然不行(第三次)。
2.查阅资料,有个文章说,可能是内存磁盘满了…df -h 发现内存占用了83%,感觉也有可能:
(下图是费了九牛二虎之力,省了10%磁盘空间后的截图。。。我有一篇博客专门讲清理磁盘)清理过程中,发现nohup.out很占内存,是可以清理的,亲测有效,命令:
代码语言:javascript复制第一种:cp /dev/null nohup.out
第二种:cat /dev/null > nohup.out
再次部署重启项目(第四次)。此时发现重启项目时,tomcat启动zookeeper疯狂报错:
java.lang.NoClassDefFoundError: org/apache/zookeeper/proto/SetWatches
3.然后想是不是zookeeper出了问题?zookeeper是连接项目的桥梁,提供注册然后建立连接调用。
ps:zookeeper命令:
- 1. 启动ZK服务: sh bin/zkServer.sh start
- 2. 查看ZK服务状态: sh bin/zkServer.sh status
- 3. 停止ZK服务: sh bin/zkServer.sh stop
- 4. 重启ZK服务: sh bin/zkServer.sh restart
进入项目的zookeeper目录一顿操作,还是没有解决,继续报错:java.lang.NoClassDefFoundError: org/apache/zookeeper/proto/SetWatches(此时已经第五次重启项目)
4.思考这个异常的解决方案,莫非是jar包冲突?毕竟报错NoClassDefFoundError呢,某些zookeeper的类没加载到?但是发现,在本地项目是可以完美运行的,所以项目代码是没有问题的。
继续搜资料:借鉴一下人家的分析:
`tomcat启动,初始化webcontext;
`初始化spring, spring初始某些些bean,这些bean包括了zookeeper的连接相关的bean; `这时zkClient(独立线程)已经连接上服务器了,但是classloader没有加载到org/apache/zookeeper/proto/SetWatches类; `spring初始化失败,导致Tomcat webcontext初始化也失败,应用在挂起状态,但zkClient线程还是正常的; `zookeeper服务器重启,zkClient开始重连,连接上zookeeper服务器; `zkClient触发watch的一些代码,ClassLoader尝试加载org/apache/zookeeper/proto/SetWatches类,但是发现找不到类,于是`抛出异常; `zkClient捕获到异常,认为重连失败,close掉connection,休眠几秒之后,再次重连; 于是出现了zkClient反复重试连接zookeeper服务器,而且都是秒连秒断的情况。
三、【最终解决】
5.【最终解决】终于意识到是一开始项目就没有正常启动!而zkClient线程在应用程序进程启动失败前已经正常启动了,所以导致zkClient没有在jvm中找到SetWatches该类!于是查看linux上的java进程:ps -ef | grep java
从头至尾各个参数的意思是:
(1):UID :程序被该 UID 所拥有
(2):PID :就是这个程序的 ID
(3):PPID :则是其上级父程序的ID
(4):C :CPU使用的资源百分比
(5):STIME :系统启动时间
(6):TTY :登入者的终端机位置
(7):TIME :使用掉的CPU时间。
(8):CMD :所下达的是什么指令
震惊的发现怎么那么多tomcat实例!(。。想想我倒是重启过多少次项目吧)然后果断kill掉:kill pid
然后再次重启项目。
再次重启的时候tomcat执行sh shutdown.sh,发现报错,更验证了之前的猜想,因为关于tomcat的实例我都kill掉了啊,所以再执行:sh startup.sh
打印tomcat日志命令:tail -f ../logs/catalina.out
漫长的等待中。。。。没有zookeeper报错!!!
待tomcat启动完成后,访问项目,完美打开…
四、总结
1.查看linux上的java进程:ps -ef | grep java
2.杀掉重复的进程:kill pid (注意别误kill其他进程)
3.再次重启项目。
最后如果还是没有解决问题,关注私聊博主解决问题。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149619.html原文链接:https://javaforall.cn