原文地址

1. 概述

Nginx 和Nginx Plus可以不断测试 TCP upstream 服务器,避免使用出现故障的服务器,并且将恢复的服务器逐步地添加到负载平衡组中。

2. 先决条件 Prerequisites

  • 已经配置了 stream 上下文中的 TCP upstream 服务器组:
stream {...upstream stream_backend {server backend1.example.com:12345;server backend2.example.com:12345;server backend3.example.com:12345;}...
}
  • 已经配置了 server 组中转发 TCP 连接的服务器:
stream {...server {listen     12345;proxy_pass stream_backend;}...
}

3. 被动 TCP 健康检查

如果一个连接到 upstream 服务器的尝试超时或失败,Nginx 会把服务器标记为 unavailable 并在指定的时间内停止向这台服务器发送请求。通过向 server 指令中添加下面的参数可以定义 Nginx 在哪些情况下认为服务器不可用:

  • fail_timeout – 时间段,有两个用途:在这个时间段内连接失败指定次数后,服务器被标记为不可用;服务器被标记为不可用时,不可用的时间段。默认是 10 秒。
  • max_fails – 在 fail_timeout 指定的时间段内,连接失败的次数到达这个值后,服务器被标记为不可用。默认是 1 次。

如果一个连接在 10 秒的时间内超时或失败至少 1 次,则 Nginx 把这个服务器设为 10 秒内不可用。下面例子设置的是 30 秒内失败或超时至少 2 次才认为不可用:

upstream stream_backend {server backend1.example.com:12345 weight=5;server backend2.example.com:12345 max_fails=2 fail_timeout=30s;server backend3.example.com:12346 max_conns=3;
}

4. 主动 TCP 健康检查

4.1 健康检查的特性

可以配置健康检查用来测试各种故障类型。例如,Nginx Plus 可以持续测试 upstream 服务器的响应能力,并避免使用发生故障的服务器。

Nginx Plus 向每台 upstream 服务器发送特殊的健康检查请求,并检查响应是否满足特定条件。如果一个到服务器的连接不能建立,则健康检查失败,并认为服务器故障。Nginx Plus 不会把客户端连接代理到故障服务器。如果服务器组定义了几个健康检查,任何一个健康检查失败都会使相关的服务器被视为故障。

4.2 开启健康检查

4.2.1 指定共享内存区域

zone - 共享内存区域可以在 Nginx 的多个工作进程之间共享计数器和连接的状态信息。通过向 upstream 服务器组中添加 zone 指令来指定名字和内存大小:

stream {...upstream stream_backend {zone   stream_backend 64k;server backend1.example.com:12345;server backend2.example.com:12345;server backend3.example.com:12345;}...
}

4.2.2 开启健康检查

在将连接代理到 upstream 服务器组的 server 上下文中添加 health_checkhealth_check_timeout 指令:

stream {...server {listen               12345;proxy_pass           stream_backend;health_check;health_check_timeout 5s;}...
}

health_check 指令开启健康检查功能,health_check_timeout 指令在健康检查时覆盖 proxy_timeout 的值,因为健康检查的超时需要设置的很短。

4.3 微调TCP健康检查

默认情况下,Nginx Plus 会每隔 5 秒钟向 upstream 服务器组中的每台服务器发起一次连接尝试。如果连接无法建立,则 Nginx Plus 会认为健康检查失败,将对应的服务器标记为故障,并且停止将客户端连接发到这台服务器。

要改变默认行为,可以在 health_check 指令中包含下面的参数:

  • interval – Nginx Plus 每隔多久发送一次健康检查(默认是 5 秒)
  • passes – 服务器连续通过几次检查才能被视为健康(默认是 1 次)
  • fails – 服务器连续几次检查失败才能被视为故障(默认是 1 次)
stream {...server {listen       12345;proxy_pass   stream_backend;health_check interval=10 passes=2 fails=3;}...
}

这个例子中,TCP 健康检查的间隔增大为 10 秒,服务器在 3 次连续的健康检查失败时被认为发生故障,并且服务器需要连续通过 2 次健康检查才被认为再次可用。

默认情况下,Nginx Plus 向 upstream 块中 server 指令指定的端口发送健康检查消息。可以指定另一个端口用于健康检查,这在同时监控一台主机上的多个服务时特别有用。通过 health_check 指令中的 port 参数可以覆盖默认端口:

stream {...server {listen       12345;proxy_pass   stream_backend;health_check port=8080;}...
}

4.4 match 配置块

可以配置一系列测试来验证服务器对健康检查的响应。这些测试定义在 stream 上下文中的 match 配置块中。指定 match 配置块时同时指定名字 tcp_test:

stream {...match  tcp_test {...}
}

然后在 health_check 指令中通过 match 参数指明要使用哪个 match 块来验证响应:

stream {...server {listen       12345;health_check match=tcp_test;proxy_pass   stream_backend;}...
}

成功运行健康检查的条件或测试,是用 set 和 send 参数设置的(The conditions or tests under which a health check succeeds are set with send and expect parameters):

  • send – 要发送到服务器的文本字符串或十六进制文字(“/ x”后跟两个十六进制数字)。
  • expect – 从服务器返回的数据需要匹配的字符串或正则表达式。

这两个参数可以有不同的组合,但是每次最多只能指定一个 send 和一个 expect:

  • 如果未指定 send 和 expect 参数,则只测试连接到服务器的能力。

  • 如果只指定了 expect 参数,则期望服务器会无条件发送数据:

match pop3 {expect ~* "\+OK";
}
  • 如果只指定了 send 参数,则期望连接会成功建立,并且指定的字符串会成功发送到服务器:
match pop_quit {send QUIT;
}
  • 如果同时指定 send 和 expect 参数,通过 send 参数从服务器获取的字符串必须匹配 expect 参数指定的正则表达式:
stream {...upstream   stream_backend {zone   upstream_backend 64k;server backend1.example.com:12345;}match http {send      "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n";expect ~* "200 OK";}server {listen       12345;health_check match=http;proxy_pass   stream_backend;}
}

这个例子中,健康检查要通过,则 HTTP 请求一定要发送到服务器,并且从服务器返回的结果包含 200 OK 来指示这是一个成功的 HTTP 响应。

Nginx 日志和监控 - TCP 健康监测相关推荐

  1. Nginx 日志和监控 - HTTP 健康监测

    原文地址 如何在 Nginx 中配置和使用 HTTP 健康监测. 1. 概述 Nginx 和 Nginx Plus 可以持续的测试 upstream 服务器,避免使用发生故障的服务器,并将恢复的服务器 ...

  2. linux查看tcp络连接日志,Linux监控TCP连接数并触发日志记录

    场景 由于服务器经常半夜出现TCP连接数暴增,没办法及时查看处理,回头看记录又看不到现象,不好排查,故编写此脚本用于记录日志. 脚本内容#!/bin/bash #任务计划设置此脚本每分钟执行一次即可, ...

  3. ELK+redis搭建nginx日志分析平台

    ELK+redis搭建nginx日志分析平台 发表于 2015-08-19   |   分类于 Linux/Unix   |   ELK简介 ELKStack即Elasticsearch + Logs ...

  4. ELK 6下日志平台监控Nginx日志构建实践

    整体架构 整体架构主要分为 4 个模块,分别提供不同的功能 Filebeat:轻量级数据收集引擎.基于原先 Logstash-fowarder 的源码改造出来.换句话说:Filebeat就是新版的 L ...

  5. 通过监控Nginx日志来实时屏蔽高频恶意访问的IP

    通过监控Nginx日志来实时屏蔽高频恶意访问的IP 目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Nginx ...

  6. ELK集群部署(八)之监控nginx日志

    监控nginx日志 103上安装nginx yum install -y nginx启动nginx systemctl start nginx访问 http://192.168.56.103/ 配置n ...

  7. presto + kafka + logstash 实时监控分析nginx日志

    文章目录 前言 一.方案选取 二.各项配置 1.logstash配置 2.presto 增加kafka connector 3. 分析监控 总结 前言 目前线上环境nginx日志一天10亿左右,日志已 ...

  8. php 监控nginx日志文件,Nginx 日志分析及实时监控

    本文档以 Nginx 日志为例,介绍如何使用日志分析服务来分析 Nginx 日志中的各种指标. 许多个人站长选取了 Nginx 作为服务器搭建网站,在对网站访问情况进行分析时,需要对 Nginx 访问 ...

  9. grafana监控nginx日志

    先展示下grafana 的一张大图. 看图还是比较炫酷的,那怎么才能够展示这样的大屏,咱们一步一步拆解 用到组件:nginx ,filebeat,logstash,elasticsearch,graf ...

最新文章

  1. 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
  2. 处理南通一客户:Fortigate 310B Firmware丢失
  3. 【深度学习】CNN在大规模图像数据集上的应用(基于keras和MNIST)
  4. Python入门100题 | 第013题
  5. WeChat之小工具:基于C++程序代码设计的查看微信撤销、撤回消息(包括文本、图片、视频等)GUI小工具
  6. 正则表达式收藏(五)之微软的正则
  7. ubuntu java classpath_java – 如何为Ubuntu中的文件夹设置CLASSPATH变量
  8. Noip 2016 愤怒的小鸟 题解
  9. python数据库实例_Python操作MySQL数据库9个实用实例
  10. 使用 Github Pages 和 Hexo 搭建自己的独立博客【超级详细的小白教程】
  11. 全球链界科技发展大会_科技界女性占五席
  12. springmvc处理器及前端控制器介绍
  13. 《深入理解计算机系统》速读提问
  14. 华为开始销售预装深度 Linux 的笔记本电脑
  15. 和秋叶一起学PPT之快速标准化长文档(课时三)
  16. idea生成class文件反编译后中文乱码
  17. 解决:“证书错误,导航已阻止”
  18. apache-felix实例
  19. cocos creator 学习随笔 day03 节点和组件属性
  20. MOOS-ivp 实验十四(2)behavior简要概述

热门文章

  1. SpringBoot项目中自动加载datasourceConfig配置导致启动失败
  2. 浅谈 Linux 内核开发之网络设备驱动[转]
  3. 产品经理知识框架+求职面经——快手,字节跳动,
  4. pr模板.mogrt格式安装方法
  5. 怎样删除计算机硬盘记录,有什么方法能删除电脑里使用过的移动硬盘的记录
  6. 【单片机仿真项目】模拟开关灯(proteus原理图+keil代码)
  7. 大促场景系统稳定性保障实践经验总结
  8. 变分原理及Euler-Lagrange
  9. java关闭端口_使用java代码关闭指定端口的程序-windows
  10. itext文本域自动换行_iText+Flying Saucer生成pdf文档,重写Breaker中文可以换行,但是英文单词会截断问题