tengine配置的全局超时时间是120s,供应商说他们的请求会超过120s。于是我针对这个域名配置了相关的超时时间。配置如下:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
tengine重启后,供应商测试发现请求还是在120s后超时,返回504 gateway timeout。
这个结果我有点诧异,因为tengine这边我看日志返回的状态码是499,但是网站返回给浏览器的状态码是504。
我查看了状态码的解释:
499:服务端向客户端发送数据时,客户端已经关闭了连接。最常见的场景是timeout设置不合理,nginx把请求转发给上游服务器,上游服务器处理慢,客户端等不及主动断开了连接。客户端设置超时是60s,nginx超时是120s。
504:gateway timeout,服务器作为网关不能从上游服务器及时的得到响应返回给客户端。
我检查了下访问链路,发现链路是这样的client--->waf--->slb--->tengine--->java。
当我在本地将域名指向slb后,发现问题解决,不再超时了。可以确认问题出在waf上,我查看waf的配置后,发现有个全局超时配置,超时配置是120s。将waf上的超时配置修改后,问题得到解决。
排查问题过程中,由于链路经过多层代理,一定要弄清楚主体。
对于client来说,waf就是网关服务器,配置了超时时间120s,由于请求超过120s,waf返回504给client。
tengine作为反向代理服务器,waf是客户端,tengine是服务端,java是上游服务,由于tengine设置的超时是600s,而waf设置的是120s,超过120s后,tengine还在等待上游服务返回结果,waf已经断开连接,等到tengine收到响应返回给waf后,发现waf已经断开连接,tengine作为代理服务器返回499状态码。
正向代理:是从内网出去获取某些内容,比如内网访问外网通过一台代理服务器访问出去。VPN就是正向代理。
反向代理:代理服务器来接受internet上的连接请求,代理服务器屏蔽内部的细节。nginx作为内网的代理接受外网请求就是反向代理。
500:Internal Server Error,比如服务器内部软件有bug导致。
501:未实现,服务器不支持请求方法。
502:Bad Gateway,比如上游服务器关闭了。
503:Service Unavailable,比如上游服务器压力过载,没有足够的资源处理请求。