Nginx负载均衡配置的误区有:1、Nginx记录了连接上游失败,这个要求就返回毛病要求,这个说法是毛病的;2、max_fails是指连续要求失败的次数,这个也是毛病的;3、fail_timeout越短越好和fail_timeout越长越好,这两种做法也是不对的。
下面是详细介绍:
Nginx 的 upstream 模块中 max_fails 及 fail_timeout,这两个指令,分别是配置关于负载均衡进程中,对上游(后端)服务器的失败尝试次数和不可用时间,很多人不是很理解这两个参数到底如何用及具体的含义。
先看官网文档中的描写
官网文档中解释 max_fails 是指在 fail_timeout 配置的时间内,服务器通讯失败的次数,默许为1,即在 fail_timeout 时间内,1次要求失败即不再尝试,将要求根据 hash 规则,转发到下一个上游服务
fail_timeout 有两种含义:
-
当已确认上游服务不可用时,是指与上游服务器通讯失败次数的时间
-
服务器不可用的时间段
默许是10s
文字不是很好理解,搭建个实验环境,环境以下:
-
Nginx
-
PHP-FPM(x2)
nginx 通过 fast-cgi 将 php 要求转发到 PHP-FPM,这里 PHP-FPM 服务即上游服务,设置 upstream,负载 PHP-FPM
upstream 依照默许配置,即 max_fails=1,fail_timeout=10
现在通过 tailf 分别监听两个 PHP-FPM 日志
要求4次,由于是默许轮询的,所以可以看时间,轮询将要求分发到两个PHP-FPM上游
可以从上面的日志中看到,依照轮询规则,下次要求应当落到 PHP-FPM2 上面,接着,关掉 PHP-FPM1,继续要求
可以看到,PHP-FPM1肯定是不响应了,PHP-FPM2正常响应,接着看下Nginx日志
可以看到,关掉 PHP-FPM1 后,发起的要求,本来第二次要求(17:49:58)应当分发到 PHP-FPM1 的,然后从 Nginx 毛病日志可以看到,连接 PHP-FPM1 失败,这里只做了一次失败尝试,然后 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 设置太短,会致使不断的尝试与不可用上游的连接,耗费大量的 tcp 资源进行连接。
-
fail_timeout 越长越好
当访问量大的时候,fail_timeout设置太长,会致使负载不均衡,有可能会击穿某个上游后端,达不到负载的效果。
本文来源:https://www.yuntue.com/post/64872.html | 云服务器网,转载请注明出处!