如何修复“Http11NioProtocol:读取请求时出错,被忽略”
Posted
技术标签:
【中文标题】如何修复“Http11NioProtocol:读取请求时出错,被忽略”【英文标题】:How to fix "Http11NioProtocol: Error reading request, ignored" 【发布时间】:2020-01-20 04:10:32 【问题描述】:在使用 SSL 的 azure kubernetes 服务上运行时,我的 spring-boot 应用程序在 tomcat 服务器中的 NPE 启动后失败。
首先,什么是成功的: 我有一个使用 Spring Initializr 创建的最小 Spring-boot 应用程序:
Gradle 项目 Java 11 Spring Boot 2.1.8 唯一依赖:Spring Web我想将它与 Azure 云上的 Kubernetes 集群一起使用。为此,我有一个 Azure Kubernetes 服务 (AKS)。我使用 jib 来构建 docker 映像。 到目前为止,一切正常。我可以将我的 docker 映像部署到 azure docker 注册表,启动一个 kubernetes 集群(带有 1 个节点),然后在调用“http://public-ip:8443/hello ”。 我使用端口 8443 但使用普通 http 以确保此端口不是我的问题的根源。
我希望我的应用程序支持 HTTPS,因此我使用 keytool 创建了一个自签名证书(如下所述:Enable HTTPS with self-signed certificate in Spring Boot 2.0)。 这在本地主机上工作正常。 它也适用于在 localhost 上运行的 minikube。 但是当我在 AKS 上使用该 docker 映像时,我的应用程序在启动后几秒钟就失败了。
我激活了
logging.level.org.apache.tomcat=DEBUG
logging.level.org.apache.catalina=DEBUG
在我的 application.properties 中。 我的应用程序的输出是:
2019-09-19 08:22:51.291 INFO 1 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 9.623 seconds (JVM running for 10.419)
2019-09-19 08:22:53.775 DEBUG 1 --- [o-8443-Acceptor] o.apache.tomcat.util.threads.LimitLatch : Counting up[https-jsse-nio-8443-Acceptor] latch=1
2019-09-19 08:22:58.764 DEBUG 1 --- [o-8443-Acceptor] o.apache.tomcat.util.threads.LimitLatch : Counting up[https-jsse-nio-8443-Acceptor] latch=2
2019-09-19 08:22:58.793 DEBUG 1 --- [nio-8443-exec-1] org.apache.tomcat.util.modeler.Registry : Managed= Tomcat:type=RequestProcessor,worker="https-jsse-nio-8443",name=HttpRequest1
2019-09-19 08:22:58.793 DEBUG 1 --- [nio-8443-exec-1] org.apache.tomcat.util.modeler.Registry : Looking for descriptor
2019-09-19 08:22:58.793 DEBUG 1 --- [nio-8443-exec-1] org.apache.tomcat.util.modeler.Registry : Introspecting
2019-09-19 08:22:58.793 DEBUG 1 --- [nio-8443-exec-1] m.m.MbeansDescriptorsIntrospectionSource : Introspected attribute virtualHost public java.lang.String org.apache.coyote.RequestInfo.getVirtualHost() null
<snipped 20 lines of "Introspected attribute xyz">
2019-09-19 08:22:58.796 DEBUG 1 --- [nio-8443-exec-1] m.m.MbeansDescriptorsIntrospectionSource : Introspected attribute lastRequestProcessingTime public long org.apache.coyote.RequestInfo.getLastRequestProcessingTime() public void org.apache.coyote.RequestInfo.setLastRequestProcessingTime(long)
2019-09-19 08:22:58.796 DEBUG 1 --- [nio-8443-exec-1] m.m.MbeansDescriptorsIntrospectionSource : Introspected attribute errorCount public int org.apache.coyote.RequestInfo.getErrorCount() public void org.apache.coyote.RequestInfo.setErrorCount(int)
2019-09-19 08:22:58.796 DEBUG 1 --- [nio-8443-exec-1] m.m.MbeansDescriptorsIntrospectionSource : Setting name: org.apache.coyote.RequestInfo
2019-09-19 08:22:58.797 DEBUG 1 --- [nio-8443-exec-1] o.a.tomcat.util.modeler.BaseModelMBean : preRegister org.apache.coyote.RequestInfo@21c6ab25 Tomcat:type=RequestProcessor,worker="https-jsse-nio-8443",name=HttpRequest1
2019-09-19 08:22:58.797 ERROR 1 --- [nio-8443-exec-1] o.a.coyote.http11.Http11NioProtocol : Error reading request, ignored
java.lang.NullPointerException: null
at org.apache.tomcat.util.net.NioEndpoint$NiosocketWrapper.getSslSupport(NioEndpoint.java:1392) ~[tomcat-embed-core-9.0.24.jar:9.0.24]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) ~[tomcat-embed-core-9.0.24.jar:9.0.24]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1593) ~[tomcat-embed-core-9.0.24.jar:9.0.24]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.24.jar:9.0.24]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.24.jar:9.0.24]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
谁能给我一个提示我的问题可能是什么? 谢谢!
【问题讨论】:
你试过 Spring Boot 2.1.7 版本吗?我遇到了类似的错误,并开始怀疑最新版本可能有问题。 我来到这里是因为遇到了同样的情况,并且回滚到 spring boot 2.1.7.RELEASE 修复了它。我不在 kubernetes 或 azure 上,而是在 localhost 上运行。到目前为止,我只在使用邮递员访问我的 API 时看到了这个问题。 【参考方案1】:这是 Apache Tomcat 9.0.24 中的 known bug。它是通过向启用了 TLS 的连接器发送纯文本来触发的。忽略它是安全的,但由于它相当嘈杂,您可能想升级到最近发布的 9.0.26,该问题已得到修复。
【讨论】:
救命答案。谢谢马克。 谢谢。我在 Spring Boot 中使用嵌入式 tomcat。我将 Spring Boot 降级为 2.1.4.RELEASE 并且它工作正常。使用的tomcat版本是9.0.17 该解决方案对我有用!谢谢!我没有降级,而是按照答案建议升级到 tomcat 的版本,并选择了最新版本:search.maven.org/search?q=a:tomcat-embed-el 我将它设置为我的 pon.xml 中的属性:`我也有同样的错误:
o.a.coyote.http11.Http11NioProtocol : Error reading request, ignored
原因是证书过期。
解决办法是更新证书。
希望这对其他人有所帮助,这让我困惑了几天。
【讨论】:
以上是关于如何修复“Http11NioProtocol:读取请求时出错,被忽略”的主要内容,如果未能解决你的问题,请参考以下文章