如下图所示我把此项目放到两个端口,并通过nginx反向代理,因为项目中用到了spring Securicty框架并使用session判断登录用户,而且Nginx是轮询方式,点击登录后nginx会请求另一个端口,session不共享导致一点登录就会显示没有权限。
解决办法:
如下图所示,在upstream下添加一个 ip_hash; 即可
ip_hash 就是同一个ip再次访问会访问同个服务器的同端口
但是ip_hash也是有弊端的,ip_hash是使用ip地址的前三段进行hash运算,根据结果的不同,重定向到不同的服务器上。在一定区域内我们的电脑都在一个网,所以算出的hashcode都是一样的,所以没有负载分担的效果。
其实还有更好的解决办法,通过Session+redis方法或者通过修改nginx源文件(nginx是用c写的)重新编译安装就能达到根据ip地址不同而分布到不同服务器上。
解决方案
修改nginx的源代码后,重新编译安装,就能实现根据ip地址来区分重定向的目的。
- 找到nginx压缩包,进行解压
- 进入nginx目录下的src/http/modules/ngx_http_upstream_ip_hash_module.c文件;
- 如图所示,找到180多行,根据循环里的i值引用处,将3次改成4次(总共三处)。
- 重新编译后,果然生效了,就可以根据ip的不同进行负载分担了。