我正在尝试使用nginx
进行负载平衡。我必须使用ip_hash
,因为我使用的是websocket。以下是配置:
#user nobody;
worker_processes 3;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream my_http_servers {
ip_hash;
server 127.0.0.1:3001;
server 127.0.0.1:3004;
server 127.0.0.1:3003;
}
server {
listen 3000;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://my_http_servers;
# enable WebSockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
现在,我所有3台服务器和nginx都在计算机1 (ip: 192.168.10.2)
上本地运行。
我也有一个称为此后端服务器的前端应用程序。我的前端在192.168.10.2:4200
上运行。
当我从machine1调用http://192.168.10.2:4200
时,它说的是server1
。
我从连接到相同WIFI (ip: 192.168.10.23)
的machine2呼叫http://192.168.10.2:4200
,但它仍然转到server1
。
ip_hash
未正确执行负载平衡。我不确定自己在做什么错,我知道ip_hash会是粘性连接,因此来自machine1的所有请求都应发送到server1,但是来自machine2的所有请求应发送到其他一些服务器?
修改:
我什至尝试使用hash $remote_addr;
代替ip_hash
,但仍然所有请求都将发送到同一台服务器。
答案 0 :(得分:0)
根据docs
客户端IPv4地址的前三个八位字节或整个IPv6地址用作哈希密钥。
例如,所有这些地址192.168.1。*都将映射到同一服务器。
如果您的服务器在办公室网络中运行,并且您测试的两台计算机也都已连接到办公室网络,则可能无法正常工作,因为通常将办公室网络配置为使所有设备都使用相同的IP地址三个八位字节。
如果您所使用的两台计算机都在同一办公网络上运行,则它们可能具有相同的外部ip,因此它们也将映射到同一台服务器。
如果您运行的两台计算机实际上具有不同的外部ip,并且前三个八位位组不同,那么散列两个不同的ip仍然有33%的机会导致将它们都传递到同一服务器
但是,如果您使用“ hash” 指令而不是“ ip_hash” ,则可以将多个请求变量组合到哈希计算中。示例:
hash '$remote_addr $cookie_zzz $http_user_agent';
当您在指令“哈希” 中使用远程IP地址时,它们(IP地址)被视为普通变量,可用于循环上游。
hash '$remote_addr';