当前位置: 首页 > article >正文

Nginx后端节点的健康检查

简介本文主要介绍nginx后端节点的健康检查在此之前我们先来介绍下nignx反向代理主要使用的模块。一、nginx原生模块介绍我们在使用nginx做反向代理都会使用到以下两个模块1、ngx_http_proxy_module定义允许将请求传递到另一台服务器。此模块下常用指令如下proxy_pass proxy_cache proxy_connect_timeout proxy_read_timeout proxy_send_timeout proxy_next_upstream2、ngx_http_upstream_module用于定义可由proxy_passfastcgi_pass等指令引用的服务器组。此模块下常用指令如下upstream server ip_hash默认负载均衡配置http { upstream myapp1 { server srv1.example.com; server srv2.example.com; server srv3.example.com; } ​ server { listen 80; ​ location / { proxy_pass http://myapp1; } } }此时nginx默认的负载均衡策略是轮询外还有其他默认参数如下http { upstream myapp1 { server srv1.example.com weight1 max_fails1 fail_timeout10; server srv2.example.com weight1 max_fails1 fail_timeout10; server srv3.example.com weight1 max_fails1 fail_timeout10; } ​ server { listen 80; proxy_send_timeout60; proxy_connect_timeout60; proxy_read_timeout60; proxy_next_upstreamerror timeout; ​ location / { proxy_pass http://myapp1; } } }其中1.故障转移了解Syntax(语法): proxy_read_timeout time; Default(默认): proxy_read_timeout 60s; Context(上下文能够书写该字段的位置): http, server, location #定义从代理服务器读取响应的超时。 仅在两个连续的读操作之间设置超时而不是为整个响应的传输。 如果代理服务器在此时间内未传输任何内容则关闭连接。 ​ Syntax: proxy_connect_timeout time; Default: proxy_connect_timeout 60s; Context: http, server, location #定义与代理服务器建立连接的超时。 应该注意此超时通常不会超过75秒。 ​ ​ Syntax: proxy_send_timeout time; Default: proxy_send_timeout 60s; Context: http, server, location #设置将请求传输到代理服务器的超时。 仅在两个连续的写操作之间设置超时而不是为整个请求的传输。 如果代理服务器在此时间内未收到任何内容则关闭连接 ​ Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...; Default: proxy_next_upstream error timeout; Context: http, server, location #指定在何种情况下一个失败的请求应该被发送到下一台后端服务器 #error 和后端服务器建立连接时或者向后端服务器发送请求时或者从后端服务器接收响应头时出现错误 #timeout 和后端服务器建立连接时或者向后端服务器发送请求时或者从后端服务器接收响应头时出现超时 #invalid_header 后端服务器返回空响应或者非法响应头 #http_500 后端服务器返回的响应状态码为500 #http_502 后端服务器返回的响应状态码为502 #http_503 后端服务器返回的响应状态码为503 #http_504 后端服务器返回的响应状态码为504 #http_404 后端服务器返回的响应状态码为404 #off 停止将请求发送给下一台后端服务器从以上几个指令可以看出在默认配置下后端节点一旦出现error和timeout情况时nginx会通过proxy_next_upstream进行故障转移将发往不健康节点的请求自动转移至健康节点。其中timeout设置和proxy_send_timeout time、proxy_connect_timeout time、proxy_read_timeout time有关。除了error、timeout我们可以设置更详细的触发条件如http_502、http_503等。注意只有在没有向客户端发送任何数据以前将请求转给下一台后端服务器才是可行的。也就是说如果在传输响应到客户端时出现错误或者超时这类错误是不可能恢复的。2.健康检查Syntax: server address [parameters]; Default: — Context: upstream max_failsnumber 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内如果失败的次数达到此值Nginx就认为服务器不可用。此时在接下来的fail_timeout时间段服务器不会再被尝试。失败的尝试次数默认是1。设为0就会停止统计尝试次数即不对后端节点进行健康检查。认为服务器是一直可用的。 ​ fail_timeouttime 设定服务器被认为不可用的时间段以及统计失败尝试次数的时间段。在这段时间中服务器失败次数达到指定的尝试次数服务器就被认为不可用。 默认情况下该超时时间是10秒。以上有几点需要解释1.失败次数中的失败是怎么定义的官网解释是指由proxy_next_upstreamfastcgi_next_upstreamuwsgi_next_upstreamscgi_next_upstreammemcached_next_upstream和grpc_next_upstream指令定义也是前面说的error、time、http_xxx状态码等。2.如果mail_fail为0此时健康检查无效。因此此时整个nginx只会由proxy_next_upstream判断进行相关故障转移。小结在使用nginx上述的两个模块由以下缺点1.fail_time内的失败检测超时时间以系统设置为主效率低等待超时影响性能2.后端一旦有问题除后端禁用的fail_time时间段其他时间nginx会把请求转发给不健康节点的然后再转发给别的服务器这样以来就浪费了一次转发。因此除了上面介绍的nginx自带模块还有一个更专业的模块来专门提供负载均衡器内节点的健康检查的。这个就是淘宝技术团队开发的nginx模块。二、nginx_upstream_check_module模块高版本Nginx没有适配借助淘宝技术团队开发的nginx模快nginx_upstream_check_module来检测后方realserver的健康状态如果后端服务器不可用则会将其踢出upstream所有的请求不转发到这台服务器。当期恢复正常时将其加入upstream。在淘宝自己的tengine上是自带了该模块的大家可以访问淘宝Tengine官网来获取该版本的nginx也可以到Gitbub如果没有使用淘宝的tengine的话可以通过补丁的方式来添加该模块到我们自己的nginx中。下载地址1https://github.com/yaoweibin/nginx_upstream_check_module下载地址2https://download.csdn.net/download/m0_60821938/89913605#打补丁 #注意不同版本对应的补丁 cd nginx-1.6.0 patch -p1 ../nginx_upstream_check_module-master/check_1.5.12.patch ./configure --usernginx --groupnginx --prefix/usr/local/nginx1.6 --sbin-path/usr/local/nginx1.6 --conf-path/usr/local/nginx1.6/nginx.conf --pid-path/var/run/nginx.pid --lock-path/var/run/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_sub_module --with-pcre/usr/local/src/nginx/pcre-8.36 --with-zlib/usr/local/src/nginx/zlib-1.2.8 --add-module/usr/local/src/nginx/ngx_cache_purge-2.1 --add-module/usr/local/src/nginx/headers-more-nginx-module-master --add-module/usr/local/src/nginx/nginx_upstream_check_module-master ​ make #不要执行make install命令 ​ cd /usr/local/nginx1.6 #备份命令 cp nginx nginx.bak nginx -s stop cp -r /usr/local/src/nginx/nginx-1.6.0/objs/nginx .打完补丁后可进行如下配置http { ​ upstream cluster { ​ # simple round-robin ​ server 192.168.0.1:80; server 192.168.0.2:80; ​ check interval5000 rise1 fall3 timeout4000; ​ #check interval3000 rise2 fall5 timeout1000 typessl_hello; ​ #check interval3000 rise2 fall5 timeout1000 typehttp; #check_http_send HEAD / HTTP/1.0\r\n\r\n; #check_http_expect_alive http_2xx http_3xx; } ​ server { listen 80; ​ location / { proxy_pass http://cluster; } ​ location /status { ###openeuler中使用不正常 check_status; ​ access_log off; allow 192.168.166.1; ## 允许访问状态页面的客户端地址 deny all; } } ​ }其中Syntax: check intervalmilliseconds [fallcount] [risecount] [timeoutmilliseconds] [default_downtrue|false] [typetcp|http|ssl_hello|mysql|ajp] [portcheck_port] Default: 如果没有配置参数默认值是interval30000 fall5 rise2 timeout1000 default_downtrue typetcp 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: 指定后端服务器的检查端口。你可以指定不同于真实服务的后端服务器的端口比如后端提供的是443端口的应用你可以去检查80端口的状态来判断后端健康状况。默认是0表示跟后端server提供真实服务的端口一样。该选项出现于Tengine-1.4.0。 Syntax: check_keepalive_requests request_num Default: 1 Context: upstream 该指令可以配置一个连接发送的请求数其默认值为1表示Tengine完成1次请求后即关闭连接。 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的状态是健康的。例子如下server{ listen 80; upstream test{ server 192.168.3.12:8080 weight5 max_fails3 fail_timeout10s; server 192.168.3.13:8080 weight5 max_fails3 fail_timeout10s; check interval5000 rise1 fall3 timeout4000 typehttp default_downfalse; check_http_send HEAD /index.html HTTP/1.0\r\n\r\n; check_http_expect_alive http_2xx http_3xx; } ​ location / { ​ proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://test; proxy_next_upstream error timeout http_500 http_502 http_503; } #后端阶段健康状态监控 location /status { check_status; access_log off; } }以上我们同时使用了nginx原生的及淘宝的健康检查模块但是淘宝的间隔时是毫秒级而且可以自定义监控url定制监控页响应速度快比原生的敏感度要高。三、使用阿里巴巴的tengine实现后端节点状态检查1、安装tengineunzip tengine-3.1.0.zip cd tengine-3.1.0/ ./configure --prefix/usr/local/tengine --add-module/root/tengine-3.1.0/modules/ngx_http_upstream_check_module make make install2、修改配置文件user nginx; worker_processes 1; error_log logs/error.log info; error_log pipe:rollback logs/error_log interval1d baknum7 maxsize2G; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; access_log logs/access.log main; access_log pipe:rollback logs/access_log interval1d baknum7 maxsize2G main; sendfile on; keepalive_timeout 65; gzip on; upstream webs { server 192.168.166.10:80; server 192.168.166.13:80; check interval5000 rise1 fall3 timeout4000 typehttp default_downfalse; check_http_send HEAD /index.html HTTP/1.0\r\n\r\n; check_http_expect_alive http_2xx http_3xx; } server { listen 80; server_name localhost; location / { proxy_pass http://webs; } location /status { check_status html; access_log off; allow all; deny all; } error_page 500 502 503 504 /50x.html; location /50x.html { root html; } } }

相关文章:

Nginx后端节点的健康检查

简介 本文主要介绍nginx后端节点的健康检查,在此之前我们先来介绍下nignx反向代理主要使用的模块。 一、nginx原生模块介绍 我们在使用nginx做反向代理都会使用到以下两个模块: 1、ngx_http_proxy_module 定义允许将请求传递到另一台服务器。此模块…...

动态感受野的艺术:SKConv如何让卷积神经网络学会‘看’得更智能

1. 为什么我们需要动态感受野? 想象一下你正在看一场足球比赛。当镜头拉远时,你需要关注整个球场的大局;当镜头推近时,你又需要看清球员脚下的细节动作。传统卷积神经网络(CNN)就像戴着一副固定度数的眼镜看…...

好写作AI“学术全能工坊”:本硕博论文的智慧导航站

在学术的浩瀚海洋中,无论是本科生、硕士生还是博士生,撰写论文都是一项既具挑战性又至关重要的任务。它不仅是对知识的综合运用,更是对思维能力和研究能力的全面考验。幸运的是,好写作AI这位“学术全能工匠”,以其强大…...

漫画下载终极指南:如何从8大网站一键保存漫画到本地

漫画下载终极指南:如何从8大网站一键保存漫画到本地 【免费下载链接】comics-downloader tool to download comics and manga in pdf/epub/cbr/cbz from a website 项目地址: https://gitcode.com/gh_mirrors/co/comics-downloader 还在为在线漫画加载慢、网…...

深度解析Recaf插件化引擎:如何构建可扩展的Java字节码编辑器

深度解析Recaf插件化引擎:如何构建可扩展的Java字节码编辑器 【免费下载链接】Recaf The modern Java bytecode editor 项目地址: https://gitcode.com/gh_mirrors/re/Recaf 在Java逆向工程和字节码分析领域,Recaf作为一款现代化的Java字节码编辑…...

Xtreme Download Manager实战指南:提升下载速度与视频捕获效率

Xtreme Download Manager实战指南:提升下载速度与视频捕获效率 【免费下载链接】xdm Powerfull download accelerator and video downloader 项目地址: https://gitcode.com/gh_mirrors/xd/xdm Xtreme Download Manager(XDM)是一款功能…...

M9A:重返未来1999终极助手,三分钟解放双手的完整方案

M9A:重返未来1999终极助手,三分钟解放双手的完整方案 【免费下载链接】M9A 重返未来:1999 小助手 | Assistant For Reverse: 1999 项目地址: https://gitcode.com/gh_mirrors/m9/M9A 还在为《重返未来:1999》中重复性的日常…...

WindowResizer技术深度解析:Windows窗口强制调整的实现机制与架构设计

WindowResizer技术深度解析:Windows窗口强制调整的实现机制与架构设计 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer WindowResizer是一款基于MFC框架开发的Windows窗…...

UniApp跨端状态同步:Vuex核心模块与多端适配实战

1. Vuex在UniApp中的跨端挑战与机遇 第一次用UniApp开发跨平台应用时,我被不同端的状态同步问题折腾得够呛。H5端修改的用户信息在小程序端没更新,App端添加的购物车商品在H5端看不到。这种割裂的用户体验让我意识到,跨端状态管理不是简单的数…...

VINS-MONO实战:手把手教你理解IMU预积分中的误差传递与协方差计算

VINS-MONO实战:IMU预积分误差传递与协方差计算的工程化解析 在视觉惯性里程计(VIO)系统中,IMU预积分技术是衔接高频IMU数据与低频视觉帧的核心桥梁。当我们深入VINS-MONO的integration_base.h实现时,会发现其中关于误差…...

用ESP32打造串口数据中转站:一个MicroPython脚本桥接PC与传感器

用ESP32构建智能串口数据桥:MicroPython实战指南 在物联网开发中,经常遇到这样的场景:需要实时监控传感器数据,但又不想频繁烧录固件;或者需要调试第三方设备,却苦于没有合适的接口工具。这时候&#xff0c…...

PGP实战指南——从零开始完成PGP软件的安装与配置

1. 为什么你需要PGP加密工具 在这个数字化时代,我们的隐私数据比黄金还珍贵。你可能不知道,每天都有数以百万计的邮件、文件在不安全的网络环境中裸奔。我亲眼见过朋友因为邮件被截获导致商业机密泄露,损失惨重。PGP(Pretty Good …...

CMake与主流构建工具链(MSBuild/Ninja/Make)的协同工作原理解析

1. CMake与构建工具链的协作全景图 第一次接触CMake时,很多人会困惑为什么需要这么多工具协同工作。想象你是个包工头,CMake就是你的建筑设计软件,而MSBuild/Ninja/Make则是不同的施工队。设计图(CMakeLists.txt)只有一…...

构建堆叠+链路聚合双引擎,迈向企业网络零中断

1. 为什么企业需要"双引擎"网络架构? 记得去年帮一家跨境电商做网络升级时,他们的CTO说过一句让我印象深刻的话:"对我们来说,网络中断1分钟就意味着六位数的损失。"这其实反映了现代企业的普遍痛点——业务连…...

别只看Id和Rds!资深工程师揭秘MOS管Datasheet里那些被低估的参数(附实战避坑)

别只看Id和Rds!资深工程师揭秘MOS管Datasheet里那些被低估的参数(附实战避坑) 在电源设计和功率电子领域,MOS管的选择往往被简化为几个"明星参数"的匹配游戏——工程师们习惯性地直奔数据手册首页的导通电阻&#xff0…...

避坑指南:微信小程序+腾讯云COS上传图片,从调试到上线的完整配置流程(含域名校验与STS临时密钥)

微信小程序腾讯云COS图片上传实战:从调试到上线的避坑指南 第一次在小程序里集成腾讯云COS对象存储时,开发者往往会遇到各种意想不到的坑。本文将以实战经验为基础,分享从本地调试到正式上线的完整流程,重点解决那些官方文档没有…...

Win10/Win11游戏党必看:BoosterX一键加速实测,对比RTSS和游戏模式谁更强?

Win10/Win11游戏性能优化终极对决:BoosterX vs RTSS vs 系统自带游戏模式 作为一名深度游戏玩家,你是否经常在激烈的对战中遭遇突如其来的卡顿?或是明明配置足够却始终无法突破帧率瓶颈?今天我们就来实测三款主流游戏优化方案——…...

VMware Player虚拟机快速上手:从安装到运行全指南

1. VMware Player初体验:为什么选择它? 第一次接触虚拟机的朋友可能会问:为什么偏偏是VMware Player?这得从我的真实经历说起。去年我需要测试一个跨平台软件,但手头只有一台Windows笔记本。如果为了测试Linux和macOS环…...

避坑指南:RKNN模型转换中quantized_algorithm和target_platform参数怎么选?实测对比

RKNN模型转换实战:量化算法与硬件平台的黄金组合法则 当我们将精心训练的深度学习模型部署到瑞芯微(Rockchip)芯片时,RKNN工具链的quantized_algorithm和target_platform参数选择往往成为决定成败的关键。这两个看似简单的配置项&…...

Safari 26.4 新增 WebTransport:对 iOS WebView 的影响与落地建议

Safari 26.4 新增 WebTransport:对 iOS WebView 的影响与落地建议 近日浏览器内核更新信息显示:Safari 26.4 已新增 WebTransport 支持。这意味着在对应系统版本上,基于同内核的 Web 容器(如 WKWebView)也具备使用该能…...

告别傅里叶的局限:用Python+SciPy玩转希尔伯特变换,轻松提取信号瞬时特征

告别傅里叶的局限:用PythonSciPy玩转希尔伯特变换,轻松提取信号瞬时特征 在信号处理的世界里,傅里叶变换就像是一把瑞士军刀,几乎无处不在。但当我们面对现实世界中那些"善变"的信号——比如忽大忽小的机械振动、抑扬顿…...

手把手教你为i.MX6ULL开发板移植RTL8723BU WiFi驱动(附编译避坑指南)

i.MX6ULL开发板RTL8723BU WiFi驱动移植实战:从源码适配到编译排错全解析 当你在i.MX6ULL开发板上看到那个熟悉的WiFi模块型号——RTL8723BU时,是否已经预感到接下来将是一场与内核配置和编译错误的持久战?作为嵌入式开发者,我们都…...

别再手动装软件了!用Miniconda一键搞定转录组上游分析环境(Ubuntu 20.04保姆级教程)

告别手动安装:用Miniconda构建可复现的转录组分析环境 刚接触生物信息学的同学往往会被各种软件依赖和版本冲突折磨得焦头烂额。记得我第一次搭建转录组分析环境时,花了整整三天时间在解决各种"Command not found"和"Library not found&q…...

CSS如何限制最大最小尺寸_使用min-width与盒模型约束

min-width不生效的四大主因是盒模型设置、父容器约束、浏览器内置样式及calc()语法错误;需统一box-sizing: border-box、检查flex收缩、重置-webkit-appearance、确保calc空格与变量定义。min-width不生效?检查盒模型和父容器宽度最常见的情况是min-widt…...

AI气象大模型落地难?关键在“场景适配层”,一套架构讲清楚

2026年,如果你还在问“哪个AI气象大模型精度最高”,说明你已经落后了。 这一年,中国气象局与国家能源局联合印发《关于推进能源气象服务体系建设的指导意见》,明确提出到2027年建立一体化能源气象服务体系,推动人工智…...

ChemCrow:重新定义化学智能工作流的AI原生解决方案

ChemCrow:重新定义化学智能工作流的AI原生解决方案 【免费下载链接】chemcrow-public Chemcrow 项目地址: https://gitcode.com/gh_mirrors/ch/chemcrow-public 在当今化学研究领域,研究人员面临着一个根本性的效率瓶颈:复杂任务需要跨…...

多模态大模型如何接管K8s+Prometheus+ELK全栈运维?:从告警误报率下降92%到根因定位提速17倍

第一章:多模态大模型自动化运维方案 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型正深刻重塑企业IT基础设施的运维范式。传统基于规则与单模态日志的监控体系难以应对跨文本、图像、时序指标与拓扑图谱的联合异常推理需求。本方案融合视觉理解、自然…...

别再盯RMSE了:2026必须看的4个“业务价值指标”(附计算方法)

凌晨3点,西北某新能源基地的交易室里,专工老张对着屏幕发呆。左边A厂商的预测系统,RMSE精度行业领先,曲线光滑得像教科书——但昨天就是这套“高精度”系统,在晚高峰爬坡时段给出15MW的负偏差,导致场站被考…...

如何在Linux上运行专业图像编辑软件:Photoshop CC 2022完整安装指南

如何在Linux上运行专业图像编辑软件:Photoshop CC 2022完整安装指南 【免费下载链接】Photoshop-CC2022-Linux Installer from Photoshop CC 2021 to 2022 on linux with a GUI 项目地址: https://gitcode.com/gh_mirrors/ph/Photoshop-CC2022-Linux 想在Lin…...

HSA‑PEG‑Fe₃O₄ NPs,人血清白蛋白‑PEG‑四氧化三铁纳米颗粒,成分与性质

HSA‑PEG‑Fe₃O₄ NPs,人血清白蛋白‑PEG‑四氧化三铁纳米颗粒,成分与性质HSA-PEG-Fe₃O₄ NPs(人血清白蛋白-PEG-四氧化三铁纳米颗粒)是一类由天然蛋白质、高分子聚合物与无机磁性纳米材料协同构建的复合纳米体系,其…...