首页 > 解决方案 > 应用服务无错误时发生 Jetty 内部故障(500: Response header too large)

问题描述

我在我的服务中使用了 dropwizard 框架,它使用码头作为 http 服务器。

直到今天,该服务运行良好。因为我在 Ngnix 之前添加了 squid 作为代理服务器,所以我遇到了一个奇怪的问题。

应用程序日志似乎一切正常,但我的服务客户端在特定请求中获得了 500。只有在将码头日志更改为调试模式后,我才注意到他们在调试模式下打印错误消息。(奇怪的)。

org.glassfish.jersey.message.internal.OutboundMessageContext - org.eclipse.jetty.http.BadMessageException: 500: Response header too large
java.io.IOException: org.eclipse.jetty.http.BadMessageException: 500: Response header too large
        at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:173)
        at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:441)
        at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.write(ResponseWriter.java:325)
        at java.io.ByteArrayOutputStream.writeTo(ByteArrayOutputStream.java:167)
        at org.glassfish.jersey.message.internal.CommittingOutputStream.flushBuffer(CommittingOutputStream.java:307)
        at org.glassfish.jersey.message.internal.CommittingOutputStream.commit(CommittingOutputStream.java:261)
        at org.glassfish.jersey.message.internal.CommittingOutputStream.close(CommittingOutputStream.java:276)
        at org.glassfish.jersey.message.internal.OutboundMessageContext.close(OutboundMessageContext.java:839)
        at org.glassfish.jersey.server.ContainerResponse.close(ContainerResponse.java:412)
        at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:784)
        at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444)
        at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434)
        at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
        at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
        at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
        at io.dropwizard.jetty.NonblockingServletHolder.handle(NonblockingServletHolder.java:49)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1689)
        at io.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:34)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676)
        at io.dropwizard.jersey.filter.AllowedMethodsFilter.handle(AllowedMethodsFilter.java:50)
        at io.dropwizard.jersey.filter.AllowedMethodsFilter.doFilter(AllowedMethodsFilter.java:44)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
        at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:240)
        at io.dropwizard.jetty.RoutingHandler.handle(RoutingHandler.java:51)
        at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:396)
        at io.dropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:68)
        at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:169)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
        at org.eclipse.jetty.server.Server.handle(Server.java:524)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
        at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
        at java.lang.Thread.run(Thread.java:748)
Caused by: org.eclipse.jetty.http.BadMessageException: 500: Response header too large
        at org.eclipse.jetty.http.HttpGenerator.generateResponse(HttpGenerator.java:414)
        at org.eclipse.jetty.server.HttpConnection$SendCallback.process(HttpConnection.java:690)
        at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:241)
        at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:224)
        at org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:521)
        at org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:692)
        at org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:746)
        at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:179)
        at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:163)
        ... 56 common frames omitted
Caused by: java.nio.BufferOverflowException: null
        at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:189)
        at java.nio.ByteBuffer.put(ByteBuffer.java:859)
        at org.eclipse.jetty.http.HttpGenerator.putContentLength(HttpGenerator.java:873)
        at org.eclipse.jetty.http.HttpGenerator.generateHeaders(HttpGenerator.java:785)
        at org.eclipse.jetty.http.HttpGenerator.generateResponse(HttpGenerator.java:399)
        ... 64 common frames omitted

我在日志中添加了我的响应标头大小,它是 0。此外,这个端点工作了 3 次,并且仅在第 4 次失败时工作。再次 - 应用程序返回 200 但码头插入此错误。

2020-05-18 11:04:28.747 [dw-221 - POST ------- - DEBUG - org.glassfish.jersey.tracing.general - FINISHED Response status: 200/SUCCESSFUL|OK [ ---- ms]

在客户端和我的服务之间的通信中,只有 squidNgnix 工作时,一切正常。当在中间使用 squidNgnix 时,它会失败。

此外,另一个重要信息是,当我的服务在返回结果前约 45 秒保持连接时发生故障。似乎有关 Response 标头的 Jetty 错误日志是错误的,并且发生了其他与通信有关的事情。有任何想法吗?

标签: jerseyjettydropwizardsquid

解决方案


推荐阅读