curl: (56) Recv failure: Connection reset by peer问题汇总和解决方案
这两天正在学习用docker制作tomcat镜像,有一个问题困扰了我3天,可能大家在学习时也会遇到,于是我就单独发一篇文章来解决这个问题。
解决办法我在上一篇文章 Docker进阶篇之DockerFile制作Tomcat镜像,教你如何发布镜像到DockerHub和阿里云 已经详细说明了,这里再说明一次。
问题描述:
[root@wyc tomcat]# curl localhost:9090
curl: (56) Recv failure: Connection reset by peer
curl: (56) Recv failure: Connection reset by peer ,意思是说访问失败,连接被重置,会出现这个错误的原因有很多种,我们需要查看日志文件来找出原因。
日志1:无法找到jdk路径
[root@1c299e7ab95c logs]# cat catalina.out
/usr/local/apache-tomcat-10.1.0/bin/catalina.sh: line 466: /usr/local/jdk1.8.0_301/bin/java: No such file or directory
/usr/local/apache-tomcat-10.1.0/bin/catalina.sh: line 466: /usr/local/jdk1.8.0_301/bin/java: No such file or directory
/usr/local/apache-tomcat-10.1.0/bin/catalina.sh: line 466: /usr/local/jdk1.8.0_301/bin/java: No such file or directory
/usr/local/apache-tomcat-10.1.0/bin/catalina.sh: line 466: /usr/local/jdk1.8.0_301/bin/java: No such file or directory
日志1解决办法:
1、如果单纯是dockerfile文件的路径错误,只需要修改文件中的路径即可,大概率是jdk的路径写错了
ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.60
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.60
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
如上写法是没问题的。
2、如果是jdk本身有问题,我的问题就是jdk的压缩包出问题了,下载jdk压缩包时要注意区分这个压缩包是不是真的是压缩包,可以用 cat jdk-8u281-linux-x64.tar.gz
查看,如果出现前端代码就代表这是个网址而不是压缩包,如果出现乱码,则是压缩包;或者用 ls -l
查看压缩包大小,如果很小则不是压缩包。解决办法是重新去官网找jdk的压缩包。
解决了上述问题后继续通过curl查看网络请求 curl localhost:9090
,发现还是会报 curl: (56) Recv failure: Connection reset by peer
,继续查看日志。
日志2:jdk版本不匹配或jdk版本太高
[root@wyc tomcat]# curl localhost:9090
curl: (56) Recv failure: Connection reset by peer
[root@wyc tomcat]# docker logs a23b8ffe533a
Tomcat started.
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/catalina/startup/Bootstrap has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
日志2解决办法:
出现这样的日志,有两种可能原因:
1、linux的jdk版本和完成的镜像中的jdk版本不一致。
解决办法就是让两者的jkd版本一致。当时我的tomcat镜像下载的的jdk版本是 jdk1.8.0_301,而linux的jdk版本是自带的 jdk1.8.0_262,于是我删除了linux自带的jdk下载了301版本的jkd。
2、当我解决了jdk不一致的问题后,发现还是会出现上述日志,此时原因是jdk版本太高。
解决办法是把已有的jdk删除后下载低版本的jdk(但是别忘了容器的jdk版本和linux的jdk版本要一致)
我刚开始用的是 jdk1.8.0_301 和 apache-tomcat-10.1.0,发现问题后改成了 jdk1.8.0_281 和 apache-tomcat-9.0.60,实测可以运行。
上述解决办法是基于防火墙和安全组等都没有问题的情况,查看日志文件还是很重要的!
自己遇到的坑,跪着也要填完!
相关文章
- 轻量级CI/CD发布部署环境搭建及使用_02_docker安装jenkins
- idea导入tomcat8源码搭建源码调试环境
- 三天吃透Java并发八股文!
- 【多线程与高并发】- 浅谈volatile
- C# HttpClient使用和注意事项,.NET Framework连接池并发限制
- Java 优化:读取配置文件 "万能方式" 跨平台,动态获取文件的绝对路径
- (原创)多线程并发:AQS源码分析(2)——共享锁的实现原理
- (原创)多线程并发:AQS源码分析(1)——独占锁的实现原理
- Java并发之AQS详解
- SpringBoot集成Tomcat服务
- concurrent-map 和 sync.Map,我该选择哪个?
- Java 集合中的排序算法浅析
- Java 调用 PaddleDetection 模型
- 上周热点回顾(2.13-2.19)
- 《深入理解java虚拟机》第七章读书笔记——虚拟机类加载机制
- Maven依赖冲突解决总结
- Tomcat 与 JVM 中classpath的理解和设置总结
- jmeter做性能测试
- 剑指 Offer 32 - I. 从上到下打印二叉树(java解题)
- Java堆外缓存(一个很有意思的应用)