Nginx - 健康检查终极指南:探索Upstream Check模块

文章目录

  • 概述
  • upstream_check_module模块安装和配置指南
    • 模块安装步骤
    • 基本配置示例
    • 详细配置说明
    • 检查类型和参数
    • 常见问题及解决方案
  • SSL检查和DNS解析功能
    • SSL检查配置示例和说明
      • 配置示例
    • DNS解析配置示例和说明
        • 配置示例
    • 结合实际应用场景的高级配置示例
      • 综合SSL检查与DNS解析
    • 总结和常见问题解决
  • 动态权重调整和自定义健康检查脚本
    • 动态权重调整
      • 配置示例
    • 自定义健康检查脚本
      • 自定义健康检查示例
    • 综合配置示例
    • 总结和常见问题解决

在这里插入图片描述


概述

nginx自带的ngx_http_proxy_modulengx_http_upstream_module提供了基本的负载均衡功能,但确实缺少对后端节点健康状态的主动检测机制。

为了实现健康检查并避免请求转发到故障节点,可以考虑使用第三方模块nginx_upstream_check_module,这个模块可以有效地检测后端服务的健康状态,并在后端服务器不可用时暂停转发请求。

ngx_http_upstream_module是淘宝技术团队开发的nginx模快nginx_upstream_check_module来检测后方服务的健康状态,如果后端服务器不可用,则所有的请求不转发到这台服务器。

使用nginx_upstream_check_module可以实现以下步骤:

  1. 安装nginx_upstream_check_module模块。
  2. 配置nginx以使用该模块,并设置健康检查参数,如检查间隔、超时等。
  3. 配置负载均衡器的upstream,使用ngx_http_upstream_module定义后端节点,并使用nginx_upstream_check_module进行健康检查。
  4. 当后端节点被标记为不可用时,nginx将停止向该节点转发请求,直到节点恢复正常。

简单的示例配置:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    }

    server {
        location / {
            proxy_pass http://backend;
        }
    }
}

在这个示例中,我们定义了一个名为backend的负载均衡器,其中包含两个后端节点。check指令启用了健康检查,并指定了检查的参数,如间隔、成功次数、失败次数和超时时间。

这样,nginx将定期检查后端节点的健康状态,并根据检查结果决定是否向该节点转发请求。如果后端节点被标记为不可用,nginx将暂停将请求转发到该节点,直到其恢复为可用状态。


upstream_check_module模块安装和配置指南

upstream_check_module模块用于Nginx的upstream节点(后端服务器)的健康检查。它可以定期检查每个节点的状态,自动标记不可用的节点,从而实现负载均衡的高可用性。

模块安装步骤

  1. 下载Nginx源代码

    wget http://nginx.org/download/nginx-1.24.0.tar.gz
    tar -xzvf nginx-1.24.0.tar.gz
    cd nginx-1.24.0
    
  2. 下载upstream_check_module源代码

    git clone https://github.com/yaoweibin/nginx_upstream_check_module.git
    cd nginx_upstream_check_module
    
  3. 应用补丁

    patch -p1 < nginx_upstream_check_module/check_1.24.0+.patch
    cd ..
    
  4. 编译Nginx

    ./configure --add-module=./nginx_upstream_check_module
    make
    sudo make install
    

基本配置示例

在Nginx配置文件中添加以下内容:

worker_processes 1;  # 设置Nginx工作进程的数量为1

events {
    worker_connections 1024;  # 每个工作进程的最大连接数为1024
}
 
http {
    include       mime.types;  # 包含MIME类型配置文件
    default_type  application/octet-stream;  # 默认MIME类型为application/octet-stream
    sendfile        on;  # 启用sendfile系统调用传输文件
    keepalive_timeout  65;  # 客户端与服务器之间的keep-alive连接超时时间为65秒
 
    upstream i4t.com {  # 定义名为i4t.com的负载均衡器
       server 10.4.81.41:900;  # 后端服务器1的IP地址和端口号
       server 10.4.81.42:900;  # 后端服务器2的IP地址和端口号
       check interval=3000 rise=2 fall=5 timeout=1000 type=http ;  # 启用健康检查功能,检查间隔为3000毫秒,成功次数达到2次则标记为上线,失败次数达到5次则标记为下线,超时时间为1000毫秒,检查类型为http 
    }
 
    server {
        listen       80;  # 监听80端口,接收HTTP请求
        server_name  localhost;  # 服务器名为localhost
 
        location / {
         proxy_pass http://ip:port/xxxx;  # 请求代理
        }
        location /status1 {
           stub_status on;      # 启用内置的状态信息页面
           access_log  off;  # 关闭对该位置的访问日志记录
        }
        location /status2 {     # 配置使用upstream_check_module模块的健康检查
           check_status;  # 启用upstream_check_module的状态信息页面
           access_log off;  # 关闭对该位置的访问日志记录
           #allow SOME.IP.ADD.RESS; #可以设置允许网段访问
           #deny all;
       }
    }
}  

在这里插入图片描述

在这里插入图片描述

详细配置说明

  • interval:健康检查的时间间隔(毫秒)。
  • rise:连续成功响应的次数。
  • fall:连续失败响应的次数。
  • timeout:健康检查的超时时间(毫秒)。
  • type:检查类型(如httptcp等)。

检查类型和参数

在这里插入图片描述

  1. HTTP检查

    check_http_send "GET /health_check HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
    
  2. TCP检查

    check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;
    
  3. MySQL检查

    check interval=3000 rise=2 fall=5 timeout=1000 type=mysql;
    check_mysql_send "select 1";
    check_mysql_expect_alive success;
    

常见问题及解决方案

  1. Nginx无法启动

    • 检查Nginx配置文件中的语法是否正确,使用命令nginx -t进行验证。
  2. 健康检查失败

    • 确认后端服务器的健康检查端点是否正确响应。
    • 检查防火墙设置是否允许Nginx进行健康检查。
  3. 补丁应用失败

    • 确认所用的Nginx版本与补丁版本是否匹配。

SSL检查和DNS解析功能

述如何使用upstream_check_module模块实现SSL检查和DNS解析功能。

SSL检查配置示例和说明

要对后端节点进行SSL检查,可以在配置中指定检查类型为ssl_hello或者使用https进行更详细的HTTP请求检查。

配置示例

  1. SSL握手检查

    upstream backend {
        server backend1.example.com:443;
        server backend2.example.com:443;
    
        # 添加SSL握手健康检查
        check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
    }
    
  2. HTTPS请求检查

    upstream backend {
        server backend1.example.com:443;
        server backend2.example.com:443;
    
        # 添加HTTPS健康检查
        check interval=3000 rise=2 fall=5 timeout=3000 type=https;
        check_http_send "GET /health_check HTTP/1.1\r\nHost: backend1.example.com\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }
    

DNS解析配置示例和说明

对于动态解析upstream节点,可以使用resolver指令来配置DNS服务器。

配置示例
http {
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    
    upstream backend {
        server backend1.example.com:80;
        server backend2.example.com:80;

        # 添加健康检查
        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

在上述配置中,resolver指令配置了DNS服务器地址,并设置了300秒的缓存时间。

结合实际应用场景的高级配置示例

综合SSL检查与DNS解析

http {
    resolver 8.8.8.8 8.8.4.4 valid=300s;

    upstream backend {
        server backend1.example.com:443;
        server backend2.example.com:443;

        # 添加SSL握手健康检查
        check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;

        # 或者使用HTTPS请求检查
        check interval=3000 rise=2 fall=5 timeout=3000 type=https;
        check_http_send "GET /health_check HTTP/1.1\r\nHost: backend1.example.com\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }

    server {
        listen 80;

        location / {
            proxy_pass https://backend;
            proxy_ssl_server_name on;
        }
    }
}

在此配置中,我们结合了SSL检查和DNS解析,确保后端节点既能够通过DNS动态解析,又能通过SSL握手或HTTPS请求进行健康检查。


总结和常见问题解决

  1. SSL证书问题

    • 确保后端服务器的SSL证书是有效的,可以使用工具(如openssl s_client)手动验证证书。
    • 在使用https检查时,确保check_http_send中的Host头部信息正确。
  2. DNS解析问题

    • 确保Nginx能够访问配置的DNS服务器。
    • 确认解析的域名在DNS服务器上是可解析的,并且记录是正确的。

在这里插入图片描述

动态权重调整和自定义健康检查脚本

如何在Nginx中实现动态权重调整和自定义健康检查脚本。

动态权重调整

动态权重调整允许根据服务器的健康状态或负载情况动态调整负载均衡的权重,从而更有效地分配请求。虽然Nginx本身不直接支持动态权重调整,但可以通过外部工具和脚本结合Nginx的API实现。

配置示例

假设我们使用一个外部工具来监控服务器负载,并通过Nginx的HTTP API来调整权重。

  1. 设置HTTP API模块
    需要启用Nginx的nginx-http-api-module模块,该模块通常需要自行编译:

    ./configure --add-module=path/to/nginx-http-api-module
    make
    sudo make install
    
  2. 配置示例

    http {
        upstream backend {
            server backend1.example.com:80 weight=5;
            server backend2.example.com:80 weight=5;
        }
    
        server {
            listen 80;
    
            location / {
                proxy_pass http://backend;
            }
    
            location /upstream_conf {
                api;
                allow 127.0.0.1;  # 仅允许本地访问API
                deny all;
            }
        }
    }
    
  3. 动态调整权重
    通过HTTP API来调整权重,示例如下:

    curl -X POST "http://localhost/upstream_conf?upstream=backend&server=backend1.example.com:80&weight=10"
    

自定义健康检查脚本

Nginx的upstream_check_module支持自定义健康检查脚本,这些脚本可以用来执行特定的检查逻辑,并返回健康状态。

自定义健康检查示例

假设我们编写一个自定义脚本,检查后端服务器上一个特定的服务是否正常运行。

  1. 编写自定义健康检查脚本
    创建一个名为custom_check.sh的脚本:

    #!/bin/bash
    response=$(curl -s -o /dev/null -w "%{http_code}" http://backend1.example.com/health_check)
    
    if [ "$response" -eq 200 ]; then
        echo "up"
    else
        echo "down"
    fi
    
  2. 配置Nginx使用自定义脚本

    http {
        upstream backend {
            server backend1.example.com:80;
            server backend2.example.com:80;
    
            # 添加自定义健康检查
            check interval=5000 rise=2 fall=5 timeout=1000 type=external;
            check_external_cmd /path/to/custom_check.sh;
        }
    
        server {
            listen 80;
    
            location / {
                proxy_pass http://backend;
            }
        }
    }
    

综合配置示例

以下示例结合了动态权重调整和自定义健康检查脚本:

http {
    resolver 8.8.8.8 8.8.4.4 valid=300s;

    upstream backend {
        server backend1.example.com:80 weight=5;
        server backend2.example.com:80 weight=5;

        # 添加自定义健康检查
        check interval=5000 rise=2 fall=5 timeout=1000 type=external;
        check_external_cmd /path/to/custom_check.sh;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }

        location /upstream_conf {
            api;
            allow 127.0.0.1;  # 仅允许本地访问API
            deny all;
        }
    }
}

总结和常见问题解决

  1. 动态权重调整

    • 确保外部工具或脚本能够正确监控和反馈服务器负载情况。
    • 使用HTTP API进行权重调整时,确保API的安全性,如限制访问权限。
  2. 自定义健康检查脚本

    • 脚本需要具有可执行权限,并确保路径正确。
    • 确保脚本返回的状态符合Nginx的预期,如"up"或"down"。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Discourse 中可能使用的 HMAC 算法 Java 实现

在 DiscourseConnect 中&#xff0c;对数据的签名使用的是 HMAC 算法。 实际使用的算法为 HmacSHA256。 Java 生成签名的方法很简单。 String hmac new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897682511405307018226").hmacHex(ssoPayload);HmacUti…

robosuite导入自定义机器人

目录 目的&#xff1a;案例一&#xff1a;成果展示具体步骤&#xff1a;URDF文件准备xml文件生成xml修改机器人构建 目的&#xff1a; 实现其他标准/非标准机器人的构建 案例一&#xff1a; 成果展示 添加机器人JAKA ZU 7 这个模型 具体步骤&#xff1a; URDF文件准备 从…

在深度学习中常见的初始化操作

目录 截断正态分布来初始化张量 逐行代码解释 相关理论解释 截断正态分布函数 截断正态分布的定义 截断正态分布的作用 计算截断点的作用 具体步骤 正态分布的累积分布函数&#xff08;CDF&#xff09; 正态分布的累积分布函数与误差函数的关系 示例计算 误差函数 应…

切换分支报错:Untracked Files Prevent Checkout

切换分支报错&#xff1a;Untracked Files Prevent Checkout 分支切换 Untracked Files Prevent Checkout 新起的项目在切换master分支到工作分支时&#xff0c;出现下图的问题&#xff1a; Untracked Files Prevent Checkout Move or commit them before checkout 网上的解决…

pip(包管理器) for Python

pip是什么 pip是Python的包安装程序&#xff0c;即python包管理器。您可以使用 pip 从Python包索引和其他索引安装包。 1. pip 安装 python 包 pip install 包名 例如&#xff1a;pip install pymssql &#xff1a; 使用pip安装数据库驱动包 pymssql 2.pip 卸载 python 包 pi…

数据结构2(初):顺序表和链表

目录 1、线性表 2、顺序表 2.1、概念及结构 2.2、顺序表的实现 2.3、顺序表的问题及思考 3、链表 3.1、链表的概念及结构 3.2、链表的分类 3.3、无头单向非循环链表的实现 3.4、带头双向循环链表的实现 4、顺序表和链表的区别和联系 1、线性表 线性表是n个具有相同特…

200+有趣的HTML前端游戏项目合集(5月17日更新,持续更新中)

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

工作干到抑郁了,要不要辞职?

在知乎上看到以为网友提问&#xff1a;工作干到抑郁&#xff0c;该不该辞职&#xff1f; 今天和大家聊聊这个话题&#xff0c;如果你也有类似的情况&#xff0c;希望这篇文章能帮到你。 熟悉瑶琴的朋友&#xff0c;都知道瑶琴在去年有一次裸辞的经历。离职前&#xff0c;严重的…

多台Centos快速区分,让Centos开机自动显示它的IP地址!

背景说明&#xff1a;当公司拥有多台Centos服务器&#xff0c;管理员很容易弄混淆导致不好区分&#xff0c;在这样的情况下我们可以写个简单脚本来实现开机自动显示它的IP地址&#xff0c;从而达到区分开来的结果&#xff01; 首先我们来开下效果&#xff0c;登录之前的 下面是…

【加密与解密(第四版)】第十八章笔记

第十八章 反跟踪技术 18.1 由BeginDebugged引发的蝴蝶效应 IsDebuggerPresent()函数读取当前进程PEB中的BeginDebugged标志 CheckRemoteDebuggerPresent() 反调试总结&#xff1a;https://bbs.kanxue.com/thread-225740.htm https://www.freebuf.com/articles/others-articl…

细胞冻存——让你的细胞“长生不老”

《星际穿越》电影中提到漫长的太空旅程中&#xff0c;宇航员可以进入休眠水床休眠&#xff0c;并自行设定唤醒时间。在《异形》《深空失忆》《三体》等科幻作品中&#xff0c;都出现此类技术。《三体》中&#xff0c;休眠后来成为人类最普遍的一项技术。技术上的人类低温休眠&a…

JavaEE-网络初识

文章目录 一、网络背景1.1 起源1.2 国内网络的发展 二、关键概念2.1 网络2.2 设备2.3 ip地址与端口号 三、协议3.1 协议分层3.2 OSI七层模型3.3 TCP/IP五层模型3.4 数据传输过程的简单叙述 一、网络背景 1.1 起源 在国外大概时上世纪70年代左右&#xff0c;网络就出现了&…

项目集成SkyWalking,基于k8s搭建

一、搭建SkyWalking 官方文档&#xff08;英文&#xff09;&#xff1a;skywalking/docs at master apache/skywalking 中文可以使用&#xff1a;GitHub - SkyAPM/document-cn-translation-of-skywalking: [已过期,请使用官网AI文档] The CN translation version of Apache…

【LeetCode:496. 下一个更大元素 I + 单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

深度学习——图像分类(CNN)—训练模型

训练模型 1.导入必要的库2.定义超参数3.读取训练和测试标签CSV文件4.确保标签是字符串类型5.显示两个数据框的前几行以了解它们的结构6.定义图像处理参数7.创建图像数据生成器8.设置目录路径9.创建训练和验证数据生成器10.构建模型11.编译模型12.训练模型并收集历史13.绘制损失…

【AD21】PCB板尺寸与层名称标注

PCB绘制完成后&#xff0c;需要给上级或生产制造商发送输出文件&#xff0c;输出文件中包含板尺寸标识和层标识可以方便工作的交接。 1. 板尺寸标识 首先板尺寸标识所在的层要在与板框不同的机械层&#xff0c;这里我选择机械5层。 点击放置->尺寸->线性尺寸 这里板尺…

微信小程序uniapp+django洗脚按摩足浴城消费系统springboot

原生wxml开发对Node、预编译器、webpack支持不好&#xff0c;影响开发效率和工程构建。所以都会用uniapp框架开发 前后端分离&#xff0c;后端给接口和API文档&#xff0c;注重前端,接近原生系统 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0…

利用大模型构造数据集,并微调大模型

一、前言 目前大模型的微调方法有很多&#xff0c;而且大多可以在消费级显卡上进行&#xff0c;每个人都可以在自己的电脑上微调自己的大模型。 但是在微调时我们时常面对一个问题&#xff0c;就是数据集问题。网络上有许多开源数据集&#xff0c;但是很多时候我们并不想用这…

Gerchberg-Saxton (GS) 和混合输入输出(Hybrid Input-Output, HIO)算法

文章目录 1. 简介2. 算法描述3. 混合输入输出&#xff08;Hybrid Input-Output, HIO&#xff09;算法3.1 HIO算法步骤3.2 HIO算法的优势3.3 算法描述 4. 算法实现与对比5. 总结参考文献 1. 简介 Gerchberg-Saxton (GS) 算法是一种常用于相位恢复和光学成像的迭代算法。该算法最…

【抽代复习笔记】18-置换练习题(2)及两个重要定理

最近一直忙于学校的事情&#xff0c;好久没更新了&#xff0c;实在抱歉。接下来几期大概也会更得慢一些&#xff0c;望见谅。 练习4&#xff1a;写出4次对称群S4中所有置换。 解&#xff1a;由上一篇笔记结尾的定理我们知道&#xff0c;4次对称群的阶&#xff08;也就是所含元…