天天看点

Nginx返回400 Bad Request故障排查

系统环境

服务端:K8s集群使用Nginx Ingress Controller,并且支持http2

客户端:golang version 1.9.2,且使用http2

故障现象

Nginx偶发400 Bad Request,绝大部分请求正常返回200

故障排除步骤

(1)故障复现

使用golang http2 client,每个请求post相同的数据,直到response 400;查询nginx日志,response为400时,对应的request_length明显小

(2)开启nginx debug

本文使用的是Nginx Ingress Controller,开启debug的方式如图所示,修改deployment,增加参数“--v=5”,不过要注意,修改deployment后容器会重启,本文复现故障是在测试环境中。

Nginx返回400 Bad Request故障排查

根据response为400的时间,发现这样的info级别日志:client prematurely closed stream: only 0 out of 1125 bytes of request body received

即nginx收到的http header content-length是1125字节,但是http body里却是0字节

(3)查看客户端问题

打开客户端debug,env GODEBUG=http2debug=2 go test --timeout 30m -v test.go >> test.log 2>&1 

debug日志中正常request信息如下图,而异常的request没有红线标识那行信息,即data并没有发出

Nginx返回400 Bad Request故障排查

(4)问题解决

按照https://github.com/golang/go/issues/25009的讨论,问题在于GOROOT目录下src/net/http/transport.go;修改之后GOROOT重新build,问题解决

继续阅读