Nginx健康检查

news2025/5/24 15:48:54

Nginx健康检查nginx_upstream_check_module

nginx健康检查介绍:

​ 主动健康检查,nignx定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。nginx自带的upstream轮询可以实现业务接口切换, nginx有一个开源的实现nginx_upstream_check_module模块能更加平滑的进行业务切换

nginx自带健康检查的缺陷:

  1. Nginx只有当有访问时后,才发起对后端节点探测。
  2. 如果本次请求中,节点正好出现故障,Nginx依然将请求转交给故障的节点,然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。但是会影响效率,因为多了一次转发
  3. 自带模块无法做到预警
  4. 被动健康检查, 应用服务器没挂,但是数据库连接池不够导致应用假死, Nginx任然认为它是一个正常节点, 继续把请求打在这台服务器上

使用第三访模块nginx_upstream_check_module:

  1. 区别于nginx自带的非主动式的心跳检测,淘宝开发的tengine自带了一个提供主动式后端服务器心跳检测模块
  2. 若健康检查包类型为http,在开启健康检查功能后,nginx会根据设置的间隔向指定的后端服务器端口发送健康检查包,并根据期望的HTTP回复状态码来判断服务是否健康。
  3. 后端真实节点不可用,则请求不会转发到故障节点
  4. 故障节点恢复后,请求正常转发

介绍nginx_upstream_check_module模块针对nginx1.20+

一、模块下载解压

nginx下载地址:https://nginx.org/en/download.html

nginx_upstream_check_module模块下载:

github地址: https://github.com/yaoweibin/nginx_upstream_check_module

taobao官网:http://tengine.taobao.org/document_cn/http_upstream_check_cn.html

下载

https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master

在这里插入图片描述

上传到服务器并解压

tar -zxvf nginx-1.22.1.tar.gz
unzip nginx_upstream_check_module-master.zip

在这里插入图片描述

二、官方步骤

安装

在这里插入图片描述

配置

在这里插入图片描述

三、自己安装步骤跟着官网来

安装patch

yum install -y patch

#(重点: 已安装nginx一定是停止运行状态的)
# 注意check_1.20.1+.patch 版本要跟你的nginx版本对应上
#(一定要执行这行命令, 要不然健康检查会报错: http upstream check module can not find any check server, make sure you've added the check servers, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /status HTTP/1.1", host: "xxx.xxx.xxx.xxx:8087")

# 执行patch命令一定要在(nginx源码目录)
patch -p1 < /home/app/nginx_upstream_check_module-master/check_1.20.1+.patch

在这里插入图片描述

安装nginx和模块nginx_upstream_check_module-master

# 进入nginx安装包目录, 执行下面命令, 根据自己的实际情况安装对应参数值改成自己的 (重点: nginx一定是停止运行状态的)
./configure --user=app --group=app --with-http_ssl_module --with-threads --with-file-aio --with-http_stub_status_module --add-module=/opt/app/nginx_upstream_check_module-master/ --prefix=/opt/app/nginx

make && make install

–prefix: nginx主目录
–user: nginx启动用户
–group: nginx启动组
–add-module: 添加模块
–with-http_ssl_model: 启动ssl模块

配置nginx

Nginx会每隔3000毫秒(3秒)向每个服务器发送一个GET请求/dist-app-ytgz-approve/health_check接口ip是对应的server后面的ip端口。如果服务器连续两次(rise=2)返回2xx或3xx状态码,那么Nginx就认为这个服务器是健康的。如果服务器连续五次(fall=5)没有响应或者返回非2xx或3xx的状态码,那么Nginx就认为这个服务器是不健康的,会自动将其剔除。

为什么请求接口带/dist-app-ytgz-approve那是因为我后台application.yaml里面配置的server.servlet.context-path: /dist-app-ytgz-approve

http {
    upstream approve {
      server xxx.xxx.xxx.xxx:9010;
      server xxx.xxx.xxx.xxx:9090;
      ip_hash;
        
        
      check interval=3000 rise=2 fall=5 timeout=5000 type=http;   
      check_http_send "GET /dist-app-ytgz-approve/health_check HTTP/1.0\r\n\r\n";    
      check_http_expect_alive http_2xx http_3xx;
      # Nginx会每隔3000毫秒(3秒)向每个服务器发送一个GET请求/dist-app-ytgz-approve/health_check接口ip是对应的server后面的ip端口。如果服务器连续两次(rise=2)返回2xx或3xx状态码,那么Nginx就认为这个服务器是健康的。如果服务器连续五次(fall=5)没有响应或者返回非2xx或3xx的状态码,那么Nginx就认为这个服务器是不健康的,会自动将其剔除。
	}

	server {
        listen       8087;
        server_name  localhost;

        location /dist-app-ytgz-approve {

          proxy_pass http://approve;
          proxy_set_header        Host $http_host;
          proxy_set_header        X-Real-IP $remote_addr;
          proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header        X-Forwarded-Port $server_port;
          proxy_set_header        X-Forwarded-Proto $scheme;

          add_header X-Route-Ip $upstream_addr;
          add_header X-Route-Status $upstream_status;
        }

        location /status {
          check_status;

          access_log off;
        }

    }
}

后台健康检查接口

package com.dist.ytgz.approve.controller;

import com.dist.common.util.LogUtil;
import com.dist.ytgz.approve.service.HealthCheckService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * TODO
 *
 * @author <a href="mailto:zhangxiao@dist.com.cn">Zhang Xiao</a>
 * @since
 */
@RequestMapping
@RestController
public class HealthCheckController {

    @Autowired
    private HealthCheckService healthCheckService;

    @GetMapping("/health_check")
    public ResponseEntity<String> healthCheck() {
        // 这里可以添加检查数据库连接数的逻辑
        // 如果数据库连接数正常,返回200状态码
        // 如果数据库连接数耗尽,返回503状态码
        Long startTime = System.currentTimeMillis();
        boolean isDatabaseHealthy = healthCheckService.checkDatabaseHealth();

        if (isDatabaseHealthy) {
            Long endTime = System.currentTimeMillis();
            LogUtil.error("健康检查总共耗时: " + (endTime-startTime) / 1000.0);
            return ResponseEntity.ok("Healthy");
        } else {
            Long endTime = System.currentTimeMillis();
            LogUtil.error("不健康检查总共耗时: " + (endTime-startTime) / 1000.0);
            return ResponseEntity.status(503).body("Unhealthy");
        }
    }

}





package com.dist.ytgz.approve.service.impl;

import com.dist.ytgz.approve.service.HealthCheckService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 * TODO
 *
 * @author <a href="mailto:zhangxiao@dist.com.cn">Zhang Xiao</a>
 * @since
 */
@Service
public class HealthCheckServiceImpl implements HealthCheckService {

    @Autowired
    private EntityManager em;

    @Override
    public boolean checkDatabaseHealth() {
        try {
            // 这里的SQL语句应该替换为适合您的数据库的语句
            Query query = em.createNativeQuery("SELECT count(1) from dual");
            query.getSingleResult();
            return true;
        } catch (Exception e) {
            // 如果查询失败,那么可能是数据库连接数耗尽,或者数据库服务器出现了其他问题
            return false;
        }
    }
}

四、启动nginx

nginx健康检查的日志信息

在这里插入图片描述

nginx服务器状态

在这里插入图片描述
server number: 是后端服务器的数量
generation: 是Nginx reload的次数
Index: 是服务器的索引
Upstream: 是在配置中upstream的名称
Name: 是服务器IP:PORT
Status: 是服务器的状态
Rise counts: 是服务器连续检查成功的次数
Fall counts: 是连续检查失败的次数
Check type: 是检查的方式
Check port: 是后端专门为健康检查设置的端口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1593419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java并发--内存结构图及线程安全

内存结构图 内存-> (开辟的数组) -> (方法区&#xff0c;堆&#xff0c;栈&#xff0c;程序计数器&#xff0c;本地方法栈) 堆&#xff1a;几乎所有的对象实例都在这里分配内存。堆中每个对象的头信息都标属着他属于哪个类。 方法区它用于存储已被虚拟机加载的类型信息…

牛客_左右最值最大差_C++题解

原题链接&#xff1a;牛客 题目缩写&#xff1a;给你一个数组&#xff0c;由你来进行一个切分&#xff0c;分为两份&#xff0c;每份至少有1个元素&#xff1b;你分出来的这两个区间中各自有一个最大值&#xff0c;两者之差再求绝对值就是答案&#xff0c;这个答案越大越好&am…

认识异常(2)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

【Linux系统】操作备忘录

Linux命令 打开终端的快捷键&#xff1a;Ctrl Alt t 退出终端的命令&#xff1a;exit 终端命令行复制/粘贴的快捷键 &#xff1a;Ctrl Shift c / v 对于所有不太熟悉的命令&#xff0c;都可以在终端输入 命令名称 --help 来查看具体用法。例如&#xff1a; 文件和目录…

电池电量监测系统设计 单片机+LabVIEW+Matlab+Protues+Keil程序

目录 前言 提供 软件 系统展示 1.放电试验及其处理 2.硬件系统原理图 3.下位机程序 4.显示 5.上位机界面 6.上位机程序 7.文档 资料下载地址&#xff1a;电池电量监测系统设计 单片机LabVIEWMatlabProtuesKeil程序 前言 这套系统首先使用Matlab分析获得了电压…

项目5-博客系统3+接口完

1.实现显示用户信息 ⽬前⻚⾯的⽤⼾信息部分是写死的. 形如 我们期望这个信息可以随着用户登陆而发生改变. • 如果当前⻚⾯是博客列表⻚, 则显⽰当前登陆⽤⼾的信息. • 如果当前⻚⾯是博客详情⻚, 则显⽰该博客的作者⽤⼾信息. 注意: 当前我们只是实现了显⽰⽤⼾名, 没有…

Swagger的使用教程

Swagger简介 Swagger是一个规范和完整的API框架&#xff0c;可用于生成、描述、调用Restful风格的Web服务的接口文档。如果你在SpringBoot中使用的话&#xff0c;在项目启动后可以自动生成在线可调用的API文档&#xff0c;非常方便&#xff01; 在SpringBoot中集成 首先在po…

797. 所有可能的路径

给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节点 graph[i][j]存在一条有向…

办公小助手来啦! Textin接口,轻松提取文件信息,让你如虎添翼!

&#x1f60e;大家是不是经常为了一堆文件而头疼呢&#xff1f;&#x1f4da;别担心&#xff0c;Textin接口它来了&#xff01;&#x1f389; 一、Textin的神秘面纱 1. Textin是谁&#xff1f; &#x1f50d;Textin接口&#xff0c;一款专业的文件信息提取工具&#xff0c;只…

Arco design 发布到生成环境F5刷新报错404

问题&#xff1a;开发环境没问题&#xff0c;生成环境正常跳转也没问题但是F5刷新报错 解决办法一&#xff1a;修改 history: createWebHistory(), 改为history: createWebHashHistory(),

微服务-6 Gateway网关

一、网关搭建 此时浏览器访问 localhost:10010/user/list 后正常返回数据&#xff0c;说明网关已生效&#xff0c;其原理流程图如下&#xff1a; 二、网关过滤器 作用&#xff1a;处理一切进入网关的请求和微服务响应。 1. 网关过滤器的分类&#xff1a; a. 某个路由的过滤器 …

C语言 | Leetcode C语言题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; int removeDuplicates(int* nums, int numsSize) {if (numsSize 0) {return 0;}int fast 1, slow 1;while (fast < numsSize) {if (nums[fast] ! nums[fast - 1]) {nums[slow] nums[fast];slow;}fast;}return slow; }

教程备忘 一文搞定 cmake 全部技巧之 app 和 lib 的 cmake 系统

1&#xff0c;APP cmake 1.1 hello_app_01 文件&#xff1a;hello.cpp add_impl.cpp sub_impl.cpp CMakeLists.txt hello.cpp #include <iostream> float add(float, float); float sub(float, float);int main() {float a, b;a 7.7f;b 2.333f;std::cout<&l…

Java面试之redis篇

文章目录 布隆过滤器BloomFilter布隆过滤器是什么、能干嘛原理hash冲突导致数据不精确 缓存预热缓存雪崩发生预防 缓存穿透缓存穿透是什么解决 工作中哪里使用过redis 布隆过滤器BloomFilter 布隆过滤器是什么、能干嘛 由一个初值都为零的bit数组和多个哈希函数构成&#xff…

系统架构设计图

首先明确应用架构的定义&#xff0c;从百度百科上即可了解到何为应用架构&#xff1a; 应用架构&#xff08;Application Architecture&#xff09;是描述了IT系统功能和技术实现的内容。应用架构分为以下两个不同的层次&#xff1a; 企业级的应用架构&#xff1a;企业层面的应…

SpringBoot3整合Mybatis plus

Java版本&#xff1a;17 Spring Boot版本&#xff1a;3.1.10 Mybatis plus版本&#xff1a;3.5.5 源码地址&#xff1a;Gitee仓库 01 创建我们的项目工程 首先&#xff0c;我们创建一个maven工程spring-boot3-demo&#xff0c;pom文件配置如下。 这里我们将spring-boot-start…

生成对抗网络(GAN)工作原理及应用

文章目录 1、概述2、GAN的工作原理2.1、生成器&#xff08;Generator&#xff09;2.2、判别器&#xff08;Discriminator&#xff09; 4、GAN的优点5、GAN的应用6、注意事项7、总结 1、概述 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#…

JAVA实现人工智能,采用框架SpringAI

Spring AI介绍 Spring AI是AI工程师的一个应用框架&#xff0c;它提供了一个友好的API和开发AI应用的抽象&#xff0c;旨在简化AI应用的开发工序&#xff0c;例如开发一款基于ChatGPT的对话应用程序。 项目地址&#xff1a;https://github.com/spring-projects-experimental/sp…

C#泛型,利用反射创建和普通创建泛型

泛型,利用反射创建和普通创建 反射 var input Activator.CreateInstance(typeof(Input<>).MakeGenericType(typeof(T))) as dynamic;typeof(T)这个位置可以塞入不同的类型 Activator.CreateInstance 反射动态创建实例&#xff1a; 这种方式使用 Activator.CreateIns…