使用 Nginx 进行负载平衡:当前服务器宕机时,POST 请求不会转发到下一个上游服务器

使用 Nginx 进行负载平衡:当前服务器宕机时,POST 请求不会转发到下一个上游服务器

我使用 Nginx 作为两个 Web 服务器之间的负载平衡器。

我注意到,当两个 Web 服务器中的一个宕机时,GET 请求会被转发到第二个服务器,而 POST 则不会:

这是我收到的消息得到请求,它被转发到第二台服务器,并以正确的 200 结束:

“xx.xx.xx.xx” 502 na.mysite.net [...] “server-01:443,服务器-02:443” [...] 502,200

这是我收到的消息邮政请求以 502 结束:

“xx.xx.xx.xx” 502 na.mysite.net [...] “服务器-01:443” [...]502

上游服务器定义如下:

upstream my-site{
        keepalive 16;

        # Web backend servers
        server server-01:443 max_fails=0;
        server server-02:443 max_fails=0;
}

在你问之前,我不使用最大失败次数也不失败超时因为有些请求可能需要很长很长时间(几分钟),所以我不希望它们被视为失败。

我希望 POST 请求具有相同的行为,但是在 Google 或 Nginx 的文档中找不到有关此信息。

欢迎任何帮助,提前谢谢!

答案1

我明白了,这是为了防止数据损坏而设计的:

非幂等 通常情况下,如果请求已发送到上游服务器(1.9.13),则具有非幂等方法(POST,LOCK,PATCH)的请求将不会传递给下一个服务器;启用此选项明确允许重试此类请求;

答案2

要让 nginx 服务器将请求转发到下一个服务器,您需要使用non_idempotent选项。

nginx 文档(proxy_next_upstream 部分):

non_idempotent

normally, requests with a non-idempotent method (POST, LOCK, PATCH) 
are not passed to the next server if a request has been sent to an 
upstream server (1.9.13); enabling this option explicitly allows 
retrying such requests;

相关内容