我有以下设置 - 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_pass
and指令;health_check
在服务器组中,通过添加(或类似的值)
http
upstream
来定义共享内存。zone backend 64k
但是,如果您使用块,则此方法不起作用stream
,因为流在 TCP/UDP 层工作。上游必须包含在块中http
,这样您才能受益于模块的更高层功能http
。