在将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反正…
最佳答案
据我所知,Nginx自动尝试每个可用的服务器 – 如果都返回错误,它将返回最后一个响应的错误代码.
原文链接:https://www.f2er.com/nginx/435066.htmlproxy_next_upstream似乎提供了一些更好的控制,可以处理哪些错误将被处理,哪些错误将被忽略(但默认情况下,连接,发送或接收中的任何“错误” – 我相信,60秒超时).
根据文档(措辞可以使用一些工作):
“If with an attempt at the work with the server error occurred,then
the request will be transmitted to the following server and then until
all workers of server not are tested. If successful answer is not
succeeded in obtaining from all servers,then to client will be
returned the result of work with the last server.”
您可以使用将时间(或任何数据)记录到文件并返回502的脚本来验证此行为.如果您只找到1行记录,那么Nginx没有尝试多个服务器,如果您发现记录了两行,它确实.