遇到的问题:在局域网内搭载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
参考: