Nginx的HTTP运行时健康检查

本文介绍如何在NGINX Plus和NGINX Open Source中配置和使用HTTP运行状况检查。

  • 介绍
  • 先决条件
  • 被动健康检查
    • 服务器缓慢启动
  • 主动健康检查
    • 指定请求的URI
    • 定义自定义条件

介绍

NGINX和NGINX Plus可以持续测试您的上游服务器,避免出现故障的服务器,并可以将恢复的服务器正常地添加到负载平衡组中。

先决条件

  • 对于被动健康检查,可以使用NGINX Open Source或NGINX Plus
  • 对于主动健康检查和实时活动监控仪表板,NGINX Plus
  • 一个负载均衡的HTTP上游服务器组

被动健康检查

对于被动运行状况检查,NGINX和NGINX Plus会监视事务的发生,并尝试恢复失败的连接。如果仍然无法恢复交易,则NGINX Open Source和NGINX Plus将服务器标记为不可用,并暂时停止向其发送请求,直到再次将其标记为活动。

对于每个上游服务器,使用块中server指令的参数定义了标记上游服务器不可用的条件upstream

  • fail_timeout –设置必须多次尝试失败才能将服务器标记为不可用的时间,以及将服务器标记为不可用的时间(默认为10秒)。
  • max_fails –设置在fail_timeout服务器标记为不可用的时间内必须发生的失败尝试次数(默认为1次尝试)。

在下面的示例中,如果NGINX无法在30秒内向服务器发送请求或没有收到3次响应,则将服务器标记为30秒钟不可用:

upstream backend {server backend1.example.com;server backend2.example.com max_fails=3 fail_timeout=30s;
}

请注意,如果组中只有一台服务器,则fail_timeoutmax_fails参数将被忽略,并且服务器永远不会被标记为不可用。

服务器缓慢启动

最近恢复的服务器很容易被连接淹没,这可能导致服务器再次标记为不可用。慢速启动允许上游服务器在恢复或可用后将其权重从零逐渐恢复到其标称值。这可以通过slow_start上游server指令的参数来完成:

upstream backend {server backend1.example.com slow_start=30s;server backend2.example.com;server 192.0.0.1 backup;
}

请注意,如果组中只有一台服务器,则将slow_start忽略该参数,并且永远不会将服务器标记为不可用。慢速启动是NGINX Plus独有的。

主动健康检查

NGINX Plus可以通过向每台服务器发送特殊的运行状况检查请求并验证正确的响应来定期检查上游服务器的运行状况。

要启用主动健康检查:

  1. location将请求(proxy_pass)传递到上游组的中,包括health_check指令:

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

    此代码段定义了一个服务器,该服务器将所有请求()location /传递给名为的上游组backend。它还使用以下health_check指令启用高级运行状况监视:默认情况下,NGINX Plus每五秒钟向组中的每个服务器发送一个“ / ” 请求backend。如果发生任何通信错误或超时(服务器以从200到的范围之外的状态代码响应399),则运行状况检查将失败。服务器被标记为不正常,NGINX Plus不会再次向其发送客户端请求,直到它再次通过健康检查。

    (可选)您可以指定另一个端口进行运行状况检查,例如,用于监视同一主机上许多服务的运行状况。使用指令的port参数指定一个新端口health_check

    server {location / {proxy_pass   http://backend;health_check port=8080;}
    }

  2. 在上游服务器组中,使用以下zone指令定义共享内存区域:

    http {upstream backend {zone backend 64k;server backend1.example.com;server backend2.example.com;server backend3.example.com;server backend4.example.com;}
    }

    该区域在所有工作进程之间共享,并存储上游组的配置。这使工作进程可以使用同一组计数器来跟踪来自组中服务器的响应。

    可以使用health_check伪指令的参数覆盖活动运行状况检查的默认值:

    location / {proxy_pass http://backend;health_check interval=10 fails=3 passes=2;
    }

    在此,interval参数将运行状况检查之间的延迟从默认的5秒增加到10秒。该fails参数要求服务器未能通过三项健康检查,以将其标记为不健康(高于默认状态)。最后,该passes参数表示服务器必须通过两次连续检查才能再次标记为运行状况正常,而不是默认情况。

指定请求的URI

使用指令的uri参数health_check来设置要在运行状况检查中请求的URI:

location / {proxy_pass http://backend;health_check uri=/some/path;
}

指定的URI会附加到upstream块中为服务器设置的服务器域名或IP地址上。对于backend上面声明的样本组中的第一台服务器,运行状况检查将请求URI http://backend1.example.com/some/path

定义自定义条件

您可以设置响应必须满足的自定义条件,服务器才能通过运行状况检查。条件在一个match块中定义,该块matchhealth_check指令的参数中引用。

  1. 在级别上,指定块并为其命名,例如:http {}match {}server_ok

    http {#...match server_ok {# tests are here}
    }
    

  2. health_check通过指定match参数和match块名称,从指令中引用该块:

    http {#...match server_ok {status 200-399;body !~ "maintenance mode";}server {#...location / {proxy_pass http://backend;health_check match=server_ok;}}
    }

    如果响应的状态代码在200– 范围内399,并且其主体不包含字符串,则在此处通过运行状况检查。maintenance mode

match指令使NGINX Plus可以检查状态码,标头字段和响应的正文。使用此伪指令,可以验证状态是否在指定范围内,响应是否包含标头,或者标头或正文是否与正则表达式匹配。该match指令可以包含一个状态条件,一个主体条件和多个标头条件。响应必须满足match块中定义的所有条件,服务器才能通过运行状况检查。

例如,下面的match指令匹配有状态代码响应200,精确值text/htmlContent-Type标题,文字的身体:Welcome to nginx!

match welcome {status 200;header Content-Type = text/html;body ~ "Welcome to nginx!";
}

以下示例使用感叹号(!)定义响应不必通过运行状况检查的特征。在这种情况下,健康检查通过在状态代码比其他东西301302303,或307,并没有Refresh头。

match not_redirect {status ! 301-303 307;header ! Refresh;
}

还可以为非HTTP协议(例如FastCGI,memcached,SCGI,uwsgi)以及TCP和UDP启用运行状况检查。

Nginx的HTTP运行时健康检查相关推荐

  1. Nginx的TCP运行时健康检查

    Nginx的TCP运行时健康检查 本章介绍如何配置TCP的运行状况检查. 介绍 先决条件 被动TCP运行状况检查 服务器缓慢启动 活动TCP运行状况检查 微调TCP运行状况检查 "匹配&qu ...

  2. Nginx负载均衡配置和健康检查

    Nginx负载均衡配置和健康检查 注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. nginx的强大之处不必要我细说,当初第一次接触ngin ...

  3. C++工作笔记-编译时类型检查与运行时类型检查

    转载链接如下: https://blog.csdn.net/u013298353/article/details/17676959 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮 ...

  4. 【TS】1552- 浅谈TS运行时类型检查

    What-什么是运行时类型检查? 编译时类型检查(静态类型检查): 在编译阶段对变量类型进行静态检查,编译后的代码不保留任何类型标注信息,对实际代码运行没有影响 运行时类型检查(动态类型检查): 在代 ...

  5. 运行时异常 检查时异常

    Throwable是Java程序中所有异常对象的根基类,而Throwable是从Object类直接继承来的, Throwable可分为error(错误)和 Exception(异常).error表示的 ...

  6. java运行时_java编译时与运行时概念与实例详解

    Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...

  7. C++知识点54——RTTI(运行时类型识别)

    一.RTTI概述 RTTI的功能由两个运算符实现,一个是typeid,用来返回表达式的类型:另一个是dynamic_cast,作用是将基类的指针或引用安全地转为子类的指针或引用 二.typeid ty ...

  8. 基于 Java 2 运行时安全模型的线程协作--转

    在 Java 2 之前的版本,运行时的安全模型使用非常严格受限的沙箱模型(Sandbox).读者应该熟悉,Java 不受信的 Applet 代码就是基于这个严格受限的沙箱模型来提供运行时的安全检查.沙 ...

  9. 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)...

    概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...

最新文章

  1. extjs video
  2. ubuntu 安装yum_如何在 Linux 中安装微软的 .NET Core SDK | Linux 中国
  3. java通过url抓取网页数据-----正则表达式
  4. js 正则 长度不超过50_如何花不超过50元人民币,拍抖音网红海马体照片?
  5. 怎么读服务器文件内容,服务器上读取文件内容
  6. 可用的免费公开的DNS
  7. 安川焊接机器人做圆弧运动编程_安川MOTOMAN工业机器人编程与操作(3)
  8. SQL server 2008 r2导入数据
  9. mysql测评作业指导书_测评作业指导书
  10. 日语常用会话1000句
  11. 【题解】【中国大学MOOC】(北京大学)人工智能与信息社会考试——期末考试
  12. 重磅!清华大学首个原创虚拟美女学生,“华智冰”唱歌好听到爆
  13. golang string转int8_Go教程:23 string转换int类型方法对比
  14. 10-解决win10系统更新后开机变慢的问题
  15. 嵌入地图跳转高德地图_各种地图跳转导航
  16. 弘辽科技:提升销量没流量要继续提升吗?如何提高店铺流量?
  17. 释放低代码原力,用友YonBuilder助力太湖云打造多云管理平台
  18. 2014年AVAYA IP Office 合作伙伴大会在北京举行,协作成长,乐在德云
  19. 任意凸四边形内最大矩形
  20. C++switch语句 | 判断某年某月有几天

热门文章

  1. 15个带示例的jQuery滚动条插件
  2. ubuntu 文件服务器--samba的安装和配置
  3. rsync常用参数组合
  4. 子查询 不同情况 mysql
  5. 扩展图形输出 1111 java
  6. django-正向查询与反向查询演练-查询集的三种状态
  7. 音量已经调到100%,如何再调整
  8. 私有GIT服务器的免密提交
  9. MySQL中查看某数据库大小及表大小
  10. QTP的那些事--共享对象库的使用