Nginx负载均衡配置详解(图文全面总结)

文摘   2024-07-31 20:00   四川  

关注mikechen的架构笔记十余年BAT架构经验倾囊相授

大家好,我是mikechen。



Nginx是一款高性能HTTP、和反向代理服务器,是大型架构必备使用的,下面详解4大Nginx负载均衡配置@mikechen

最新mikechen原创超30万字《阿里架构师进阶专题合集》和《最全大厂面试题及答案总结》,请关注本公众号【mikechen的架构笔记】,后台回复:资料,即可领取。


Nginx负载均衡

Nginx 是一个高性能的 HTTP 、和反向代理服务器,它也可以作为负载均衡器。

如下所示:

可以将流量分配到多个后端服务器,这种方式,可以提高系统的可用性、和扩展性、以及性能。

但是,如果你要负载到别的服务器,就会涉及到负载均衡配置算法、和配置。

比如:常见的有:轮询(round-robin)、最少连接(leas-connections)、IP哈希(IP-hash)、随机(random-ip).......等,下面我分别详解@mikechen

Nginx负载均衡配置

1.轮询

Nginx默认的负载均衡策略是:轮询,每个请求依次分配给不同的后端服务器,这种轮询策略,适用于后端服务器性能相似。

如下图所示:

轮询是一种简单的负载均衡算法,将请求按照固定顺序,依次分发到每个服务器。

每个服务器依次接收请求,直到所有服务器都接收到一个请求,然后循环重新开始。

轮询策略无需额外配置参数,只需定义上游服务器组即可,如下所示:

http {    upstream mikechen{        server backend1.mikechen.cc;        server backend2.mikechen.cc;        server backend3.mikechen.cc;    }
server { listen 80;
location / { proxy_pass http://mikechen; } }}

upstream mikechen{...}:定义一个上游服务器组,命名为 mikechen。

  • server backend1.mikechen.cc;:指定第一个后端服务器;

  • server backend2.mikechen.cc;:指定第二个后端服务器;

  • server backend3.mikechen.cc;:指定第三个后端服务器;

server {...}:定义一个虚拟主机,参数如下:

  • listen 80;:监听端口 80;

  • location / {...}:处理根路径 / 的请求,proxy_pass http://backend,将请求转发到上游服务器组 mikechen。


2.加权

Nginx 的加权负载均衡(weighted load balancing),允许为不同的后端服务器设置不同的权重,以便将更多的请求分配给性能更高、或资源更多的服务器。

权重越高,服务器被分配到的请求就越多,如下所示:

    server backend1.mikechen.cc weight=5;
server backend2.mikechen.cc weight=3;
server backend3.mikechen.cc weight=1;

参数说明:

  • weight=3:设置 backend1 的权重为 5;

  • weight=1:设置 backend2 的权重为 3;

  • weight=2:设置 backend3 的权重为 1;

在上面的示例中,请求将按照如下比例分配:

  • backend1.mikechen.cc:将处理 5/(5+3+1) ≈ 55.56% 的请求;

  • backend2.mikechen.cc:将处理 3/(5+3+1) ≈ 33.33% 的请求;

  • backend3.mikechen.cc:将处理 1/(5+3+1) ≈ 11.11% 的请求;


3.IP 哈希(IP Hash)

IP Hash 是一种负载均衡策略,通过对客户端 IP 地址,进行哈希计算来决定请求应该转发到哪个后端服务器。

如下图所示:

这样,来自同一 IP 地址的请求会被发送到相同的后端服务器,除非后端服务器发生变化。

在 Nginx 中,IP Hash 通过在 upstream 块中,使用 ip_hash 指令来配置。

如下所示:

http {    upstream backend {        ip_hash;        server backend1.example.com;        server backend2.example.com;        server backend3.example.com;    }
server { listen 80; server_name example.com;
location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }}
  • ip_hash;:启用 IP 哈希负载均衡;

  • 相同的客户端 IP 地址将,总是被分配到相同的服务器,直到服务器列表发生变化。

适用于需要保持用户会话状态的应用,如购物车、用户登录.......等。


4.最少连接

最少连接策略,根据每个后端服务器当前处理的连接数来分配新请求,请求会被分配到连接数最少的服务器上。

如下所示:

配置如下:

http {    upstream backend {        least_conn;        server backend1.example.com;        server backend2.example.com;        server backend3.example.com;    }
server { listen 80; server_name example.com;
location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }}

least_conn;:启用最少连接负载均衡;

请求将被分配到当前连接数最少的后端服务器,这种策略可以减少服务器之间的负载不均,特别是在请求处理时间差异较大的情况下。

这种配置,适用于请求处理时间不一致的应用,比如:有些请求处理时间较长的场景。

以及,最少连接策略能够,有效地将请求分配到负载较低的服务器,从而提升整体性能、和响应速度。

以上


最后送大家一个福利:


送大家一份我原创超30万字的阿里架构师进阶专题合集非常的全面


以及给大家整理了一份非常全面的Java面试题及答案合集,包含:Java、多线程、JVM、Spring、MySQL、Redis、Dubbo、中间件…等最全大厂必考题及答案详解


需要以上架构专题&面试答案的同学,加我微信即可领取!


添加时备注:资料


mikechen的架构笔记
十余年BAT架构经验倾囊相授!
 最新文章