将 Nginx 修补为 ip_hash 4 个八位字节而不是 3 个

Patching Nginx to ip_hash 4 octets instead of 3

我目前 运行 我的网络上有两个后端服务器,并在 Windows 上使用 Nginx 进行负载平衡。

我目前正在对系统进行负载测试,但我的所有流量都指向一台服务器。这是因为 ip_hash 算法按前 3 个八位字节对流量进行排序,即 111.222.333.XXX

这是一个问题,因为我针对该服务器的所有流量都具有相同的基地址(相同的前 3 个八位字节),因此我的流量的 none 将流向另一台服务器。有谁知道修补或更改 ip_hash 算法以过滤 4 个八位字节的方法。

谢谢

Nginx 开源版本支持 hash 指令,该指令可能与商业版本提供的粘性会话机制类似(但不完全相同):

The generic hash method: the server to which a request is sent is determined from a user-defined key which may be a text, variable, or their combination. For example, the key may be a source IP and port, or URI:

upstream backend {
    hash $request_uri consistent;

    server backend1.example.com;
    server backend2.example.com;
}

https://www.nginx.com/resources/admin-guide/load-balancer/

那么如何通过散列方法使用 IPv4 中的 4 个八位字节?让我们找到如何从嵌入式变量部分获取客户端 IP http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

$remote_addr client address

因此代码如下所示:

upstream backend {
    hash $remote_addr consistent;

    server backend1.example.com;
    server backend2.example.com;
}

更新

如果看一下 Stream 模块(TCP 代理),第一个示例显示了完全相同的方法:

upstream backend {
    hash $remote_addr consistent;

    server backend1.example.com:12345  weight=5;
    server backend2.example.com:12345;
    server unix:/tmp/backend3;
}

server {
    listen 12346;
    proxy_pass backend;
}