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工作进程的数量为1events {worker_connections 1024;  # 每个工作进程的最大连接数为1024
}http {include       mime.types;  # 包含MIME类型配置文件default_type  application/octet-stream;  # 默认MIME类型为application/octet-streamsendfile        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;  # 服务器名为localhostlocation / {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;  # 仅允许本地访问APIdeny 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 ]; thenecho "up"
    elseecho "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;  # 仅允许本地访问APIdeny all;}}
}

总结和常见问题解决

  1. 动态权重调整

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

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

在这里插入图片描述

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

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

相关文章

Doris【部署 03】Linux环境Doris数据库部署异常问题收集解决(不断更新)

Linux环境Doris数据库部署异常问题 1.FE1.1 Unknown system variable character_set_database1.2 notify new FE type transfer: UNKNOWN1.3 mysql_load_server_secure_path1.4 Only unique table could be updated1.5 too many filtered rows 2.BE2.1 Have not get FE Master …

正确可用--Notepad++批量转换文件编码为UTF8

参考了:Notepad批量转换文件编码为UTF8_怎么批量把ansi转成utf8-CSDN博客​​​​​​https://blog.csdn.net/wangmy1988/article/details/118698647我参考了它的教程,但是py脚本写的不对. 只能改一个.不能实现批量更改. 他的操作步骤没问题,就是把脚本代码换成我这个. #-*-…

graspnet+Astra2相机实现部署

graspnetAstra2相机实现部署 &#x1f680; 环境配置 &#x1f680; ubuntu 20.04Astra2相机cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0numpy 1.23.5 1. graspnet的复现 具体的复现流程可以参考这篇文章&#xff1a;Ubuntu20.04下GraspNet复现流程 这里就不再详细…

数据库系统概论(第5版)复习笔记

笔记的Github仓库地址 &#x1f446;这是笔记的gihub仓库&#xff0c;内容是PDF格式。 因为图片和代码块太多&#xff0c;放到CSDN太麻烦了&#xff08;比较懒&#x1f923;&#xff09; 如果感觉对各位有帮助的话欢迎点一个⭐\^o^/

41-4 DDOS攻击防护实战

一、UDP FLOOD攻击 # hping3 -q -n -a <攻击IP> -S -s <源端口> --keep -p <目的端口> --flood <被攻击IP> hping3 --udp -s 6666 -p 53 -a 192.168.1.6 --flood 192.168.1.13 这个命令是使用hping3工具进行UDP Flood攻击的命令。下面是各个选项的作…

three.js能实现啥效果?看过来,这里都是它的菜(06)

这是第五期了&#xff0c;本期继续分享three.js可以实现的3D动画案例&#xff0c;有老铁反馈再发案例的时候&#xff0c;是否可以顺道分享一下three.js的知识点&#xff0c;好吧&#xff0c;安排。 材质动画 材质动画可以实现各种复杂的视觉效果&#xff0c;包括但不限于以下…

【css】引入背景图时候,路径写入@会报错

看报错信息 我的写法 解决办法 在前面加个~

js解决数字小数计算出现的精度丢失问题(2024-05-24)

精度丢失的原因 js小数进行数值运算时出现精度丢失问题 JavaScript 的number类型在进行运算时都先将十进制转二进制&#xff0c;此时&#xff0c;小数点后面的数字转二进制时会出现无限循环的问题。 为了避免这一个情况&#xff0c;要舍0进1&#xff0c;此时就会导致精度丢失…

企业宽带跑pcdn会被查吗?

企业宽带使用PCDN技术&#xff0c;本身并不违反相关规定&#xff0c;因此一般不会被查。PCDN是一种内容分发网络技术&#xff0c;通过将内容缓存在离用户更近的服务器上&#xff0c;减少数据传输的延迟&#xff0c;提高访问速度。这种技术可以提高网页加载速度和视频播放流畅度…

Excel未响应时强关后,Excel插件消失

目录 我们分析一下插件消失的原因&#xff1a; 针对上面表现出来的2个问题&#xff0c;进行针对性的解决 &#xff1a; 1、不被关进去&#xff0c;是不是就没有后续的一系列的问题了&#xff0c;各自安好 2、保留住自动加载的行为 PS&#xff1a;配置受信任的位置注册列表…

2024电工杯B题保姆级分析完整思路+代码+数据教学

2024电工杯B题保姆级分析完整思路代码数据教学 B题题目&#xff1a;大学生平衡膳食食谱的优化设计及评价 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 总体分析&#xff1a; 题目要求对两份一日膳食食谱进行营养分析和调整&#xff0c;然后设计优化的平衡膳…

生成模型 | 从 VAE 到 Diffusion Model (上)

文章目录 一&#xff0c;GAN(对抗式生成网络&#xff09;二&#xff0c;Auto-Encoder(AE) 和 Denoising Auto-Encoder (DAE)三&#xff0c;VAE四&#xff0c;VQ-VAE (Vector Quantized Variational Autoencoder)VQ-VAE 2小总结&#xff1a; 五&#xff0c;DALL-E &#xff08;O…

硅谷裸机云服务器性能测评哪些内容

硅谷裸机云服务器&#xff0c;作为云计算领域的一股新兴力量&#xff0c;近年来受到了广泛关注。其强大的性能和灵活性为用户提供了更高效、更稳定的云计算服务。那么&#xff0c;硅谷裸机云服务器的性能测评究竟包括哪些内容呢?接下来&#xff0c;我们就来科普一下。 首先&am…

如何让大模型更聪明?

如何让大模型更聪明&#xff1f; *随着人工智能技术的飞速发展&#xff0c;大模型在多个领域展现出了前所未有的能力&#xff0c;但它们仍然面临着理解力、泛化能力和适应性等方面的挑战。那么&#xff0c;如何让大模型变得更聪明呢&#xff1f; 方向一&#xff1a;算法创新 …

留学培训行业PaaS应用系统架构的设计与实践

随着留学需求的增长和教育培训市场的不断扩大&#xff0c;留学培训行业正面临着越来越多的挑战和机遇。在这个背景下&#xff0c;利用PaaS&#xff08;Platform as a Service&#xff09;平台来构建留学培训行业的应用系统架构&#xff0c;将成为提升服务质量和效率的重要手段。…

Nacos 2.x 系列【8】集成 Spring Cloud Gateway

文章目录 1. 概述1.1 API 网关1.1 Spring Cloud Gateway 2. 集成案例2.1 入门案例2.2 动态路由 1. 概述 1.1 API 网关 API网关已经成为了微服务架构的一个标配组件&#xff0c;是系统对外的唯一入口。所有的客户端都通过统一的网关接入微服务&#xff0c;在网关层处理所有非业…

SSRF攻击技术

1、SSRF形成原因 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF是要目标网站的内部系统。&#xff08;因为他是从内部系统访问的&#xff0c;所有可以通过它攻击外网无法访问的内部系…

思科模拟器--03.RIP协议路由--24.5.17

1.首先&#xff0c;先创建两个个人电脑:PC0和PC1和三个路由器:R1&#xff0c;R2和R3. (诀窍:建议用文本框标注一下重要简短的内容; 目的:降低失误概率,提高成功率!) 第0步:(个人电脑的IP,子网掩码和默认网关配置) 接着&#xff0c;可以先将个人电脑的IP和网关先配置一下…

ThreadLocal原理及使用

一、引言 在Java多线程编程中&#xff0c;ThreadLocal是一个非常有用的工具&#xff0c;它提供了一种将对象与线程关联起来的机制&#xff0c;使得每个线程都可以拥有自己独立的对象副本&#xff0c;从而避免了线程安全问题。然而&#xff0c;使用不当会导致内存泄漏问题。 二…

go 微服务框架kratos错误处理的使用方法及原理探究

通过go语言原生http中响应错误的实现方法&#xff0c;逐步了解和使用微服务框架 kratos 的错误处理方式&#xff0c;以及探究其实现原理。 一、go原生http响应错误信息的处理方法 处理方法&#xff1a; ①定义返回错误信息的结构体 ErrorResponse // 定义http返回错误信息的…