• [转]Nginx主动式后端服务器健康检查配置


    环境:

    SpringCloud微服务(eureka注册中心);
    nginx作为负载均衡;

    场景:

    Nginx -> A服务
    当流量高峰期时,kill A服务
    A服务还没有挂掉,但是注册中心状态为OUT_OF_SERVICE,但是服务在Nginx的upstream中。
    Nginx的流量还是会到达A服务,但是A服务Fegin接口调用其他服务时,会出现异常情况。

    解决方案:

    Nginx主动式调用服务器端的接口(自定义的监控检查接口)。
    自定义检查接口:查询Eureka的状态,若状态不是up状态,那么返回500异常。
    Nginx收到500异常后,自动将ip:port在upstream中摘除。

    代码实现:
    @RestController
    @Slf4j
    public class HealthController {
    
        @Autowired
        private EurekaClient eurekaClient;
    
        @RequestMapping(value = "/health/check/status", method = {RequestMethod.HEAD, RequestMethod.GET})
        public boolean checkStatus(HttpServletResponse response) {
            try {
                InstanceInfo.InstanceStatus instanceRemoteStatus = eurekaClient.getInstanceRemoteStatus();
                boolean up = InstanceInfo.InstanceStatus.UP.equals(instanceRemoteStatus);
                //设置http的响应码
                if (!up) {
                    response.setStatus(500);
                }
                return up;
            } catch (Exception e) {
                return true;
            }
        }
    }
    
    Nginx配置:
    upstream student-service-api {
        server 172.26.34.101:9050;
        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD /health/check/status HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }
    
    1. interval表示每隔3000毫秒向后端发送健康检查包;
    2. rise表示如果连续成功次数达到2 服务器就被认为是up;
    3. fail表示如果连续失败次数达到5 服务器就被认为是down;
    4. timeout表示后端健康请求的超时时间是1000毫秒;
    5. type表示发送的健康检查包是http请求;
    6. check_http_send 表示http健康检查包发送的请求内容。为了减少传输数据量,推荐采用“head”方法;
    7. check_http_expect_alive 指定HTTP回复的成功状态,默认认为2XX和3XX的状态是健康的;
    配置location,查看服务器的健康状态
    location ~* /status {
        check_status;
        access_log   off;
    }
    

    原文:https://www.jianshu.com/p/beb9d8d26464
    参考:Nginx实战系列之功能篇----后端节点健康检查

  • 相关阅读:
    阅读<SQL语言艺术>实践五
    <SQL语言艺术>阅读计划
    文本类文件与VS关联实践
    接口开发原则
    逻辑部分开发原则
    <海量数据库解决方案>2011022301
    5800对于存储卡密码设置问题
    [转]Delphi用户登录窗口框架
    20世纪科学界最重要的12本书
    [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)
  • 原文地址:https://www.cnblogs.com/gotodsp/p/15888656.html
Copyright © 2020-2023  润新知