博客
关于我
Nginx实战|Nginx健康检查
阅读量:215 次
发布时间:2019-02-28

本文共 2851 字,大约阅读时间需要 9 分钟。

服务治理中的健康检查:基于Nginx的方案实践

背景

服务治理是现代化应用中至关重要的任务之一。在这一过程中,及时感知服务节点的状态变化至关重要。尤其是服务的自动注册与异常节点的自动摘除,这需要一个可靠的健康检查机制来确保服务的稳定性和可用性。Nginx作为高性能的反向代理服务器,提供了灵活的健康检查配置,能够满足各种复杂的应用场景。

方案概述

Nginx 提供了三种主要的HTTP服务健康检查方案供用户选择。这三种方案分别针对不同的应用场景和需求,能够满足不同级别的健康检查需求。以下是具体的三种方案介绍:

  • TCP层默认检查方案

    这是最简单的健康检查方式。Nginx会定期建立一条TCP连接到目标服务器。如果连接成功建立,Nginx则认为目标服务器是健康的。这种方式简单直接,但也有其局限性。例如,对于那些已经处于listen状态的HTTP服务,TCP连接的成功并不一定意味着服务已经完全就绪或处理逻辑没有阻塞。

  • HTTP层默认检查方案

    由于TCP层检查存在一定的局限性,HTTP层的健康检查方案更为合理。这种方式通过发送一个标准的HTTP GET请求来判断目标服务器的状态。具体来说,Nginx会向目标服务器发送GET / HTTP/1.0请求。如果服务器返回状态码为2xx或3xx,Nginx就会认为目标服务器是健康的。这种检查方式能够更准确地反映服务内部处理逻辑是否正常运行。

  • 自定义检查方案

    Nginx还允许用户根据具体需求定义自定义的健康检查方案。这种灵活性使得Nginx能够适应各种复杂的应用场景。例如,可以自定义发送特定URI的HTTP请求,或设置特定的状态码范围来判断服务的健康状况。

  • 配置参数详解

    在实际应用中,Nginx的健康检查配置参数可以根据具体需求进行调整。以下是常用配置参数的详细说明:

    2.1 check

    check指令用于定义健康检查的基本参数,具体语法如下:

    check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]

    默认值:interval=30000fall=5rise=2timeout=1000default_down=truetype=tcpport=0

    • interval:指定健康检查的间隔时间,默认为30秒。
    • fall:连续失败次数达到fall次后,服务器状态变为down
    • rise:连续成功次数达到rise次后,服务器状态变为up
    • timeout:后端健康检查请求的超时时间,默认为1秒。
    • default_down:初始状态设置,默认为true,表示初始状态为down
    • type:指定健康检查的类型,支持tcphttpssl_hellomysqlajp
    • port:指定检查的目标端口,默认为0,表示与目标服务器相同的端口。

    2.2 check_http_expect_alive

    check_http_expect_alive指令用于指定HTTP健康检查的成功状态码范围。语法如下:

    check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]

    默认值:http_2xx | http_3xx

    • http_2xx:表示允许2xx范围内的状态码(如200、201、202等)。
    • http_3xx:表示允许3xx范围内的状态码(如300、301、302等)。
    • http_4xx:表示允许4xx范围内的状态码(如400、401、403等)。
    • http_5xx:表示允许5xx范围内的状态码(如500、501、502等)。

    2.3 check_http_send

    check_http_send指令用于定义HTTP健康检查请求的内容。语法如下:

    check_http_send http_packet

    默认值:"GET / HTTP/1.0\r\n\r\n"

    • http_packet:指定发送的HTTP请求包,支持HEADGET方法。
      • HEAD:推荐使用HEAD方法,减少传输数据量。在使用HEAD方法时,可以添加Connection: keep-alive请求头,支持长连接。
      • GET:在使用GET方法时,请求URI的大小不宜过大,以避免在单次interval内无法传输完成。

    完整示例

    以下是一个完整的Nginx配置示例,展示了如何在实际应用中配置健康检查:

    http {    upstream cluster1 {        server 192.168.0.1:80;        server 192.168.0.2:80;        check interval=3000 rise=2 fall=5 timeout=1000 type=http;        check_http_send "HEAD / HTTP/1.0\r\n\r\n";        check_http_expect_alive http_2xx http_3xx;    }    upstream cluster2 {        server 192.168.0.3:80;        server 192.168.0.4: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;        location /1 {            proxy_pass http://cluster1;        }        location /2 {            proxy_pass http://cluster2;        }        location /status {            check_status;            access_log off;            allow SOME.IP.ADD.RESS;            deny all;        }    }}

    参考连接

    转载地址:http://xyxi.baihongyu.com/

    你可能感兴趣的文章
    NOIp模拟赛二十九
    查看>>
    Vue3+element plus+sortablejs实现table列表拖拽
    查看>>
    Nokia5233手机和我装的几个symbian V5手机软件
    查看>>
    non linear processor
    查看>>
    Non-final field ‘code‘ in enum StateEnum‘
    查看>>
    none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
    查看>>
    None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
    查看>>
    NoNodeAvailableException None of the configured nodes are available异常
    查看>>
    Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
    查看>>
    nopcommerce商城系统--文档整理
    查看>>
    NOPI读取Excel
    查看>>
    NoSQL&MongoDB
    查看>>
    NoSQL介绍
    查看>>
    NoSQL数据库概述
    查看>>
    Notadd —— 基于 nest.js 的微服务开发框架
    查看>>
    NOTE:rfc5766-turn-server
    查看>>
    Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Notepad++在线和离线安装JSON格式化插件
    查看>>
    notepad++最详情汇总
    查看>>
    notepad++正则表达式替换字符串详解
    查看>>