我正在尝试为使用多个端口的应用程序设置负载平衡。该应用程序的初始连接在 TCP 端口“A”上建立,而辅助连接在 TCP 端口“B”上建立。
注意-该应用程序不是基于浏览器的。
我如何保证如果第一个连接转到节点 X,那么第二个连接也将发送到节点 X,而不是节点 Y?
这是我想要的:
USER1 --> Nginx --> Node X:A
USER1 --> Nginx --> Node X:B
以下是我不想要的,因为它会破坏应用程序:
USER1 --> Nginx --> Node X:A
USER1 --> Nginx --> Node Y:B
有人对如何在 Nginx 中实现此配置有什么建议/推荐吗?请记住,该应用程序不是基于浏览器的,因此使用 cookie、配置文件等的标准以浏览器为中心的方法似乎不适用 - 至少我还没有发现。
任何帮助都将不胜感激。
谢谢
答案1
这是一个非常基本和简单的配置。这里的关键是hash $remote_addr consistent;
。它的作用是,创建客户端 IP 和后端服务器的映射,并确保每次来自特定 IP 的请求都会发送到其映射的后端,除非后端发生故障。
您可以自由添加其他配置行 keepalive、超时等。
stream {
# Custom log format to capture source and dest IP and request status
log_format tcp_proxy '[$time_local] $remote_addr $protocol $upstream_addr'
'$status $bytes_sent $bytes_received $session_time';
upstream tcp_backend {
hash $remote_addr consistent;
server backend1:ip;
server backend2:ip;
}
server {
listen ip:port;
proxy_pass tcp_backend;
access_log /var/log/nginx-tcp_server-access.log tcp_proxy;
}
}
您可以在以下网址找到其他配置
https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/
http://nginx.org/en/docs/stream/ngx_stream_core_module.html
http://nginx.org/en/docs/http/ngx_http_upstream_module.html