在 ip_hash 的情况下,nginx 不进行负载平衡

Noo*_*ber 5 nginx

我正在尝试nginx用于负载平衡。我必须使用,ip_hash因为我使用 websockets。以下是配置:

#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";

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我在机器 1 上本地运行了所有 3 个服务器和 nginx (ip: 192.168.10.2)。我还有一个前端应用程序,它调用这个后端服务器。我的前端运行在192.168.10.2:4200.
当我http://192.168.10.2:4200从 machine1调用时,它会说server1. 从连接到同一个 WIFI 的 machine2 上(ip: 192.168.10.23),我打电话http://192.168.10.2:4200,但它仍然转到server1. ip_hash没有正确地进行负载平衡。我不确定我做错了什么,我知道 ip_hash 将是一个粘性连接,所以来自 machine1 的所有请求都应该发送到 server1 而来自 machine2 的它应该发送到其他一些服务器?

编辑:

我什至尝试使用hash $remote_addr;而不是ip_hash,但仍然所有请求都将发送到同一台服务器。这是我使用哈希的配置:

worker_processes 3;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream my_http_servers {
        hash $remote_addr;
        server 127.0.0.1:3001;
        server 127.0.0.1:3002;
        server 127.0.0.1:3003;
    }
    server {
        listen       3000;
        server_name  localhost;

        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";

        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

ofi*_*ule 3

根据文档

客户端 IPv4 地址或整个 IPv6 地址的前三个八位字节用作散列密钥。

例如,所有这些地址 192.168.1.* 将被映射到同一服务器。

如果您的服务器在办公室网络中运行,并且您测试的两台计算机也连接到您的办公室网络,则它可能无法工作,因为通常办公室网络的配置使得所有设备都将获得具有相同三个八位字节的 IP 地址。

如果您使用的两台计算机都在同一办公网络上运行,那么它们可能具有相同的外部 IP,因此它们也将映射到同一服务器。

如果您使用实际不同的外部 ip 运行两台计算机,且前三个八位字节不同,则仍有 33% 的机会对两个不同的 ip 进行哈希处理将导致将它们传递到同一服务器

但是如果您使用“hash”指令而不是“ip_hash”,那么您可以将多个请求变量组合到哈希计算中。例子:

hash '$remote_addr $cookie_zzz $http_user_agent';
Run Code Online (Sandbox Code Playgroud)

当您在指令"hash"中使用远程 IP 地址时,它们(IP 地址)将被视为普通变量,并且可用于循环上游。

hash '$remote_addr';
Run Code Online (Sandbox Code Playgroud)