nginx负载均衡的健康检查

时间:2022-05-06
本文章向大家介绍nginx负载均衡的健康检查,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

如果服务器组内有机器出现问题,nginx就不再向其转发请求了,那么nginx如何知道某台服务器是否能正常?

这就需要nginx对每台服务器进行健康检查

检查的方式有两种

(1)被动检查

向服务器转发请求失败,或者没有接收到响应,nginx就认为其不可用,会停止一段时间不再向其转发

默认规则是,如果失败了一次,就停止转发10秒钟

失败次数和停发时间是可以设定的,例如

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

max_fails 允许失败的次数,超出后就认为不可用

fail_timeout max_fails次失败后,暂停的时间

(2)主动检查

定期向每台服务器发送检查请求,不必等到真实转发才判断

使用 health_check 指令实现,例如

    upstream backend {
zone backend 64k;
        server backend1.example.com;
    ......
    }
    server {
        location / {
            proxy_pass http://backend;
health_check;
        }
    }

注意,使用health_check的同时,也要使用zone指令

这个例子中使用了默认的健康检查规则,nginx每5秒向每台服务器发送请求"/",如果沟通失败、超时、返回状态码非2xx/3xx,就判断其不可用

health_check自定义配置

1)指定时间和次数

例如:

health_check interval=10 fails=3 passes=2;

interval 每10秒检查一次

fails 连续3次失败才认为服务器不可用

passes 连续2次成功请求才认为服务器已经可用

2)指定检查地址

health_check uri=/some/path;

默认检查的地址是"/",这里改为/some/path

例如server中配置的主机名为 http://backend1.example.com

检查的地址为 http://backend1.example.com/some/path

3)指定响应信息条件

match server_ok {
    status 200-399;
    header Content-Type = text/html;
    body !~ "maintenance mode";
}
http {
    match server_ok {
        status 200-399;
    header Content-Type = text/html;
        body !~ "maintenance mode";
    }
    server {
        location / {
        ......
            health_check match=server_ok;
        }
    }
}

match指令可以让nginx检查响应的状态、头信息、响应体内信息

例如此例中指定 响应状态必须为200-399,Content-Type必须为text/html,响应体信息中不能含有"maintenance mode"