nginx 502 错误始终没有应用程序错误

nginx 502 errors consistently with no application errors

我运行前几天突然遇到一个st运行ge问题。

我的应用程序已经 运行 好一段时间了,没有任何问题。突然之间,我开始不断地看到大量的 502 错误。我们以每分钟大约 50000 个请求的速度运行,平均服务器响应时间为 12 毫秒。

没有应用程序恐慌(错误),nginx 配置还允许最多 10000 个工作连接。

其他配置..

sendfile        on;
keepalive_timeout  600;
server_tokens off;
client_max_body_size 20m;

任何人都可以帮助我解决问题的方向吗?我收到以下错误之一,主要是下面的第一个错误 (sendfile())。

2019/08/16 15:01:42 [error] 30#0: *60729 sendfile() failed (32: Broken pipe) while sending request to upstream, client: <IP>, server: <hostname>, request: "POST <endpoint> HTTP/1.1", upstream: "http://127.0.0.1:8080/<endpoint>", host: "<hostname>"

2019/08/16 15:01:45 [error] 30#0: *60821 readv() failed (104: Connection reset by peer) while reading upstream, client: <IP>, server: <hostname>, request: "POST <endpoint> HTTP/1.1", upstream: "http://127.0.0.1:8080/<endpoint>", host: "<hostname>"

2019/08/16 14:55:27 [error] 20#0: *42152 upstream timed out (110: Connection timed out) while reading response header from upstream, client: <IP>, server: <hostname>, request: "POST <endpoint> HTTP/1.1", upstream: "http://127.0.0.1:8080/<endpoint>", host: "<hostname>"

我们正在使用 golang 和 gin 框架,如果它有助于任何调试。

查看每个请求的 request_length,我们发现返回 502 的请求是 POST 数据大小超过 200 KB 左右的请求。 所以,我们使用了配置

client_body_buffer_size

并将其值设置为 1 MB,否则默认情况下大小为最多 2 页(在 64 位机器上为 16 KB)。如果 POST 数据超过 16 KB,它将数据存储在磁盘上的临时文件中,这会导致额外的 I/O 延迟。因此,sendfile() 失败错误立即减少为零。对于我记录的每个请求

$request_length

因此很容易从访问日志中找到所有 502 及其相应的大小

虽然 readv() 错误仍然很少。