关于nginx proxy_next_upstream 重试 和 max_fails的那些事

胡班
• 阅读 4239

背景及简要分析

前几天一次故障定位的时候发现,后端服务(java)在从故障中恢复之后,会出现大量499,且会持续较长时间无法自行恢复。
根本原因是服务容量问题,处理太慢导致客户端等不了了,主动断开。不过分析一下直接原因大概有这几点:

  1. nginx超时配置的比客户端长,导致客户端都499超时了,nginx还没超时。
  2. nginx的重试机制和max_fails机制配置不当,在一定程度上加剧了后端的恶性循环。

在学习了解了nginx相关机制、参数的时候,和同事在 proxy_next_upstreammax_fails 这两个参数之间产生了分歧。

  • 从文档的这两句来看,我认为 max_failsproxy_next_upstream 是强相关的,关闭了后者,前者会失效。
  • 同事则认为,这两者无关,即使关掉了重试也不会影响fails摘节点。

各执己见的情况下,自然就是上配置测试了。

nginx相关配置、参数

proxy_next_upstream

max_fails

proxy_connect_timeout

Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location

Defines a timeout for establishing a connection with a proxied server. It should be noted that this timeout cannot usually exceed 75 seconds.
http://nginx.org/en/docs/http...

本次的大量499问题就是这个连接超时配置不当的锅。
之前配置为3秒,也就是说如果一个上游服务有问题时,客户端必须等3秒以上。这还只是建立连接的时间。
从日志中推测,客户端的超时时间应该在3-6秒之间(应该是5s)【由于客户端不是app所以和一般的客户端超时不同】

nginx和服务如果都是内网的、同IDC,建立连接很快(ms级别),这个参数不必设置的太大。个人认为应该在500ms以下。当然,如果后端服务是外网的则另当别论了。
个人认为,服务端的超时时间应当是比客户端短的,这样在服务端某个节点有问题的时候,nginx还有时间去重试下一台。

proxy_[send/read]_timeout

测试过程

nginx版本: tengin 2.2.0
nginx参数:

结论

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
JDK默认使用random生成随机数,生成的速度很慢
现场在报错时间,有大量的Oracle请求超时,并主动断开与SERVER的连接。Oracle错误WARNING:inboundconnectiontimedout(ORA3136)。分析结果如下:执行自动任务调度的功能,在执行存储过程时,会新建一个连接,连接ORACLE服务器,客户端要生成随机密钥用于客户端认证,JDK默认使用/de
Stella981 Stella981
3年前
API网关【gateway 】
最近在公司进行API网关重写,公司内采用serverMesh进行服务注册,调用,这里结合之前学习对API网关服务进行简单的总结与分析。由于采用了大量的nginx相关的东西,所以在此记录一下:在nginx使用openresty加入nginx模块编辑nginx下conf配置文件nginx.confvinginx.c
Stella981 Stella981
3年前
Nginx proxy_set_header 理解
用户认证接口:根据客户端IP和port,进行IP反查和端口范围确认,如符合则用户认证通过。当前使用的是Nginx负载均衡,从客户端到Nginx端ip和port都对,从Nginx到应有服务器上port端口变成很奇怪的端口号。真是遇到的问题,登录页的ip和port在登录验证没有问题,但在登录完成后跳转的时候,端口号发生了变化。跟nginx服务器
Stella981 Stella981
3年前
Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程
线上某服务A调用服务B接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务B接口频繁超时,后续甚至返回线程池耗尽错误ThreadpoolisEXHAUSTED。因为服务B依赖外部接口,刚开始误以为外部接口延时导致,所以临时增加服务Bdubbo线程池线程数量。配置变更之后,重启服务,服务恢复正常。一段时间之后,服务B
Stella981 Stella981
3年前
Nginx升级Keepalive_Requests默认值变更
T婶早上同步了一个消息, Nginx代理和Upstream服务器之间在某种情况下一直发connection:close。Nginx从1.13.6升级到了1.15.8出现的问题,T婶牺牲了午休的时间堵上的这个坑,其根本原因,是升级到1.15.8之后,Nginx的长链接Keepalive\_Requests的默认值变成了:100。 过个这个极值就
Stella981 Stella981
3年前
Nginx 故障转移和故障自动恢复
当上游服务器(真实访问服务器)一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用 。location/{指定上游服务器负载均衡服务器proxy_passhttp://Site;于192.168.1.123后端服务器连接的超时时间_发起握手等候响
Stella981 Stella981
3年前
Mongodb特定场景性能数十倍提升优化实践(记一次mongodb核心集群雪崩故障)
1\.问题背景某核心JAVA长连接服务使用mongodb作为主要存储,客户端数百台机器连接同一mongodb集群,短期内出现多次性能抖动问题,此外,还出现一次“雪崩”故障,同时流量瞬间跌零,无法自动恢复。本文分析这两次故障的根本原因,包括客户端配置使用不合理、mongodb内核链接认证
Stella981 Stella981
3年前
NTP服务导致的dubbo服务停止后无法摘除节点
20200630晚上22:40左右出现大量的dubbo接口超时。原因是NTP服务出现时间差,与真实的北京时间差了正好8小时,开始出问题的时间段,NTP服务由VM虚拟机切换到PVE虚拟机,但是切换机器之后没有调整好时间,导致所有机器节点的时间全部出现问题。2020063022:45左右,将PVE虚拟机NTP服务回切至VM虚拟机,NTP服务
Stella981 Stella981
3年前
Nginx
!(https://imagestatic.segmentfault.com/255/117/25511790966008dc5b00fd8)Nginx进程模型分析在介绍Nginx的进程模型之前我们先来给大家解释下一些常见的名词,这能辅助我们更好的了解Nginx的进程模型。作为Web服务器,设计的初衷就是为了能够处理更多的客户端的请
记录一次RPC服务有损上线的分析过程
1\.问题背景某应用在启动完提供JSF服务后,短时间内出现了大量的空指针异常。分析日志,发现是服务依赖的藏经阁配置数据未加载完成导致。即所谓的有损上线或者是直接发布,当应用启动时,service还没加载完,就开始对外提供服务,导致失败调用。关键代码如下数据
京东云开发者 京东云开发者
8个月前
记录一次RPC服务有损上线的分析过程
作者:京东零售郭宏宇1.问题背景某应用在启动完提供JSF服务后,短时间内出现了大量的空指针异常。分析日志,发现是服务依赖的藏经阁配置数据未加载完成导致。即所谓的有损上线或者是直接发布,当\\\\应用启动时,service还没加载完,就开始对外提供服务,导致
胡班
胡班
Lv1
骋望因高云外尽,乡关回首愧烟萝。
文章
4
粉丝
0
获赞
0