nginx 502错误始终存在,而没有应用程序错误

时间:2019-08-16 10:24:40

标签: go nginx nginx-config gin

几天前,我突然遇到一个奇怪的问题。

我的应用程序已经运行了一段时间,没有任何问题。突然,我开始持续看到很多502错误。我们每分钟大约处理50000个请求,平均服务器响应时间为12毫秒。

没有应用程序崩溃(错误),nginx config还允许多达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框架。

1 个答案:

答案 0 :(得分:0)

查看每个请求的request_length,我们发现返回的请求502是POST数据大小超过200 KB左右的请求。 因此,我们使用config

client_body_buffer_size

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

  

$ request_length

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

尽管有很少的readv()错误。