目前有三台服务器,ABC
A 在外网做负载均衡,利用 upstream 转发到 B,C
A 中 upstream 的设置里,B 和 C 都是一样的,为 max_fails=2 fail_timeout=30s
BC 的 upstream 设置只转发到本地的一个端口,后面也都写了 max_fails=2 fail_timeout=30s,但是应该是无效的.
现在有个问题就是某个请求会重复两次.
根据 log 里的内容,A 的 nginx 的 log 里此请求只出现了一次.
在 B 的 log 里出现了一次,B 中返回码为 499,request_time 为 60 秒
然后在 C 的 log 内也出现了一次,返回码为 200.
所以我的想法是,A 先转发到 B,B 接受请求后的后台程序执行了该请求,但是响应时间过长,导致返回 499,于是 A 的 nginx 以为请求没有被响应,就把此请求转发到 C,C 又重新接受了请求.导致了该请求被执行了两次.
如果真的是这种原因的话,那么我有几个小小的问题
第一,这个 60 秒是怎么算出来的?如果是按照 A 中的 max_fails=2 fail_timeout=30s 的设置得出的话,朝 B 转发两次,这样总共不应该是有三次请求的执行吗?(B 的两次和 C 的一次)
第二,A 中 nginx 的 log 在 B 失败之后转发的记录是没有被记录在 log 里的吗?
第三,这种情况有什么有效的处理方法吗?
望各位 nginx 大牛不吝赐教.
第一:60s应该是B的执行时间,B如果失败Nginx应该是立刻转发到另外的server的,max_fails的意思是在两次失败以后nginx会把这个server标记为不可用,并不是失败了立刻继续请求两次
第二:对A来说只是来了一次请求