背景及简要分析

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

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

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

  • 从文档的这两句来看,我认为 max_fails 和 proxy_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参数:

关于nginx proxy_next_upstream 重试 和 max_fails的那些事的更多相关文章

  1. nginx的重试机制以及nginx常用的超时配置说明

    nginx的重试机制 现在对外服务的网站,很少只使用一个服务节点,而是部署多台服务器,上层通过一定机制保证容错和负载均衡. nginx就是常用的一种HTTP和反向代理服务器,支持容错和负载均衡. ng ...

  2. nginx proxy_next_upstream 与openresty balancer.set_more_tries的使用

    背景 我们这边网关服务使用的 kong,前段时间上线一个服务,这个服务它报错了,产生了502的错误码,追查这个报错的时候发现了网关服务的两个可疑的地方,第一个疑点是我们在Kong上配置的 Retrie ...

  3. Nginx负载均衡的max_fails和fail_timeout的默认配置问题

    今天发现一个奇怪的现象,前端请求后端服务多次后会超时一次,经过多次验证确定是大概10s左右就会超时一次,检查后端服务,发现其中一个节点已经夯死. 但是我们的nginx负载均衡策略是轮询机制,按照配置来 ...

  4. Nginx负载均衡设置max_fails和fail_timeout

    在Nginx的负载均衡检查模块中,对于负载均衡的节点可以配置如下可选参数: max_fails=1 fail_timeout=10s 这个是Nginx在负载均衡功能中,用于判断后端节点状态,所用到两个 ...

  5. nginx动态配置及服务发现那些事

    Reference: http://xiaorui.cc/2016/10/16/nginx%E5%8A%A8%E6%80%81%E9%85%8D%E7%BD%AE%E5%8F%8A%E6%9C%8D% ...

  6. [转]nginx启动期都做了哪些事

    nginx是个多进程web容器,不同的配置下它的启动方式也是不同的,这里我只说说最典型的启动方式. 它有1个master进程,和多个worker进程(最优配置的数量与CPU核数相关).那么,首先我们要 ...

  7. 用Kubernetes部署Springboot或Nginx,也就一个文件的事

    1 前言 经过<Maven一键部署Springboot到Docker仓库,为自动化做准备>,Springboot的Docker镜像已经准备好,也能在Docker上成功运行了,是时候放上Ku ...

  8. nginx重试机制proxy_next_upstream

    nginx作为反向代理服务器,后端RS有多台服务器,上层通过一定机制保证容错和负载均衡. nginx的重试机制就是容错的一种 官方链接:http://nginx.org/en/docs/http/ng ...

  9. 【从单体架构到分布式架构】(三)请求增多,单点变集群(2):Nginx

    上一个章节,我们学习了负载均衡的理论知识,那么是不是把应用部署多套,前面挂一个负载均衡的软件或硬件就可以应对高并发了?其实还有很多问题需要考虑.比如: 1. 当一台服务器挂掉,请求如何转发到其他正常的 ...

随机推荐

  1. NPOI读写

    NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件. 在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Examples, ...

  2. JS树结构转list结构

    树转list /** * 树转list */ function treeToList(tree){ for(var i in tree){ var node = tree[i]; list = []; ...

  3. Flex,Flash,AS3,AIR的关系和区别

    转自:http://www.admin10000.com/document/156.html 本文详细介绍了 Flash.Flex.AS3.AIR 的关系和区别.希望对初学者有帮助. AS3 Acti ...

  4. 下载win10系统

    有时候想重装系统但总找不到下载的地方,今天记录一下.nsdn我告诉你,这里有许多软件下载 网站URL:https://msdn.itellyou.cn/ 我想下载一个Windows10 磁力地址 ed ...

  5. Django使用Mysql已存在数据表的方法

    在mysql数据库中已经存在有数据的表,自己又不想删除,下面方法可以同步django中创建的表 1.最好将自己建的表名改为前缀和django自动创建表名前缀相同,不改也可以,但是后期表太多容易混乱 2 ...

  6. Linux shell之重定向输入,输出

    shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户.这种对话方式可以是交互的方式(从键盘输入命令 ...

  7. 逆向破解之160个CrackMe —— 031

    CrackMe —— 031 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  8. webUploader大文件断点续传学习心得 多文件

    二.Jsp代码: <!-- 断点续传   start--> <!-- 隐藏域 实时保存上传进度 --> <input id="jindutiao" t ...

  9. nginx 常用的中间件

    1.--with-http_stub_status_module nginx客户端状态 # 打开default.conf文件 vim /etc/nginx/conf.d/default.conf # ...

  10. 4、组件注册-自定义TypeFilter指定过滤规则

    4.组件注册-自定义TypeFilter指定过滤规则 4.1 FilterType.ANNOTATION 按照注解方式 4.2 FilterType.ASSIGNABLE_TYPE 按照给定的类型 @ ...