本文主要是介绍记录接口请求偶发504 Gateway Time-out问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
项目场景:
我们将服务部署到A公司服务器中,使用了共五台服务器,分别是:1.NG服务器 2.日志服务器 3.缓存服务器 4.应用服务器1 5.应用服务器2 。而请求过来首先到达的是他们的物理代理服务器,然后再转发请求到我们的ng服务器,然后再到应用服务器。
问题描述
接口请求经常会网络繁忙,报504 Gateway Time-out,然后返回了个.
原因分析:
-
网络带宽问题:
检查了下带宽,总带宽700M,峰值也才400M,同网络下其他服务并未出现该情况,所以暂时排除网络带宽问题。 -
ng配置问题:
那么有没有可能是我们ng配置问题呢,检查了下我们的nginx.conf配置文件,发现配置的worker_connections足足有10240个,和我们云服务上的一样,所以也排除掉我们ng服务的问题。 -
服务性能问题:
基本所有接口都会发生这样的问题,同一个接口同样的数据,不同时间请求是偶发的出现网络繁忙,而且我们在云服务器也部署了同样的系统,并没有出现过这样的情况,所以排除服务性能问题。 -
其他:
剩下的最大可能就是请求到达的第一个物理代理机的问题了。由于我们系统是B2B2C的,所以请求量比较大,在现场排查之后,发现大量请求停留在SYN_RECV,没有分发到我们的代理服务器去,问题确定,由于请求量大服务器负载高,每次请求过来就需要建立TCP连接,然后请求结束后又需要关闭连接,开销大。
解决方案:
调整了这个物理代理机上的nginx配置的keepalive参数,完成以下几点:
- 减少连接建立时间:
keepalive
参数允许Nginx在一定时间内保持与后端服务器的连接处于活动状态,而不是在每个请求之后立即关闭连接。这可以减少连接建立时间,因为Nginx不需要在每个请求之前重新建立TCP连接。 - 减少后端服务器负载:通过保持与后端服务器的连接处于活动状态,
keepalive
参数可以减少后端服务器的连接建立和关闭的开销。这可以降低后端服务器的负载,从而减少SYN_RECV
状态的问题。 - 优化网络带宽利用率:
keepalive
参数可以减少网络中的TCP握手和挥手消息的数量,从而优化网络带宽的利用率。这可以减少网络拥塞的可能性,从而减少SYN_RECV
状态的问题。 - 提高请求处理效率:通过保持与后端服务器的连接处于活动状态,
keepalive
参数可以提高请求处理的效率。这是因为Nginx可以在同一连接上处理多个请求,而不需要在每个请求之后重新建立连接。
之后情况大大改善,基本没有再出现过504 Gateway Time-out。
这篇关于记录接口请求偶发504 Gateway Time-out问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!