nginx负载均衡基于ip_hash的session粘帖

红薯 发布于 2011/07/26 15:51
阅读 31K+
收藏 30

nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个。

nginx的upstream目前支持的5种方式的分配


1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}

2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}

5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

在需要使用负载均衡的server中增加

proxy_pass http://backserver/;
upstream backserver{

ip_hash;
server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}

max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
 

fail_timeout:max_fails次失败后,暂停的时间

文章转自:http://www.niaox.cn/post/nginx_ip_hash_session.html

加载中
0
ilxlf
ilxlf
这个和F5有什么区别吗?
0
华宰
华宰

引用来自“ilxlf”的答案

这个和F5有什么区别吗?
功能是差不多,价格差得离谱了,一个开源免费,一个昂贵的价格
0
dfar2008
dfar2008
我在使用ip_hash的方式,遇到一个问题,如果nginx服务器被局域网内很多用户使用,由于他们的外网ip都是一样的,由于使用ip_hash的方式,局域网的所有用户访问的就是同一个服务器,没有启动负载均衡的服务器,这个有什么好的方法没有?
0
狼尹天下
狼尹天下

引用来自“dfar2008”的评论

我在使用ip_hash的方式,遇到一个问题,如果nginx服务器被局域网内很多用户使用,由于他们的外网ip都是一样的,由于使用ip_hash的方式,局域网的所有用户访问的就是同一个服务器,没有启动负载均衡的服务器,这个有什么好的方法没有?
同样遇到这个问题了,解决了吗?
0
dfar2008
dfar2008

引用来自“dfar2008”的评论

我在使用ip_hash的方式,遇到一个问题,如果nginx服务器被局域网内很多用户使用,由于他们的外网ip都是一样的,由于使用ip_hash的方式,局域网的所有用户访问的就是同一个服务器,没有启动负载均衡的服务器,这个有什么好的方法没有?

引用来自“狼尹天下”的评论

同样遇到这个问题了,解决了吗?
后来采用了阿里云的负载均衡服务。
0
zhangqunshi
zhangqunshi
改造一下ip_hash,增加对session的判断:如果没有session就按ip_hash, 如果有session,就按ip+session hash
0
子非三文鱼
子非三文鱼

主要代码请看这里:
for( ;; ) {
for(i = 0; i < 3; i++) {
hash = (hash * 113+ iphp->addr[i]) % 6271;  
 
1、for循环 i 取 012三个值,而ip的点分十进制表示方法将ip分成四段(如:192.168.1.1),但是这里循环时只将ip的前三个端作为参数加入hash函数。这样做的目的是保证ip地址前三位相同的用户经过hash计算将分配到相同的后端server。
作者的这个考虑是极为可取的,因此ip地址前三位相同通常意味着来着同一个局域网或者相邻区域,使用相同的后端服务让nginx在一定程度上更具有一致性。
 
通过上述解释,已经基本判断出问题所在了。。
主要原因就是,公司局域网用的192.168.1.0/24 C类地址,这样Nginx在ip_hash(for循环后三个参数统一计入hash值)的时候,就将该类所有ip都转发到一个后端了。

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2014-02/96868.htm

返回顶部
顶部