如果 Unicorn 超载并返回 502,nginx 可以重试请求吗?

如果 Unicorn 超载并返回 502,nginx 可以重试请求吗?

在向客户端返回 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 没有尝试多台服务器;如果发现记录了两行,则说明尝试了。

相关内容