负载平衡器以静默方式处理服务器错误

ced*_*vad 4 load-balancing

我正在寻找一个可以静默处理服务器错误的 HTTP 负载平衡器。我想要的是对每个请求进行负载平衡,以便在最坏的情况下有一点超时。

  • 如果工作网络节点返回 HTTP 500 服务器错误,负载均衡器将不得不使用另一个网络节点重试请求。如果第二个节点确实返回另一个 500 错误,则对最后一个节点执行相同的操作(我假设有 3 个节点)。如果最后一个节点返回 500 错误,则将其显示给最终用户。

  • 如果服务器节点超时(响应时间超过 1 或 2 秒),则必须将请求路由到另一台服务器,客户端应在 2 秒以上的时间内收到良好的响应。

Kri*_*aps 12

您可以使用HttpProxyModule(它是非常标准的模块,通常在 nginx 内部)来实现这样的负载均衡器。

Nginx 是轻量级的、快速的并且有很多功能(你甚至可以在其中嵌入 lua 代码)。

您的用例的示例配置是

upstream backend { 
 server 10.0.0.1; 
 server 10.0.0.2;
 server 10.0.0.3;
}
server {
   listen      80;
   server_name _;

   location / {
        proxy_pass  http://backend;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
Run Code Online (Sandbox Code Playgroud)

秘诀是proxy_next_upstream指令,它确定在什么情况下请求将传输到下一个服务器。可能的值为:

  • 错误 — 连接到服务器、向其发送请求或读取其响应时发生错误;
  • timeout — 在与服务器连接、传输请求或从服务器读取响应期间发生的超时;
  • invalid_header — 服务器返回一个空的或不正确的答案;
  • http_500 — 服务器返回代码为 500 的答案
  • http_502 — 服务器返回代码为 502 的答案
  • http_503 — 服务器返回带有代码 503 的答案
  • http_504 — 服务器返回带有代码 504 的答案
  • http_404 — 服务器返回代码 404 的答案
  • off — 禁止将请求传输到下一个服务器