博客
关于我
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/

    你可能感兴趣的文章
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>
    npm报错fatal: Could not read from remote repository
    查看>>
    npm报错File to import not found or unreadable: @/assets/styles/global.scss.
    查看>>
    npm报错TypeError: this.getOptions is not a function
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>
    npm淘宝镜像过期npm ERR! request to https://registry.npm.taobao.org/vuex failed, reason: certificate has ex
    查看>>
    npm版本过高问题
    查看>>
    npm的“--force“和“--legacy-peer-deps“参数
    查看>>
    npm的安装和更新---npm工作笔记002
    查看>>
    npm的常用操作---npm工作笔记003
    查看>>
    npm的常用配置项---npm工作笔记004
    查看>>
    npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
    查看>>
    npm编译报错You may need an additional loader to handle the result of these loaders
    查看>>
    npm设置淘宝镜像、升级等
    查看>>
    npm设置源地址,npm官方地址
    查看>>
    npm设置镜像如淘宝:http://npm.taobao.org/
    查看>>