在向客户端返回 502 之前,nginx 是否可以让重试第二个后端?
这样的事情会起作用吗?
前端:
# haproxy:85 => [a few app servers]:8000
# more specifically:
# haproxy => [nginx => unicorn (502 when busy)]
# Will this try a second app server when the first returns 502?
upstream haproxy {
server 127.0.0.1:85;
server 127.0.0.1:85 backup;
}
server {
listen 80;
proxy_pass http://haproxy;
proxy_next_upstream http_502;
}
后端:
upstream unicorn {
server unix:/tmp/unicorn.sock fail_timeout=0;
}
server {
listen 8000;
proxy_pass http://unicorn;
}
不管怎样,我只是很好奇。这实际上可能相当愚蠢,因为重试最终可能会击中同一台过载服务器,最终还是会返回 502...
答案1
据我所知,Nginx 会自动尝试每个可用的服务器 - 如果所有服务器都返回错误,它将返回最后一个响应的错误代码。
proxy_next_upstream
似乎只是提供了一些更精细的控制,以确定哪些错误将被处理以及哪些将被忽略(但默认值已经是连接、发送或接收中的任何“错误” - 我相信,超时时间为 60 秒)。
根据文档(措辞可能需要一些工作):
“如果尝试与服务器协作时发生错误,则请求将被发送到下一个服务器,直到所有服务器都测试完毕。如果未能从所有服务器获得成功答案,则将向客户端返回与最后一个服务器协作的结果。”
您可以使用将时间(或任何数据)记录到文件并返回 502 的脚本来验证此行为。如果发现只记录了 1 行,则 nginx 没有尝试多台服务器;如果发现记录了两行,则说明尝试了。