当前位置: 首页 > 科技观察

这些Nginx负载均衡配置误区请运维关注

时间:2023-03-19 10:02:19 科技观察

之前有很多朋友问过Nginx的upstream模块中的max_fails和fail_timeout。很多人不太明白这两个参数怎么用,具体含义。先看官网文档中的描述。官网文档解释,max_fails是指在fail_timeout配置时间内服务器通信失败的次数。默认为1,即在fail_timeout时间内,如果一个请求失败,则不再尝试,请求会根据hash规则,转发给下一个上游服务fail_timeout有两个含义:当上游服务确认不可用,是指与上游服务器通信失败次数的时间。服务器不可用的时间默认为10s。文字不是很容易看懂。下面搭建一个实验环境,环境如下:NginxPHP-FPM(x2)nginx通过fast-cgi将PHP请求转发给PHP-FPM,其中PHP-FPM服务为上游服务,设置上游,加载PHP-FPMupstream按照默认配置,即max_fails=1,fail_timeout=10现在通过tailf监听2次PHP-FPM日志请求4次,因为是默认轮询,所以可以看到时间,轮询会分发请求到两个PHP-FPM上游,从上面的日志可以看出,按照轮询规则,接下来的请求应该落在PHP-FPM2上。然后,关闭PHP-FPM1继续请求。可以看到PHP-FPM1肯定没有响应,PHP-FPM2正常响应。然后看一下从Nginx的日志可以看到,关闭PHP-FPM1后发起的请求,第二个请求(17:49:58)应该已经分发到PHP-FPM1了,然后从Nginx报错可以看到logthattheconnectiontoPHP-FPM1Failed,这里只尝试了一次失败,然后Nginx将请求转发给PHP-FPM2进行处理。然后设置max_fails为2,继续上面的请求开启PHP-FPM1,继续请求,两次负载轮询转发请求,然后继续关闭PHP-FPM1,连续发起多个请求,查看日志所有请求都在PHP-FPM2,看Nginx错误日志。轮询PHP-FPM1两次时,它失败了。之后请求就不会分发到PHP-FPM1的上游服务了。然后,在不开启PHP-FPM1的情况下,继续发起多次请求,因为默认的fail_timeout=10,所以在上述失败检测10s后,再次发起请求,查看日志继续分发给PHP-FPM2,再看在Nginx错误日志中可以看到,在fail_timeout时间后,Ngxin会再次向FPM-PHP1发送请求尝试,2次尝试失败后,在fail_timeout时间内不会分发请求。这里有几个误区:Nginx记录连接上游失败,本次请求返回错误请求,或者请求丢失未处理。这种理解是错误的,Nginx只是将失败的请求记录到日志中,并将请求转发给其他可用的上游服务。当所有上游都不可用时,它将返回一个错误状态。max_fails是指连续请求失败的次数。max_fails是在fail_timeout中指定的一定时间内的失败次数,请求仍然遵循配置的负载均衡算法,不是第一次请求失败后,继续尝试一次本次请求,达到失败次数后,标记为不可用。fail_timeout越短越好。当访问量很大时,fail_timeout设置的太短,会导致不断尝试连接不可用的upstream,消耗大量的tcp资源去连接。fail_timeout越长越好。当访问量较大时,fail_timeout设置过长,会造成负载不均衡,有可能穿透一个upstream后端,达不到负载效果。