如果ip_hash,nginx无法进行负载平衡

时间:2019-12-01 10:12:03

标签: nginx

我正在尝试使用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,但它仍然转到server1ip_hash未正确执行负载平衡。我不确定自己在做什么错,我知道ip_hash会是粘性连接,因此来自machine1的所有请求都应发送到server1,但是来自machine2的所有请求应发送到其他一些服务器?

修改:

我什至尝试使用hash $remote_addr;代替ip_hash,但仍然所有请求都将发送到同一台服务器。

1 个答案:

答案 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';