nginx 判断节点失效状态:

 Nginx 默认判断失败节点状态以connect refuse和time out状态为准,不以HTTP错误状态进行判断失败,因为HTTP只要能返回状态说明该节点还可以正常连接,所以nginx判断其还是存活状态;

 除非添加了proxy_next_upstream指令设置对404、502、503、504、500和time out等错误进行转到备机处理,

 在next_upstream过程中,会对fails进行累加,如果备用机处理还是错误则直接返回错误信息(但404不进行记录到错误数,如果不配置错误状态也不对其进行错误状态记录)

 综述,nginx记录错误数量只记录timeout 、connect refuse、502、500、503、504这6种状态,timeout和connect refuse是永远被记录错误状态,

    而502、500、503、504只有在配置proxy_next_upstream后nginx才会记录这4种HTTP错误到fails中,当fails大于等于max_fails时,则该节点失效

nginx 处理节点失效和恢复的触发条件:

 nginx可以通过设置max_fails(最大尝试失败次数)和fail_timeout(失效时间,在到达最大尝试失败次数后,在fail_timeout的时间范围内节点被置为失效,除非所有节点都失效,否则该时间内,节点不进行恢复)对节点失败的尝试次数和失效时间进行设置,

 当超过最大尝试次数或失效时间未超过配置失效时间,则nginx会对节点状会置为失效状态,nginx不对该后端进行连接,直到超过失效时间或者所有节点都失效后,该节点重新置为有效,重新探测;

所有节点失效后nginx将重新恢复所有节点进行探测:

 如果探测所有节点均失效,备机也为失效时,那么nginx会对所有节点恢复为有效,重新尝试探测有效节点,如果探测到有效节点则返回正确节点内容,如果还是全部错误,那么继续探测下去,

 当没有正确信息时,节点失效时默认返回状态为502,但是下次访问节点时会继续探测正确节点,直到找到正确的为止。

一、ngx_http_proxy_module模块和ngx_http_upstream_module模块(自带)

 Nginx 在 upstream 模块中的默认检测机制:通过用户的真实请求去检查被代理服务器的可用性,这是一种被动的检测机制,通过 ngx_http_upstream_module 模块中 server 指令的指令值参数 max_fails 及 fail_timeout 实现对被代理服务器的检测和熔断。

upstream test1 {
#10s内出现3次错误,该服务器将被熔断10s
server 192.168.134.154:80 max_fails=3 fails_timeout=10s;
server 192.168.134.153:80 max_fails=3 fails_timeout=10s;
server 192.168.134.152:80 max_fails=3 fails_timeout=10s;
} server {
proxy_connect_timeout 5s;      #与被代理服务器建立连接的超时时间
proxy_read_timeout 10s;       #获取被代理服务器的响应最大超时时间,当与被代理服务器通信出现指令值指定的情况时,认为被代理出错,并将请求转发给上游服务器组中的下一个可用服务器
proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
proxy_next_upstream_teies 3;    #转发请求最大次数
proxy_next_upstream_timeout 10s;  #总尝试超时时间

  max_fails:   10s 内 Nginx 分配给当前服务器的请求失败次数累加值,每 10s 会重置为 0

  fail_timeout:既是失败计数的最大时间,又是服务器被置为失败状态的熔断时间,超过这个时间将再次被分配

  指令 proxy_connect_timeout 或 proxy_read_timeout 为超时状态时,都会触发 proxy_next_upstream 的 timeout 条件

  proxy_next_upstream:Nginx 提高请求成功率的机制,当被代理服务器返回错误并符合 proxy_next_upstream 指令值设置的条件时,将尝试转发给下一个可用的被代理服务器

 Nginx 被动检测机制的优点是不需要增加额外进程进行健康检测,但用该方法检测是不准确的。如当响应超时时,有可能是被代理服务器故障,也可能是业务响应慢引起的。

 如果是被代理服务器故障,那么 Nginx 仍会在一定时间内将客户端的请求转发给该服务器,用以判断其是否恢复。

二、nginx_upstream_check_module模块(淘宝技术团队开发)

检测后方realserver的健康状态,如果后端服务器不可用,则会将其踢出upstream,所有的请求不转发到这台服务器;当恢复正常时,将其加入upstream

upstream test1 {
server 192.168.134.154:80;
server 192.168.134.153:80;
server 192.168.134.152:80;
#每隔5秒检测一次,请求2次正常则标记 realserver状态为up,如果检测5次都失败,则标记 realserver的状态为down,超时时间为1秒,使用http协议。
check interval=5000 rise=2 fall=5 timeout=1000 type=http;
check_http_send"HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
Syntax:  check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]
Default: 如果没有配置参数,默认值是:interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp
Context: upstream

参数说明:

参数 描述
interval 向后端发送的健康检查包的间隔
fall(fall_count) 如果连续失败次数达到fall_count,服务器就被认为是down
rise(rise_count) 如果连续成功次数达到rise_count,服务器就被认为是up
timeout 后端健康请求的超时时间,单位毫秒
default_down 设定初始时服务器的状态,如果是true,就说明默认是down的,如果是false,就是up的。默认值是true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的
type 健康检查包的类型,现在支持以下多种类型:
  tcp:简单的tcp连接,如果连接成功,就说明后端正常
  ssl_hello:发送一个初始的SSL hello包并接受服务器的SSL hello包
  http:发送HTTP请求,通过后端的回复包的状态来判断后端是否存活
  mysql: 向mysql服务器连接,通过接收服务器的greeting包来判断后端是否存活
  ajp:向后端发送AJP协议的Cping包,通过接收Cpong包来判断后端是否存活
  port: 指定后端服务器的检查端口。可以指定不同于真实服务的后端服务器的端口,默认是0,表示跟后端server提供真实服务的端口一样
Syntax: check_http_send http_packet
Default: "GET / HTTP/1.0\r\n\r\n"
Context: upstream
#该指令可以配置http健康检查包发送的请求内容。为了减少传输数据量,推荐采用"HEAD"方法。
#当采用长连接进行健康检查时,需在该指令中添加keep-alive请求头,如:"HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"。
#同时,在采用"GET"方法的情况下,请求uri的size不宜过大,确保可以在1个interval内传输完成,否则会被健康检查模块视为后端服务器或网络异常。
Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]
Default: http_2xx | http_3xx
Context: upstream
#该指令指定HTTP回复的成功状态,默认认为2XX和3XX的状态是健康的。
Syntax: check_shm_size size
Default: 1M
Context: http
#所有的后端服务器健康检查状态都存于共享内存中,该指令可以设置共享内存的大小。默认是1M,如果有1千台以上的服务器并在配置的时候出现了错误,就可能需要扩大该内存的大小。
Syntax: check_keepalive_requests request_num
Default: 1
Context: upstream
#该指令可以配置一个连接发送的请求数,其默认值为1,表示Tengine完成1次请求后即关闭连接。
Syntax: check_status [html|csv|json]
Default: check_status html
Context: location
#显示服务器的健康状态页面。该指令需要在http块中配置。在Tengine-1.4.0以后,可以配置显示页面的格式。支持的格式有: html、csv、 json。默认类型是html。

 配置时需注意:

  1)type:由于默认的type是tcp类型,因此假设服务启动,不管是否初始化完毕,它的端口都会起来,所以此时前段负载均衡器为认为该服务已经可用,其实是不可用状态。

  2)check_http_send:默认值是"GET / HTTP/1.0\r\n\r\n" 假设应用是通过http://ip/name访问的,那么这里check_http_send值就需要更改为 "GET /name HTTP/1.0\r\n\r\n"才可以。

    针对采用长连接进行检查的, 增加 keep-alive请求 头,即"HEAD /name HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"。

    如果后端的tomcat是基于域名的多虚拟机,此时需要通过 check_http_send定义host,不然每次访问都是失败,范例:check_http_send "GET /test HTTP/1.0\r\n HOST wwwnginx.com\r\n\r\n";

三、ngx_http_healthcheck_module

 官方在早期的时候提供的用来进行nginx后端节点的健康检查,nginx_upstream_check_module模块就是参照该模块的设计理念进行开发的,因此在使用和效果上都大同小异。

 ngx_http_healthcheck_module模块仅仅支持nginx的1.0.0版本,1.1.0版本以后都不支持了,这里不做阐述。

Nginx--upstream健康检查的更多相关文章

  1. nginx backend 健康检查

    ngx_http_proxy_module 模块和ngx_http_upstream_module模块(自带) 严格来说,nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的n ...

  2. nginx check健康检查

    nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况 大家都知道,前段nginx做反代,如果后端服务器宕掉的话,nginx是不能把这台realser ...

  3. nginx之健康检查

    正常情况下,nginx做反向代理,如果后端节点服务器宕掉的话,nginx默认是不能把这台realserver踢出upstream负载集群的,所以还会有请求转发到后端的这台realserver上面,这样 ...

  4. nginx的健康检查功能将挂掉的Tomcat舍弃

    1.Ngninx自带健康检查功能,能将挂掉的服务器舍弃,不在访问路径里 2.Nginx还有URL重写功能,能将接收到的请求,进行改写,再将新的URL分发到后端服务器上

  5. nginx.conf配置文件里的upstream加入健康检查

    查看NGINX启用了那些模块: # ./nginx -V Tengine version: Tengine/ (nginx/) built by gcc (Red Hat -) (GCC) TLS S ...

  6. Nginx负载均衡后端健康检查(支持HTTP和TCP)

    之前有一篇文章记录nginx负载均衡后端检查,链接为 https://www.cnblogs.com/minseo/p/9511456.html 但是只包含http健康检查不包含tcp下面安装ngin ...

  7. consul集群搭建,配合nginx完成服务动态发现和健康检查

    1.概述 1.1 介绍 consul是一个服务发现和配置共享的服务软件,结合nginx的主动健康检查模块nginx_upstream_check_module和服务发现模块nginx-upsync-m ...

  8. nginx限流&健康检查

    Nginx原生限流模块: ngx_http_limit_conn_module模块 根据前端请求域名或ip生成一个key,对于每个key对应的网络连接数进行限制. 配置如下: http模块   ser ...

  9. nginx健康检查模块源码分析

    nginx健康检查模块 本文所说的nginx健康检查模块是指nginx_upstream_check_module模块.nginx_upstream_check_module模块是Taobao定制的用 ...

  10. Nginx健康检查模块

    在本小节我们介绍一个用于Nginx对后端UpStream集群节点健康状态检查的第三方模块:nginx_upstream_check_module(https://github.com/yaoweibi ...

随机推荐

  1. 你真的了解@Async吗?

    使用场景: 开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送.商品同步等都可以使用异步方法,这时我们可以用到@Async.但是直接使用 @Async 会有风险,当我们没有指定线程 ...

  2. 四载磨砺,一群青年“识瘤者”以AI助力医疗创新

    ​​本文分享自华为云社区<[先锋开发者云上说]四载磨砺,一群青年"识瘤者"以AI助力医疗创新>,作者:Gauss松鼠会小助手2 . 一群青年"识瘤者" ...

  3. 机器人的运动范围(dfs)(leetcode 4.8 每日打卡)

    地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动到方格外),也不能进入行坐标和列 ...

  4. 快速排序(quick_sort)

    快速排序大体分为三个步骤: 1.确定分界点 q[(l+r) >> 1] 或者 q[(l+r+1) >> 1] ,两者得看情况而定,不能用 q[l] 或者 q[r] 了 因为会超 ...

  5. Ubuntu 20.04 使用 socat 转发特定端口

    安装socat apt install socat 根据需求确定要转发的端口 比如,我的需求是监听IPv6的某一TCP端口,并转发至局域网内某一特定主机,可以使用以下命令: socat TCP6-LI ...

  6. python之猜数字小游戏

    import random#随机数函数 a = random.randint(0, 50)#随机0-50之内的整数 print('------------------SWS工作室----------- ...

  7. 如何用java的虚拟线程连接数据库

    我觉得这个很简单 首先确保你idea支持jdk21. 然后把idea编译成的目标字节码设置为21版本的 然后编写代码. 创建虚拟线程的方式有: Runnable runnable = () -> ...

  8. java监听全局组合键

    1. jintellitype pom <!-- 不能注册多个组合键比如alt+abc --> <!-- https://mvnrepository.com/artifact/com ...

  9. Javascript Ajax总结——XMLHttpRequest对象

    Ajax技术能向服务器异步请求额外的数据,会带来更好的用户体验.Ajax技术核心:XMLHttpRequest对象(简称XHR).XHR为向服务器发送请求和解析服务器响应提供了流畅的接口.1.创建XM ...

  10. 在k8s中快速搭建基于Prometheus监控系统

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享 前言 K8s本身不包含内置的监控工具,所以市场上有不少这样监控工具来填补这一空白,但是没有一个监控工具有prometheus ...