nginx_upstream_check_module
nginx_upstream_check_module copied to clipboard
upstream-fair模块和nginx_upstream_check_module模块一起使用,nginx 自带的处理节点失效和恢复的触发条件不工作
1.这两个模块配置成功以后,使用fair算法负载均衡的话,负载节点宕机(测试的时候直接nginx stop),故障修复后,想重新上线该节点,重启该负载节点的nginx,发现负载均衡服务器并不能把宕机的节点置为有效节点向其转发用户请求。而且是永久不会,除非所有负载节点全部宕机之后才会。
2.不使用fair,使用轮训算法做负载均衡就可以根据max_fails和fail_timeout参数控制宕机节点自动重新上线。
请问这是什么原因导致的呢?
相关资料参考:
(1)nginx 判断节点失效状态
Nginx 默认判断失败节点状态以connect refuse和time out状态为准,不以HTTP错误状态进行判断失败,因为HTTP只要能返回状态说明该节点还可以正常连接,所以nginx判断其还是存活状态;除非添加了proxy_next_upstream指令设置对404、502、503、504、500和time out等错误进行转到备机处理,在next_upstream过程中,会对fails进行累加,如果备用机处理还是错误则直接返回错误信息(但404不进行记录到错误数,如果不配置错误状态也不对其进行错误状态记录),综述,nginx记录错误数量只记录timeout 、connect refuse、502、500、503、504这6种状态,timeout和connect refuse是永远被记录错误状态,而502、500、503、504只有在配置proxy_next_upstream后nginx才会记录这4种HTTP错误到fails中,当fails大于等于max_fails时,则该节点失效;
(2)nginx 处理节点失效和恢复的触发条件
nginx可以通过设置max_fails(最大尝试失败次数)和fail_timeout(失效时间,在到达最大尝试失败次数后,在fail_timeout的时间范围内节点被置为失效,除非所有节点都失效,否则该时间内,节点不进行恢复)对节点失败的尝试次数和失效时间进行设置,当超过最大尝试次数或失效时间未超过配置失效时间,则nginx会对节点状会置为失效状态,nginx不对该后端进行连接,直到超过失效时间或者所有节点都失效后,该节点重新置为有效,重新探测;
(3)所有节点失效后nginx将重新恢复所有节点进行探测
如果探测所有节点均失效,备机也为失效时,那么nginx会对所有节点恢复为有效,重新尝试探测有效节点,如果探测到有效节点则返回正确节点内容,如果还是全部错误,那么继续探测下去,当没有正确信息时,节点失效时默认返回状态为502,但是下次访问节点时会继续探测正确节点,直到找到正确的为止。
遇到了同样的问题