几天前我突然遇到了一个奇怪的问题。
我的应用程序已经运行了一段时间,没有出现任何问题。突然间,我开始持续看到大量 502 错误。我们的运行速度约为每分钟 50000 个请求,平均服务器响应时间为 12 毫秒。
没有应用程序 panic (错误),并且 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() 错误仍然很少。
关于go - nginx 502 错误始终存在,没有应用程序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57522982/