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

news2024/11/24 19:55:11

文章目录

  • 概述
  • 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"。

在这里插入图片描述

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

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

相关文章

代码随想录算法训练营第三天| 203.移除链表元素、 707.设计链表、 206.反转链表

203.移除链表元素 题目链接&#xff1a; 203.移除链表元素 文档讲解&#xff1a;代码随想录 状态&#xff1a;没做出来&#xff0c;做题的时候定义了一个cur指针跳过了目标val遍历了一遍链表&#xff0c;实际上并没有删除该删的节点。 错误代码&#xff1a; public ListNode re…

一键恢复安卓手机数据:3个快速简便的解决方案!

安卓手机作为我们不可或缺的数字伙伴&#xff0c;承载着大量珍贵的个人和工作数据。然而&#xff0c;随着我们在手机上进行各种操作&#xff0c;不可避免地会遇到一些令人头痛的问题&#xff0c;比如意外删除文件、系统故障或其他不可预见的情况&#xff0c;导致重要数据的丢失…

springboot基于Web前端技术的java养老院管理系统_utbl7

3.普通用户模块包括&#xff1a;普通会员的注册、养老院客房查询、养老院留言查询、预约老人基本信息登记、选择房间、用户缴费的功能。 4.数据信息能够及时进行动态更新&#xff0c;增删&#xff0c;用户搜素方便&#xff0c;使用户可以直接浏览相关信息&#xff0c;要考虑便于…

埋点——about前端

所谓“埋点”&#xff0c;是数据采集领域(尤其是用户行为数据采集领域)的术语&#xff0c;指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个icon点击次数、观看某个视频的时长等等,埋点的技术实质&#xff0c;是先监听软件应用运行过程中…

C#数据类型变量、常量

一个变量只不过是一个供程序操作的存储区的名字。 在 C# 中&#xff0c;变量是用于存储和表示数据的标识符&#xff0c;在声明变量时&#xff0c;您需要指定变量的类型&#xff0c;并且可以选择性地为其分配一个初始值。 在 C# 中&#xff0c;每个变量都有一个特定的类型&…

只需提交几次代码就能轻松实现系统级的变更!——“基础设施即代码”模式与实践

“基础设施即代码”模式与实践 基础设施即代码&#xff08;Infrastructure as Code&#xff0c;IaC&#xff09;是指利用脚本、配置或编程语言创建和维护基础设施的一组实践和流程。通过IaC&#xff0c;我们可以轻松测试各个组件、实现所需的功能并在最小化停机时间的前提下进行…

51-指针_野指针,指针运算

51-1 野指针 51-1-1 什么是野指针 概念&#xff1a;野指针就是指针指向的位置是不可知的&#xff08;随机的、不正确的、没有明确限制的) 没有初始化 int main() {int* p;//p没有初始化&#xff0c;就意味着没有明确的指向//一个局部变量不初始化的话&#xff0c;放的是随机…

一文说透组织中的利润中心建设

当前&#xff0c;规模型企业越来越重视利润中心建设&#xff0c;华为的实践表明&#xff0c;建好了利润中心&#xff0c;利润自然好&#xff0c;组织也会上台阶。很多企业利润上不去&#xff0c;就是没有搞好利润中心这个火车头。然而&#xff0c;很多人误以为利润中心只是财务…

Cesium与Three相机同步(2)

之前实现了将Three相机同步到Cesium相机Cesium与Three相机同步(1)-CSDN博客 现在是将Cesium相机同步到Three相机,从而实现了相机双向同步。 <!DOCTYPE html> <html lang="en"><head><title>three.js webgl - orbit controls</title&g…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

OpenCV:入门(五)

图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值也 较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化较小&#xff0c;相应的梯度值也较小。一般情 况下&#xff0c;图像梯度计…

k8s 1.28.10 浏览器访问6443查看api,需要证书

添加证书 使用client-certificate-data和client-key-data生成一个p12文件 1.生成client-certificate-data grep client-certificate-data ~/.kube/config | head -n 1 | awk {print $2} | base64 -d >> kubecfg.crt2.生成client-key-data grep client-key-data ~/.kub…

深 渔博会成功举办 新文件促进城市数字化转型| 产业互联网观察174期

深圳渔博会水产品竞价交易会成功举办 首批数据跨境一般数据清单发布 新文件加快城市全域数字化转型进程 | 产业互联网观察第174期 2024深圳渔博会水产品竞价交易会成功举办 5月17日至18日&#xff0c;深圳渔博会上深圳国际金枪鱼交易有限公司在深圳会展中心成功举办了水产品竞…

使用Prometheus + Blackbox-exporter快速监控一个网站性能和SSL过期时间

使用blackbox-exporter快速监控一个网站性能和SSL过期时间 环境介绍什么是blackbox-exporter下载blackbox-exporter安装blackbox-exporter配置Prometheus服务端查看job上线监控面板参考文献 环境介绍 本文实验环境 操作系统&#xff1a;Centos 7.9Prometheus版本&#xff1a;…

U-Mail邮件系统为用户提供更加安全的数据保护机制

据外媒报道&#xff0c;近日美国国家安全委员会泄露了其成员的近1万封电子邮件和密码&#xff0c;暴露了政府组织和大公司在内的2000家公司。其中包括美国国家航空航天局和特斯拉等。报道称该漏洞于3月7日被研究人员发现&#xff0c;通过该漏洞攻击者能够访问对web服务器操作至…

哪款电脑桌面日历记事本软件好用?推荐优秀的电脑日历记事本

对于众多上班族而言&#xff0c;每天在电脑前忙碌已成为生活常态。若想提升工作效率&#xff0c;简化繁琐的工作流程&#xff0c;选择一款出色的电脑桌面日历与记事本软件就显得至关重要。 然而&#xff0c;在Windows操作系统上设定提醒显得相当繁琐&#xff0c;而系统自带的记…

创新力作 焕新首发丨捷顺科技·捷曜系列智慧停车新品全新上市

2024捷顺科技智慧停车全家族新品全面上市 全新外观、全新特性、全新体验 新控制机、新道闸、新超眸相机... 每款新品都有哪些功能亮点 带您一探究竟

影响程序员发展,首个关于“软件供应链安全”国家标准发布,你该知道的10个问题!【附标准全文】

近日&#xff0c;GB/T 43698-2024《网络安全技术 软件供应链安全要求》作为国内首个软件供应链安全的国标&#xff0c;对于程序员的影响深远。该标准的实施&#xff0c;不仅为程序员提供了明确的软件安全开发指导&#xff0c;还强化了他们在软件开发过程中对安全性的重视。程序…

如何解决Nginx反向代理不生效?

目录 背景 过程 日志 检查配置文件 重启服务 检查容器内的配置文件 容器和宿主机 其他 背景 用了两年的nginx新加的反向代理不生效 Docker挂载的配置文件启动的Nginx&#xff0c;配置一切正常&#xff0c;但是反向代理不生效&#xff0c;???先自查一波 过程 日志 …

废物回收机构|基于SprinBoot+vue的地方废物回收机构管理系统(源码+数据库+文档)

地方废物回收机构管理系统 目录 基于SprinBootvue的地方废物回收机构管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2 员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…