如果服务器组内有机器出现问题,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"