Windows 中 Nginx 开启健康检查

问题描述

正式环境,在 Windows 中安装了 Nginx 作为负载均衡,配置两个节点,其中一个节点宕机重启过程中,页面请求仍然会转发至宕机重启中的节点,导致页面报错

解决方案

一、使用三方插件

参考:https://www.cnblogs.com/lwqlun/p/8835867.html
使用第三方工具 Consul 及 Consul 插件 Consul Template
将 web 服务注册至 Consul,由 Consul 定时检查服务状态,当发现有服务宕机时,动态修改 Nginx 配置文件,使用 reload 重启 Nginx

二、使用 Nginx 自身实现的被动健康检查(采用)

Nginx 配置

upstream mes {
    server host.docker.internal:8080 max_fails=1 fail_timeout=10;
    server host.docker.internal:8081 max_fails=1 fail_timeout=10;
}

参数含义:
在 10 秒(fail_timeout)内,请求该服务失败 1 次(max_fails),则认为该服务宕机,后 10 秒(fail_timeout)内不会再将请求转发至该服务,10 秒(fail_timeout)后再次尝试请求该服务,如果失败再次等待 10 秒(fail_timeout),如此循环,直到请求成功

那么将 fail_timeout 设置为服务启动时间,即可解决上述问题,当请求某一个服务失败,认为该服务宕机,在服务恢复之前不去请求该服务

这样配置之后,发现上述问题任然存在,某一个服务宕机重启中,请求任然会发送至该服务
通过浏览器控制台发现,发往该服务的请求没有失败,而是 pending 状态(服务启动过程中请求都会等待)

Nginx 中等待响应的最大时间默认是 60 秒,超过 60 秒才会认定失败
那么增加配置proxy_connect_timeout 1

location /uma-unimax-web {
    proxy_set_header Host            $host;
    proxy_set_header X-Real-IP       $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Cookie $http_cookie;
    proxy_connect_timeout 1;
    proxy_pass http://mes/uma-unimax-web ;
}

proxy_connect_timeout:服务连接的超时时间
proxy_read_timeout:连接成功后,等候服务响应时间
proxy_send_timeout : 服务数据回传时间

设置连接超时时间后,上述问题解决

三、安装 Docker,使用 Nginx 健康检查模块

该方案理论可行,还未尝试,感兴趣的可以尝试并留言交流
在 Windows 中安装 Docker,创建 Nginx 容器参考: Docker Desktop 安装 nginx,redis 及挂载外部文件
容器创建完成后通过命令查看 Nginx 版本号
docker exec 容器名 nginx -V
image.png
下载对应版本模块:https://github.com/yaoweibin/nginx_upstream_check_module
image.png
安装参考:https://blog.csdn.net/m0_37543627/article/details/120840074