Nginx健康检查。及时、准确的感知service节点的健康状况
Nginx 提供了三种HTTP服务健康检查方案供用户选择:
-
TCP层默认检查方案:
定时与后端服务建立一条
tcp连接
,链接建立成功则认为服务节点是健康的。 -
HTTP层默认检查方案:
TCP层检查有一定的局限性:
-
很多HTTP服务是带状态的,端口处于listen状态并不能代表服务已经完成预热;
-
不能真实反映服务内部处理逻辑是否产生拥堵。
-
这时可以选择
http层
健康检查,会向服务发送一个http请求GET / HTTP/1.0\r\n\r\n
,返回状态是2xx或3xx时认为后端服务正常。
-
- 自定义方案:
- 可根据下文描述自定义检查方案
一个常用的健康检查配置如下:
check fall=3 interval=3000 rise=2 timeout=2000 type=http; check_http_expect_alive http_2xx http_3xx ; check_http_send "GET /checkAlive HTTP/1.0\r\n\r\n" ;
下面针对每个配置参数,进行详细介绍。
check:
check 字段参数如下:
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
check
字段各个参数含义如下:
-
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
: 指定后端服务器的检查端口。可以指定不同于真实服务的后端服务器的端口,比如后端提供的是443端口的应用,你可以去检查80端口的状态来判断后端健康状况。
默认是0,表示跟后端server提供真实服务的端口一样。
check_http_expect_alive:
check_http_expect_alive
指定主动健康检查时HTTP回复的成功状态:
Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]
Default: http_2xx | http_3xx
check_http_send:
check_http_send
配置http健康检查包发送的请求内容
为了减少传输数据量,推荐采用”HEAD”方法。当采用长连接进行健康检查时,需在该指令中添加keep-alive请求头,如:”HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n”。同时,在采用”GET”方法的情况下,请求uri的size不宜过大,确保可以在1个interval内传输完成,否则会被健康检查模块视为后端服务器或网络异常。
Syntax: check_http_send http_packet Default: "GET / HTTP/1.0\r\n\r\n"
完整示例,如下:
http { upstream cluster1 { # simple round-robin server 192.168.0.1:80; server 192.168.0.2:80; check interval=3000 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; } upstream cluster2 { # simple round-robin server 192.168.0.3:80; server 192.168.0.4:80; check interval=3000 rise=2 fall=5 timeout=1000 type=http; check_keepalive_requests 100; check_http_send "HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; } server { listen 80; location /1 { proxy_pass http://cluster1; } location /2 { proxy_pass http://cluster2; } location /status { check_status; access_log off; allow SOME.IP.ADD.RESS; deny all; } } }
节选自https://ningg.top/nginx-series-health-check/
原文地址:https://www.cnblogs.com/woshijiuke/p/12923403.html
- 洛谷P1962 斐波那契数列(矩阵快速幂)
- 负载均衡https转发会让服务器误判
- 凯撒加密之一个神奇的Python的API
- 10分钟搞懂TensorBoard用法
- 【最新TensorFlow1.4.0教程02】利用Eager Execution 自定义操作和梯度 (可在 GPU 运行)
- 清北集训Day1T3 LYK loves jumping(期望DP)
- C#进阶系列——WebApi 接口参数不再困惑:传参详解上
- MySQL之多表查询
- 万能pb_ds头文件—bits/extc++.h
- 区块链开发之Go语言—文件系统
- MySQL之单表查询
- C#进阶系列——WebApi 接口参数不再困惑:传参详解 下
- 区块链开发之Go语言—字符串和字节
- MySQL之表的约束
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- xmuC语言程序实践week 2 大作业
- redis学习(二十三)
- Vue 轻量级后台管理系统基础模板
- R语言对混合分布中的不可观测与可观测异质性因子分析
- JavaScript同步、异步及事件循环
- Node.js开发人员都应该知道的12个有用的包
- 欧拉函数的几条重要性质
- 迷宫问题的简单栈实现
- xmuC语言程序实践week 3 大作业
- xmuC语言程序实践week 4 大作业
- R语言预测人口死亡率:用李·卡特(Lee-Carter)模型、非线性模型进行平滑估计
- 前端的发展历程
- R语言蒙特卡洛计算和快速傅立叶变换计算矩生成函数
- Visual Studio 中万能头文件编译不了的解决方案
- Difference in two ways of using lower_bound [C++]std::set::lower_bound与std::lower_bound