我使用 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;