Nginx:max_fail和fail_timeout没那么简单

2024-04-26 23:44
文章标签 简单 nginx fail max timeout

本文主要是介绍Nginx:max_fail和fail_timeout没那么简单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

今天遇到了一个nginx的问题,稍微深入了解了一下nginx的原生健康检测机制,就在那一刻才发现自己太过迷恋tengine的http_upstream_check_module了,对原生的健康检测有误解。

我一直认为:原生的nginx只能做tcp检测。

我一直认为:原生的nginx在检测后端服务失败后,就会将后端节点踢掉。

我一直认为:fail_timeout是每次检测的超时时间,max_fail是检测的次数。

全NM是误解,C了。

max_fail和fail_timeout

理解

官方文档的位置 https://nginx.org/en/docs/http/ngx_http_upstream_module.html

#样例:upstream backend {server backend1.example.com weight=5;server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;server unix:/tmp/backend3;server backup1.example.com  backup;
}

max_fails:是失败次数;

fail_timeout:  fail_timeout时间内如果失败了max_fails次,就会将节点标记为不可用。不可用的时间为fail_timeout 。 这就轮回起来了。

当max_fails为0的时候,就相当于关闭健康检测了。

怎么判断失败呢

有一个参数 proxy_next_upstream ,他的默认值是error和timeout,  也就是说当建立连接的时候超时或者是报错,就认为这个节点失败的。

我们此处可以看到也有一些http的状态检测的手段,所以说原生的健康检测也能做七层的检测。

超时时间

既然超时算是失败,那么超时时间是多少呢?这个就比较讲究了。

由proxy_connect_timeout(默认60s)和 net.ipv4.tcp_syn_retries (操作系统的,默认是6)这两个参数中较小的决定。

net.ipv4.tcp_syn_retries是当upstream中的server不返回ack的时候,重传syn的次数,默认是6次,6次的耗时是:1s,2s,4s,8s,16s,32s。 然后64s 后尝试另一个server。这样加起来差不多2m左右。

我们最好使用proxy_connect_timeout和proxy_send_timeout(这个我目前还不确定,会不会增加失败次数)来决定超时时间。

这两个值我觉得设置比较小就可以,因为后端服务如果在几秒内还没有接收请求或者建立连接,说明它已经很忙了,我们就可以尝试其他的server,或者返回给前端 502(前端可以设置一些策略,比如重试+按钮转圈+美好的提示等)来提供客户的体验,这样比等着好,因为用户越等越急,可能会暴躁的连击几下按钮,服务就更慢了。

fail_timeout要根据proxy_connect_timeout 和你的服务性能来配置。

如果你的服务平均响应时长是30s,而你的proxy_connect_timeout是5s,那么你接收到的响应肯定都是504 。

如果proxy_connect_timeout是10s,fail_timeout设置了一个1s, 那么这个节点永远不会被标记为不可用,当服务hang住的时候,你每次请求都要等待proxy_connect_timeout后才能尝试下一个server。

proxy_next_upstream_timeout 

这个参数意思是:在上一个server失败了以后,需要等待proxy_next_upstream_timeout时间后,再尝试下一个server。

一个节点的情况

当upstream下只配置一个server的时候,这个server不会被标记为不可用,如果这个节点hang住了,你每次请求都要等待超时。 当你的proxy_connect_timeout比较大的时候,就更悲催了。别问我是怎么知道的。。。555....

http_upstream_check_module

# http check
upstream student-service-api {server 172.26.34.101:9050;check interval=3000 rise=2 fall=5 timeout=1000 type=http;check_http_send "HEAD /health/check/status HTTP/1.0\r\n\r\n";check_http_expect_alive http_2xx http_3xx;
}
upstream  nerf {server 172.16.0.249:8091 weight=1;server 172.16.1.246:9019 weight=4;check interval=1000 rise=2 fall=5 timeout=10000 type=tcp;
}

这是tengine的健康检测模块,他和nginx原生额最大区别就是,他是主动检测的。所以,他不会出现上面一个节点不可能用时,仍然要等待超时的问题。再就是节点不可用的时候,他会打印error l日志,对于用户来说比较友好。

如何模拟服务hang的情况

一个比较无脑的方法:

# 记得 net.ipv4.ip_forward = 1
docker run -itd docker.io/centos:7 -p 10811:10811 bash

然后进入容器:

python -m SimpleHTTPServer 10811

然后回到服务器上

iptables -F

然后10811服务就会hang住了。

如何模拟500报错的服务的情况

# 记得 net.ipv4.ip_forward = 1
docker run -itd docker.io/centos:7 -p 10811:10811 bash

然后进入容器,创建一个python脚本

from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer
import sysclass CustomHTTPRequestHandler(SimpleHTTPRequestHandler):def do_GET(self):if self.path == '/':self.send_response(500)self.end_headers()self.wfile.write('Internal Server Error')else:super(CustomHTTPRequestHandler, self).do_GET()def run(server_class=BaseHTTPServer.HTTPServer, handler_class=CustomHTTPRequestHandler):server_address = ('', 10811)httpd = server_class(server_address, handler_class)print 'Starting httpd on port %d...' % server_address[1]httpd.serve_forever()if __name__ == '__main__':run()

然后执行脚本,就可以了。

##

祝你好运

# 有问题可以进群聊聊

614809646  qq群->数字人和tts,运维、开发等等

这篇关于Nginx:max_fail和fail_timeout没那么简单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938990

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

回调的简单理解

之前一直不太明白回调的用法,现在简单的理解下 就按这张slidingmenu来说,主界面为Activity界面,而旁边的菜单为fragment界面。1.现在通过主界面的slidingmenu按钮来点开旁边的菜单功能并且选中”区县“选项(到这里就可以理解为A类调用B类里面的c方法)。2.通过触发“区县”的选项使得主界面跳转到“区县”相关的新闻列表界面中(到这里就可以理解为B类调用A类中的d方法

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

宝塔面板部署青龙面板教程【简单易上手】

首先,你得有一台部署了宝塔面板的服务器(自己用本地电脑也可以)。 宝塔面板部署自行百度一下,很简单,这里就不走流程了,官网版本就可以,无需开心版。 首先,打开宝塔面板的软件商店,找到下图这个软件(Docker管理器)安装,青龙面板还是安装在docker里,这里依赖宝塔面板安装和管理docker。 安装完成后,进入SSH终端管理,输入代码安装青龙面板。ssh可以直接宝塔里操作,也可以安装ssh连接

设置Nginx缓存策略

详细信息 Nginx服务器的缓存策略设置方法有两种:add_header或者expires。 1. add_header 1)语法:add_header name value。 2)默认值:none。 3)使用范围:http、server、location。 配置示例如下: add_header cache-control "max-age=86400";#设置缓存时间为1天。add

XMG Quartz2D的简单使用

// //  Quratz2DView.m //  Quartz2D // //  Created by 王宁 on 16/5/6. //  Copyright © 2016年 ylshmacmini. All rights reserved. // #import "Quratz2DView.h" //Quartz@2D是一个二维绘图引擎,同时支

网页脚本输入这么简单

如何在网页中进行脚本操作呢? 研究了一下,很简单,用google浏览器的Console直接操作javaScript。思路: Created with Raphaël 2.1.0 开始 输入(如何输入) 点击(如何点击) 结束 下面是,通过脚本刷直播屏的实现,直接在Console输入即可 var words=new Arra

Docker Compose--安装Nginx--方法/实例

原文网址:Docker Compose--安装Nginx--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker Compose如何安装Nginx。 目录结构 ├── config│   ├── cert│   │   ├── xxx_bundle.pem│   │   └── xxx.key│   ├── conf.d│   └── nginx.co

nginx 8051#0: *4 recv() failed (104: Connection reset by peer) while reading response header from u

环境    php7   nginx1.8.0    nginx   报错  500  GATWAY网关错误 2017/08/28 10:45:42 [error] 7975#0: *333 recv() failed (104: Connection reset by peer) while reading response header from upstream, clien