将 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;
}
我目前 运行 我的网络上有两个后端服务器,并在 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;
}