Nginx 负载均衡集群 节点健康检查
前言
正常情况下,nginx 做反向代理负载均衡的话,如果后端节点服务器宕掉的话,nginx 默认是不能把这台服务器踢出 upstream 负载集群的,所以还会有请求转发到后端的这台服务器上面,这样势必造成网站访问故障
注:实际上不仅是后端节点宕掉需要踢出集群,如果说我们发布服务,那么节点服务启动和关闭也是需要时间的,此时也需要踢出和加入集群操作
请求转发
最简单的做法就是使用 proxy_next_upstream,实现请求转发,就是在 localtion 中启用 proxy_next_upstream 来解决返回给用户的错误页面,示例如下:
location /
{
# 如果后端的服务器返回502、504、执行超时等错误
# 自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
}
虽然这样问题可以解决,但是请求还是会转发给这台服务器,然后再转发给别的服务器,这样以来就浪费了一次转发,会损耗网站性能
健康检查
为了避免上述问题,我们可以对后端节点进行节点检查,目前主要有如下三种方式可以实现对 nginx 负载均衡的后端节点服务器进行健康检查
-
nginx 自带模块ngx_http_proxy_module 和 ngx_http_upstream_module
-
ngx_http_healthcheck_module 模块,这是 nginx 官方早期推出的健康检查的模块,但是目前仅支持 nginx 的 1.0.0 版本,1.1.0 版本以后均不支持,常见的生产环境上基本不会使用该模块
-
淘宝技术团队开发的 nginx_upstream_check_module 模块,更加专业
本次我们使用第三种方法实现节点健康检查
淘宝技术团队开发的 nginx 模快 nginx_upstream_check_module 可以检测后方 realserver 的健康状态,如果后端服务器不可用,则会将其踢出 upstream,所有的请求不转发到这台服务器。当期恢复正常时,将其加入 upstream
在淘宝自己的 tengine 上是自带了该模块的,大家可以访问淘宝 tengine 来获取安装,如果没有使用淘宝的 tengine 的话,也可以通过补丁的方式来添加该模块到 nginx 中
本文为了演示简便,将会使用 tengine 作为示例,当然文末也会附上如何在原生 nginx 集成该模块
安装 Tengine
系统:CentOS 7.6
环境准备
yum -y install gcc-c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
下载解压
cd /usr/local/src/
wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gztar -zxvf tengine-2.3.2.tar.gz
cd /usr/local/src/tengine-2.3.2
编译安装
使用下面命令,Tengine 默认将安装在 /usr/local/nginx
目录。你可以用’–prefix’来指定你想要的安装目录
$ ./configure --add-module=./modules/ngx_http_upstream_check_module --add-module=./modules/ngx_http_upstream_session_sticky_module --add-module=./modules/ngx_http_upstream_dynamic_module
$ make && sudo make install
注:淘宝的 Tengine 升级到 2.3.0 或者2.3.1 都不再默认安装健康检查模块
编译安装之后输出如下文件位置
nginx path prefix: "/usr/local/nginx"nginx binary file: "/usr/local/nginx/sbin/nginx"nginx modules path: "/usr/local/nginx/modules"nginx configuration prefix: "/usr/local/nginx/conf"nginx configuration file: "/usr/local/nginx/conf/nginx.conf"nginx pid file: "/usr/local/nginx/logs/nginx.pid"nginx error log file: "/usr/local/nginx/logs/error.log"nginx http access log file: "/usr/local/nginx/logs/access.log"nginx http client request body temporary files: "client_body_temp"nginx http proxy temporary files: "proxy_temp"nginx http fastcgi temporary files: "fastcgi_temp"nginx http uwsgi temporary files: "uwsgi_temp"nginx http scgi temporary files: "scgi_temp"
配置后台
vim /usr/lib/systemd/system/nginx.service[Unit]
Description=nginx
After=network.target[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true[Install]
WantedBy=multi-user.target
之后即可使用 systemctl 设置 nginx 开启,关闭,开机自启等
nginx 配置文件路径 /usr/local/nginx/conf/nginx.conf
可以配置节点健康检查如下
http {upstream cluster1 {server 172.25.234.148:9001;server 172.25.234.148:9002;check interval=3000 rise=2 fall=3 timeout=1000 type=http;check_http_send "HEAD /actuator/health HTTP/1.0\r\n\r\n";check_http_expect_alive http_2xx http_3xx;}server {location /springboot { proxy_pass http://cluster1/; }location /status {check_status;access_log off;#allow IP;#deny all;}}
}
我们配置了 server 172.25.234.148:9001
server 172.25.234.148:9002
两个服务开发端口
check interval=3000 rise=2 fall=3 timeout=1000 type=http
interval
:向后端发送的健康检查包的间隔。fall
:如果连续失败次数达到指定次数,服务器就被认为是DOWN
。rise
:如果连续成功次数达到指定次数,服务器就被认为是UP
。timeout
:后端健康请求的超时时间。type
:健康检查包的类型,现在支持以下多种类型tcp
、ssl_hello
、http
、mysql
、ajp
。
其实还可以配置 port
:指定后端服务器的检查端口,并且最好和实际业务端口不同,防止将健康状态通过 nginx 暴露到外网中,但是这里为了方便没有指定,也就是将业务和健康检查接口配置在同一端口
check_http_send "HEAD /actuator/health HTTP/1.0\r\n\r\n";
配置项,该指令可以配置 http 健康检查包发送的请求内容。为了减少传输数据量,推荐采用 "HEAD"
方法,该接口地址 /actuator/health
后面我们会使用 Spring Actuator 配置
check_http_expect_alive http_2xx http_3xx;
配置项,该指令指定 HTTP 回复的成功状态,默认认为 2XX 和 3XX 的状态是健康的。注意,在 Actuator 提供的 health
端点,在返回服务器是 UP
状态时的状态码为 200,在返回服务器是 DOWN
状态时的状态码为 503,满足该 check_http_expect_alive
配置项
location /springboot 配置项,我们创建了一个 Location,转发到我们配置的 Upstream。
location /status 配置项,我们创建了一个 Location,转发到 Tengine 提供的服务器的健康状态页,之后可以访问 http://ip/status 就可以看到当前两台 realserver 实时的健康状态
之后重启 nginx 即可生效,后面我们配置 actuator 节点健康检查
注意
在生产环境的实施应用中需要注意下面两点
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 /mobileapi HTTP/1.0\r\n HOST www.redhat.sx\r\n\r\n" ;
配置 Actuator
示例仓库地址:ReturnTmp/spring-actuator-demo (github.com)
依赖配置 pom.xml
<!-- actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>3.1.0</version></dependency>
application.yml
server: port: 9000
# 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
management: endpoints: web: exposure: include: '*'
添加接口,可以输出服务端口
@GetMapping("/port")public Object port() {return String.format("port=%s", env.getProperty("local.server.port"));}
可以单独配置 actuator 展示端口,防止 nginx 暴露,但是为了演示简便起见,本次不单独设置端口
management:server:port: 8078
启动项目即可通过 /actuator/health
接口查看健康状态
然后给项目 maven 打包 package ,给对应 jar 包上传服务器,分别在两个窗口运行两个服务(nohup 后台运行也可以)
java -jar spring-actuator-demo-0.0.1-SNAPSHOT.jar --server.port=9001
java -jar spring-actuator-demo-0.0.1-SNAPSHOT.jar --server.port=9002
此时访问 http://ip/springboot/port
通过输出的端口可以发现已经顺利实现负载均衡,然后给其中一个服务挂掉,可以发现并没有出现部分请求无法访问问题
然后重新启动挂掉的服务,访问接口,可以发现过了一段时间后节点自动添加到了负载均衡集群中
访问: http://ip/status 可以查看负载均衡集群节点
集成模块
编译安装
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip
[root@localhost src]# unzip nginx_upstream_check_module-master.zip
[root@localhost src]# ls
master.zip nginx_upstream_check_module-master[root@localhost src]# wget http://nginx.org/download/nginx-1.8.0.tar.gz
[root@localhost src]# tar -zxvf nginx-1.8.0.tar.gz
[root@localhost src]# cd nginx-1.8.0[root@localhost nginx-1.8.0]# patch -p1 < ../nginx_upstream_check_module-master/check_1.9.2+.patch
[root@localhost nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --add-module=../nginx_upstream_check_module-master/
[root@node1 src]# make && make install
配置 nginx
[root@master-node ~]# vim /usr/local/nginx/conf/vhosts/LB.conf
upstream LB-WWW {server 192.168.1.101:80;server 192.168.1.102: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;server_name www.wangshibo.com;access_log /usr/local/nginx/logs/www-access.log main;error_log /usr/local/nginx/logs/www-error.log;location / {proxy_pass http://LB-WWW;proxy_redirect off ;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 300;proxy_send_timeout 300;proxy_read_timeout 600;proxy_buffer_size 256k;proxy_buffers 4 256k;proxy_busy_buffers_size 256k;proxy_temp_file_write_size 256k;proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;proxy_max_temp_file_size 128m;proxy_cache mycache;proxy_cache_valid 200 302 60m;proxy_cache_valid 404 1m;}location /nstatus {check_status;access_log off;#allow IP;#deny all;}
}
参考链接
- Nginx 负载均衡中后端节点服务器健康检查 - 博客园 (cnblogs.com)
- 芋道 Spring Boot 持续交付 Jenkins 入门 | 芋道源码(验证码:coke)
- NGINX 负载均衡健康检查和会话保持 - 小丶凡 - 博客园 (cnblogs.com)
- 全网 Tengine 最新版本部署及原理 - 博客园 (cnblogs.com)
- NGINX笔记之: Tengine编译安装Tengine/2.3.1编译安装踩坑笔记
本文由博客一文多发平台 OpenWrite 发布!
相关文章:

Nginx 负载均衡集群 节点健康检查
前言 正常情况下,nginx 做反向代理负载均衡的话,如果后端节点服务器宕掉的话,nginx 默认是不能把这台服务器踢出 upstream 负载集群的,所以还会有请求转发到后端的这台服务器上面,这样势必造成网站访问故障 注&#x…...
uniapp 多轴图,双轴图,指定哪几个数据在哪个轴上显示
这里使用的在这里导入, 秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场 这里我封装成一个组件,自适应的,可以直接复制到自己的项目中 <template><qiun-data-charts type"mix":opts"opts":cha…...
Kotlin 协程 supervisorScope {} 运行崩溃解决
前言 简单介绍supervisorScope函数,它用于创建一个使用了 SupervisorJob 的 coroutineScope, 该作用域的特点:抛出的异常,不会 连锁取消 同级协程和父协程。 看过很多 supervisorScope {} 文档的使用,我照抄一摸一样…...

【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具
欢迎来到数据库的奇妙世界,在这里,我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具,它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用࿰…...

Web开发SpringBoot SpringMVC Spring的学习笔记(包含开发常用工具类)
开发框架学习笔记 一.Spring SpringMVC SpringBoot三者的联系SpringMVC工作原理 二.SpringBoot的学习2.1 注解2.1.1 SpringBoot的核心注解2.1.2 配置导入注解(简化Spring配置写XML的痛苦)Configuration和Bean(人为注册Spring 的 Bean)Import(补)ImportResource(补)AutowiredQua…...
微服务下的SpringSecurity认证端
从三板斧开始微服务下的SpringSecurity开始 一、引入组件包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> 二、创建适配器 AuthorizationServerConfig…...

苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点
Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标,从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏:Bartender 允许用户隐藏菜单栏图标,只在需要时显示。这样可以…...
笙默考试管理系统-MyExamTest----codemirror(65)
笙默考试管理系统-MyExamTest----codemirror(65) 目录 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管理系统-MyExamTest----codemirror 四、 笙默考试管理系统-MyExamTest---…...

git在本地创建dev分支并和远程的dev分支关联起来
文章目录 git在本地创建dev分支并和远程的dev分支关联起来1. 使用git命令2. 使用idea2.1 先删除上面建的本地分支dev2.2 通过idea建dev分支并和远程dev分支关联 3. 查看本地分支和远程分支的关系 git在本地创建dev分支并和远程的dev分支关联起来 1. 使用git命令 git checkout…...

【C++】深入了解构造函数之初始化列表
目录 一、再谈构造函数 1、引入 1)构造函数体赋值 2)不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1)构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值…...
差分--差分数组快速计算L到R值相加后的数组
目录 差分:思路代码: 原题链接 差分: 输入一个长度为 n 的整数序列。 接下来输入 m 个操作,每个操作包含三个整数 l,r,c ,表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第…...

《NLP入门到精通》栏目导读(01/2)
一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》,因此,读者需要一定得深度学习基础,才能过度到此栏目内容。 二、博客建设理念 本博客基地,将建成人工智能领域的参考资料库;…...

three.js实现电子围栏效果(纹理贴图)
three.js实现电子围栏效果(纹理贴图) 实现步骤 围栏的坐标坐标转换为几何体顶点,uv顶点坐标加载贴图,移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…...

DHSP和DNS
一、服务程序 1.1DHCP定义 DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服务组…...

Python冒号的解释
1. “没什么首次没有为第二个,跳了三个”。它得到的切片序列的每一个第三个项目。 扩展片是你想要的。新在Python 2.3 2. Python的序列切片地址可以写成[开始:结束:一步]和任何启动,停止或结束可以被丢弃。a[::3]是每第三个序列。…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现
锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

固乔快递查询助手:批量、快速、全面的快递信息查询软件
在快递行业飞速发展的今天,如何高效、准确地掌握快递信息成为了很多人的需求。而固乔快递查询助手正是解决这一难题的利器。 固乔快递查询助手是一款专注于快递信息查询的软件,支持多家主流快递公司查询。用户只需输入单号,即可快速查询到实时…...

C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化
归并排序 归并算法采用非常经典的分治策略,每次把序列分成n/2的长度,将问题分解成小问题,由复杂变简单。 因为使用了递归算法,不能用于大数据的排序。 核心代码: using System; using System.Text; using System.Co…...

Linux的网络服务DHCP
一.了解DHCP服务 1.1 DHCP定义 DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服…...

【小沐学CAD】开源Assimp库导入三维模型(C++、Python)
文章目录 1、简介2、下载编译3、代码测试3.1 C3.2 pyassimp(Python) 结语 1、简介 https://github.com/assimp/assimp Open Asset Import Library 是一个库,用于将各种 3D 文件格式加载为共享的内存格式。它支持 40 多种用于导入的文件格式和…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...