HTTP 502“错误网关”/ writev() 失败(104:连接被对等方重置)

Lio*_*-On 6 http jetty nginx dropwizard

在此输入图像描述

我们有上面的配置,其中服务器最多处理 100 个并发请求,其中一些请求相当大:单个请求最多 3-4MB 有效负载(不使用多部分等)

这工作正常,但有时我们会从 nginx 收到错误: HTTP 502 "Bad Gateway"

在访问日志中我们看到

writev() failed (104: Connection reset by peer) while sending request to upstream

或者:recv() failed (104: Connection reset by peer) while reading response header from upstream

Java(Jetty/Dropwizard)服务器上没有错误。

我们假设这是由于 Jetty 关闭连接太快了,甚至可能在接收数据完成之前就发送了响应?!

我们尝试增加 nginx 上的缓冲区大小: client_max_body_size 24M; client_body_buffer_size 128k;

并降低 keep_alive 空闲超时(60 -> 25 秒)以避免码头提前关闭它的情况(30 秒超时): proxy_http_version 1.1; proxy_set_header Connection ""; keepalive_timeout 25;

这并没有带来改变。标题不应该太大。99.9% 的请求按预期工作(所有请求都是相似的)。

奇怪的是,升级 Dropwizard (1.2.2 -> 1.3.5) 和 Jetty (9.4.7 -> 9.4.11) 后,错误发生的频率增加了 20 倍。

我想知道下一步调查应该做什么?可能发生了什么/我们可以尝试解决方法的陷阱是什么?