Nginx负载均衡

来源:互联网 发布:js 页面加载后 合计 编辑:程序博客网 时间:2024/05/17 09:14

一、Nginx的反向代理

在没有反向代理时,当我有多个ip拥有相同的服务时,访问相同的服务我需要明确指出我要访问的ip以及端口。

例如:我分别在192.168.0.1:8001、192.168.0.1:8002、192.168.0.2:8001、192.168.0.2:8002上部署了/login

当我需要调用login服务时,我需要明确写明 http://192.168.0.1:8001/login、http://192.168.0.1:8002/login、http://192.168.0.2:8001/login、http://192.168.0.2:8002/login

这样的方式对于用户访问login服务会十分不友好。

于是,nginx的反向代理就好像一个用户与目标之间的代理,当用户访问目标地址时,输入nginx的ip以及端口(默认80)/login后,nginx则会指向其中的一台服务器的login服务


二、nginx的负载均衡

负载均衡是在反向代理的基础上加了一些策略,通俗来讲就是当我的nginx可以指向多个服务器的时候,nginx该指向哪个服务器。

负载均衡的目的在于解决某个服务器压力过大,对用户访问所带来的负载进行分流,将请求转发给一个相对空闲的服务器上。

三、nginx的分配策略

(1)轮询方式(默认):每个请求按照时间顺序逐个分配给服务器,当某一服务器挂了会从nginx的分配列表里自动剔除

(2)指定权重:在nginx.conf中配置每个server的weight,weight值越大,分配到该server的可能性越大

(3)ip绑定:每个请求按照ip的hash结果进行分配,ip所访问的服务器是固定。(注:这种方式可以解决用户访问服务器session丢失问题)

四、缺陷

场景(非ip绑定策略):用户A通过Nginx访问了1号服务器,所有的session都存入了1号服务器,当用户A再次通过Nginx访问时,Nginx可能会将用户A分配给2号服务器上,这时用户A在2号服务器上没有之前访问的session,导致session丢失。

场景(ip绑定策略):由于根据ip进行分配,当某一个用户量集中于某一类ip时,会导致某个服务器负载过重。

五、session丢失解决方案

(1)session复制:将新增的session复制到其他各个服务器上

(2)会话保持

(3)session共享:将服务器获得的session存入redis缓存数据库中,各服务器可通过redis数据库获取session


实战内容详见:实例——session共享解决方案(Docker+Nginx+Spring Boot+Spring Session + Redis)