上一篇我们介绍了nginx的反向代理,本文主要介绍在反向代理基础上的负载均衡。
背景:
随着服务器访问量的不断增大,导致单台机器服务延时不断增大,对服务器的压力也越来越大,为了解决这一问题,我们可以部署多个服务节点,然后使用某种算法是的访问分散到各个节点,大大降低的服务器的压力。
实践:
本文主要介绍nginx的负载均衡及各种算法,不会对代理配置有过多的讲解,不熟悉的可以阅读上一篇文章Nginx反向代理配置解释。
本文架构图如下,一台nginx代理服务,被代理服务部署了两个节点(这里是在一个机器上部署的两个服务,端口不同)。
下面我们开始修改nginx的配置文件,如下
http {
upstream back {
server 192.168.121.139:8080;
server 192.168.121.139:8081;
}
server {
listen 8088;
server_name localhost,192.168.121.140;
location /back {
proxy_pass http://back/back;
}
}
}
上面的配置就是在反向代理的基础上,修改了proxy_pass的ip和端口为别名代替,该别名所表示的真实ip是和upstream配置一一对应的。我们可以看到上述配置的updatream back有两个服务地址。当我们访问http://192.168.121.140:8088/back/app/getData时,nginx首先匹配到location的back,然后根据proxy_pass的back到upstream搜索服务地址。但是upstream存在多个服务时,nginx默认采用轮训的负载算法,即访问服务器顺序为ABABAB…。
下面我们介绍下nginx的负载均衡算法:
(1)轮训,默认算法,访问顺序是ABABAB…
upstream back {
server 192.168.121.139:8080;
server 192.168.121.139:8081;
}
(2)加权轮训,我们可以设置某个服务的权重,这样 nginx就会访问该服务的次数更多.
upstream back {
server 192.168.121.139:8080 weight=1;
server 192.168.121.139:8081 weight=4;
}
(3)热备,即当某个服务挂了后,有后备服务接着提供服务。当A服务没有挂,所有的请求都是访问A服务,不会请求到B服务。当A服务挂了后,所有的请求都是到B服务。
upstream back {
server 192.168.121.139:8080 ;
server 192.168.121.139:8081 backup;
}
(4)ip_hash,nginx将相同客户端ip的请求一直访问到相同的服务。如果第一次访问到A服务,那么以后该客户端都是访问到A服务。
upstream back {
ip_hash;
server 192.168.121.139:8080 ;
server 192.168.121.139:8081;
}
(5)下线,即不参与负载均衡。配置down之后,等价于A服务挂了,所有的请求都是到B服务。
upstream back {
server 192.168.121.139:8080 down ;
server 192.168.121.139:8081 ;
}
针对上面的配置,如果A服务配置了down,B服务配置了backup,那么所有的请求是到B服务的。