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

标签 go nginx nginx-config go-gin

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

我的应用程序已经运行了一段时间,没有出现任何问题。突然间,我开始持续看到大量 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/

相关文章:

validation - 在 go 中验证 http 请求的惯用方法

php -v 和 php-fpm -v 显示不同版本的 php

angular - NGiNX - 没有为错误返回足够的 header (4xx,5xx)与成功(2xx)

ssl - 如何修复 nginx 多域 SSL 错误

nginx - 如何增加Nginx服务器上传图片的大小?

docker - webdevops nginx-从网址中删除.php要求

go - 手动下载并放置一个 golang mod 文件

arrays - Golang的 "cap"

go - 在没有锁的情况下并发读取函数指针是否安全?

ubuntu - Nginx 作为虚拟主机和反向代理