客户端反馈接口报错502,然后在服务端没有找到相关的请求日志。在nginx的error.log和access.log中确实发现了对应的日志。access.log记录的是502,error.log记录了原因:upstream prematurely closed connection while reading response header from upstream。想起了之前用httpclient调微信接口时也报过类似的错误,原因是用http线程池,服务端关闭了连接,而连接池不知道,发请求时触发,后续httpclient有升级进行相关检查。所以想是不是也是因为开启了keepalive的原因?
    问了运维nginx确实开启了keepalive。但这个错误并不是客户端到nginx之间的,而是nginx到upstream之间。我给运维的建议是1、设置upstream的keepalive_timeout小于tomcat的connectTimeOut值,2、把max_fails设置为3。运维只同意修改max_fails=3。
    一段时间后又查看了nginx日志,error.log中依然有错误日志,但是access.log中没有了502,因为重试后都成功了。可以看到access.log日志中的upstreamhost和upstreamtime里有了多个值,正常情况只有一个值。第一个是第一次请求时的情况,第二个值是重试的情况。
这是nginxaccess.log中相关日志
    当然修改max_fails还有一些需要注意的地方。因为nginx可能根据请求方法的不同比如是post还是get、方法返回的状态不同而决定是否进行重试。而有的重试可能会导致一些负面作用,所以对接口是否幂等需要关注下。

参考文档:
Nginx upstream长连接报错问题排查过程
Nginx+Tomcat偶现502分析

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐