检测 Nginx 负载均衡器中的 502 响应

检测 Nginx 负载均衡器中的 502 响应

我有以下设置 - Nginx 负载均衡器,它接收 https 流量并传递到节点。每个节点上都有一个反向代理,用于处理 https 流量并以纯文本形式将数据传递给 App1、App2。

--> LB --> RP -> App1, App2
       `-> RP -> App1, App2

现在的问题是,如果 App1 在某个节点上关闭,负载均衡器不会检测到,并会很乐意向客户端返回 502。我猜是因为反向代理仍然处于运行状态并且正在加密流量,因此负载均衡器只是传递数据。我如何通知负载均衡器节点 1 上的 App1 已关闭并转到另一个节点?

简化的LB nginx.conf:

stream {
    map "$ssl_preread_server_name:$server_port" $namehttps {
        hostnames;
        some-address.io:8443 test_site;
    }

    upstream test_site {
        server 192.168.1.10;
        server 192.168.1.11
    }
    server {
        proxy_pass $namehttps;
        ssl_preread on;
    }
}

反向代理 nginx.conf 充当标准反向代理,终止 ssl 流量并将未加密的流量传递给应用程序。

答案1

问题在于你正在使用stream但不应该使用。

nginx 使用代理时无法看到连接负载stream。它甚至无法知道其中是否存在 HTTP,也不stream关心任何有关负载的信息。

您将需要使用“终止 SSL 流量的标准反向代理”。

答案2

如果我正确理解了您的意思,您可以使用主动健康检查,它基本上是定期的 HTTP 请求。

根据 NGINX 文档(https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check/),我将在这里总结一下,如果页面出现 404,你必须:

  • server在配置的一部分中定义一个location /部分(或类似的路径);

  • 在位置 / (或类似)部分中包含proxy_passand指令;health_check

  • 在服务器组中,通过添加(或类似的值)http upstream来定义共享内存。zone backend 64k

但是,如果您使用块,则此方法不起作用stream,因为流在​​ TCP/UDP 层工作。上游必须包含在块中http,这样您才能受益于模块的更高层功能http

相关内容