Nginx在局域网内实现真正的ip_hash负载均衡

遇到的问题:在局域网内搭载Nginx负载均衡的时候发现使用ip_hash实现负载均衡会发生一个奇怪的显现,所有客户端的请求访问都打在了同一个服务器上!

验证了一下, ip_hash默认使用ip的前3个ip段来计算hash,所以导致一个局域网的ip全部走到一个节点上去了。

解决办法:修改源码,让ip_hash使用ip的4个ip段来计算hash。

tar -zxvf  nginx-1.26.1.tar.gz
cd nginx-1.26.1
vi src/http/modules/ngx_http_upstream_ip_hash_module.c 

##修改源码如下,修改3个地方
第80行:ngx_http_upstream_ip_hash_pseudo_addr[4]
第124行:iphp->addrlen = 4;
第137行:iphp->addrlen = 4;



#配置安装路径,--with-http_ssl_module表示添加https的ssl模块
./configure --prefix=/home/csp/nginx2  --with-stream
 
 
#编译
make
 
#安装
make install

    upstream test {
        ip_hash;
        server 192.168.111.201:8081;
        server 192.168.111.201:8082;
    }
 
######
  server {
        listen       8081;
        server_name  localhost;

        location / {
            default_type text/html;
            return 200 'aaaaaa';
        }
    }

   server {
        listen       8082;
        server_name  localhost;

        location / {
            default_type text/html;
            return 200 'bbbbbb';
        }
    }

######

        location ^~ /test {
            proxy_pass http://test;
        }

完整测试配置如下:

worker_processes  8;

events {
    worker_connections  65535;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

   ###测试目标地址1
   server {
        listen       8081;
        server_name  localhost;
 
        location / {
            default_type text/html;
            return 200 'aaaaaa';
        }
    }
	#测试目标地址2
   server {
        listen       8082;
        server_name  localhost;

        location / {
            default_type text/html;
            return 200 'bbbbbb';
        }
    }
	###测试负载均衡
    upstream test {
        ip_hash;
        server 192.168.111.201:8081;
        server 192.168.111.201:8082;
    }

    server {
        listen       8088;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
		###测试拦截地址
        location ^~ /test {
            proxy_pass http://test;
        }
    }
}



在局域网内,另外两台服务器访问

curl http://192.168.111.201:8081
curl http://192.168.111.201:8082


curl http://192.168.111.201:8088/test

参考:

Nginx在局域网内实现真正的ip_hash负载均衡_局域网负载均衡-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值