Nginx负载均衡的max_fails和fail_timeout的默认配置问题
今天发现⼀个奇怪的现象,前端请求后端服务多次后会超时⼀次,经过多次验证确定是⼤概10s左右就会超时⼀次,检查后端服务,发现其中⼀个节点已经夯死。
但是我们的nginx负载均衡策略是轮询机制,按照配置来看应该是每隔⼀次请求轮询到失败的节点时超时⼀次才对。为什么是每隔10s超时⼀次呢?
upstream app_server {
server 192.168.15.98:9080;
nginx部署前端项目server 192.168.15.99:9080;
}
原来,Nginx负载均衡的检查模块中,有两个参数:max_fails和fail_timeout。
默认:fail_timeout为10s,max_fails为1次。
原理:Nginx是基于连接探测的,如果发现后端异常,在单位周期为fail_timeout设置的时间中失败次数
达到max_fails次,这个周期次数内,如果后端同⼀个节点不可⽤,那么就将把节点标记为不可⽤,并等待下⼀个周期(同样时长为fail_timeout)再⼀次去请求,判断是否连接是否成功
这样就能说明我们发现的现象了。即在10s以内后端失败了1次【即⼀次请求超时】,那么这个后端就被标识为不可⽤了,所以在接下来的10s期间,nginx都会把请求分配给正常的后端【即多次的请求正常】。