概述
本章,您将了解到 Nginx 作为反向代理的代理服务器时,如何主动检查后端服务器的健康状态。
有时,Nginx 的上游服务器(一组后端服务器)可能会因为各种原因变得不可用,如硬件故障、网络问题、软件崩溃等,如同大多数开源软件采用的 "心跳监听" 机制一样, Nginx 代理服务器也有一种定时检查机制来检查这些后端服务器的状态,即 主动健康检查。
与主动健康检查相关的是 被动健康检查,也就是在 负载规则 中提到的两个参数:
max_fails=3- 在fail_timeout参数指定的时间内与后端服务器的通信次数上限,当到达上限次数后,将认为对应的后端服务器处于临时不可用状态且不可用的时间同样由fail_timeout参数决定fail_timeout=40s- 在指定的时间内与后端服务器进行通信的次数上限;后端服务器临时不可用的时间
主动健康检查属于 Nginx 商业版(Nginx Plus)的专属功能,原生社区版 Nginx 并不支持。若需要社区版 Nginx 支持主动健康检查,则需要第三方模块(如 nginx_upstream_check_module 模块 ),一些 Nginx 变体(如 OpenResty、Tengine )原生自带相关模块。
nginx_upstream_check_module 模块:
- 适配老版本 Nginx (基本处于停止维护状态) - https://github.com/sysulq/nginx_upstream_check_module
- 适配新版本 Nginx (支持 1.26+ )- https://github.com/mofantor/nginx_upstream_check_module
- Tengine 中的模块 - https://github.com/yaoweibin/nginx_upstream_check_module
商业版
health_check 指令 - 启用主动健康检查,语法为 health_check [parameters];。常用的参数(parameters)如下表所示:
| 参数 | 默认值 | 说明 |
|---|---|---|
interval=time |
5s | 主动健康检查的间隔时间,例如 interval=5s 表示每 5 秒探测一次 |
fails=number |
1 | 连续主动健康检查失败多少次后,将后端服务器标记为状态异常 |
passes=number |
1 | 连续主动健康检查通过多少次后,将后端服务器标记为运行正常 |
uri=path |
/ | 主动健康检查请求中所使用的 URL(后端服务器上的 URL 路径) |
match=name |
定义一个书写在 http 上下文中的 match 上下文,通过引用该 match 上下文来定义后端服务器健康的标准。默认情况下,health_check 指令只检查 HTTP 响应状态码是否为 2xx 或 3xx |
|
port=number |
指定主动健康检查使用的端口。若未指定,则使用 server 指令中定义的端口 |
|
mandatory |
设置在首次通过主动健康检查之前,在初始化阶段将后端服务器定义为 "检查中(Checking)"。处于 "检查中" 状态的后端服务器不会接收客户端请求。如果未指定该参数,后端服务器在初始化阶段将被视为运行正常。可将该参数简单理解为 "有门槛考核制的主动健康检查" |
主动健康检查的配置示例:
...
events {
...
}
http {
...
# 定义一个名为 server_ok 的 match 上下文
## 规则之间的关系为 and,即必须满足全部规则才能被定义为 健康
match server_ok {
## 规则一: 响应状态码必须在 200 - 399
status 200-399;
## 规则二:请求头中包含 "Content-Type" 字段且值为 "text/html"
header Content-Type=text/html;
## 规则三:响应体中必须包含的内容(支持正则表达式)
body ~ "ok";
}
...
# 定义了名为 backend1 的一组后端服务器(未指定任何负载策略,默认使用轮询)
upstream backend1 {
# 为上游服务器设置名为 my_zone 的共享内存区域,大小为 64k
zone my_zone 64k;
server 192.168.100.30 max_fails=3 fail_timeout=60s;
server 192.168.100.35 max_fails=3 fail_timeout=60s;
server 192.168.100.40 max_fails=3 fail_timeout=60s;
}
...
server {
listen 192.168.100.20:80;
server_name my-tests.com www.my-tests.com;
# 重定向跳转
return 301 https://www.my-tests.com$request_uri;
}
server {
listen 192.168.100.20:443 ssl http2 backlog=8000 reuseport;
server_name www.my-tests.com;
# SSL/TLS 证书相关的配置
...
# 压缩响应
...
# 在请求转发给后端服务器之前对 HTTP 请求头进行统一设置
...
# 连接优化相关统一设置
...
# 安全风险控制统一设置
...
location / {
...
proxy_pass http://backend1;
health_check interval=10s fails=2 passes=2 uri=/health match=server_ok mandatory;
...
}
}
}
关于 match 上下文能配置的指令,参阅 官方文档。
在配置时注意:
- upstream 上下文中必须配置
zone指令 - match 上下文可书写在 http 、server 上下文中
health_check指令可书写在 server、location 上下文中
社区版
参阅上面三个 Github 项目的自述文件(README.md 文件)。使用时需要注意 Nginx 版本适配问题。
总结
在大多数情况下,其实 Nginx 原生自带的被动健康检查已经足够了,如果生产环境中对可用性要求非常高且需要专业级的主动健康检查,一些开源软件也能实现,比如 HAProxy 这样的。
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论










