架构

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

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

Nginx负载均衡

NGINX作为一个高性能的反向代理服务器,可以通过负载均衡功能,将客户端的请求分发到多个后端服务器上。

这里的核心点:是如何把客户端的访问,更好的方式分配到后端服务器,这机会涉及到负载均衡配置策略,下面我重点详解4大常用的配置

1.轮询


轮询是一种按照“顺序”,依次分配请求的负载均衡策略,如下图所示:

原理:

  • 首先,客户端发起一个请求到NGINX;
  • 其次,NGINX按照定义的服务器列表顺序,将请求发送给下一个服务器;
  • 然后,下一个请求将发送到列表中的下一个服务器,以此类推,直到所有服务器都接收到了请求。
  • 最后,当再次收到新请求时,NGINX重新从列表的第一个服务器开始。

举一个例子:

假设我们有三台后端服务器,分别是 192.168.1.10、192.168.1.11 和 192.168.1.12。

我们希望NGINX,将所有的请求按照轮询的方式分发到这三台服务器上,配置如下:

upstream backend {
  server 192.168.1.10;
  server 192.168.1.11;
  server 192.168.1.12;
}

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;
    }
}

配置说明:

backend :是我们给这组服务器起的名字;

192.168.1.10、192.168.1.11 、 192.168.1.12, :分别列出了三台后端服务器的地址;

proxy_pass http://backend; :将所有请求代理,到定义的 backend 组中的服务器。

应用:

这种轮询策略,适用于后端服务器性能相似,能够平均处理请求的场景,适用于大多数基本的Web应用和服务。

2.加权


加权(Weighted)负载均衡策略,是为每个后端服务器都分配了一个权重值,NGINX根据这些权重值,决定将请求分发到哪个服务器上。

具体来说:

  • 每台后端服务器都被赋予一个权重值,通常通过配置文件进行设置;
  • NGINX在处理请求时,按照服务器的权重比例来分配请求;
  • 权重越高的服务器,会接收到更多的请求。

配置如下:

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=2;
    server backend3.example.com weight=1;
}

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;
    }
}
  • server backend1.example.com weight=3;:定义了一个权重为3的 backend1.example.com;
  • server backend2.example.com weight=2;:定义了一个权重为2的 backend2.example.com;
  • server backend3.example.com weight=1;:定义了一个权重为1的 backend3.example.com。

这意味着backend1.example.com会接收到的请求比backend2.example.com多,而backend3.example.com接收到的请求最少。

应用场景:

可以用来平衡服务器的负载,确保性能较高的服务器承担更多的请求,从而提高整体系统的效率和可用性。

3.IP 哈希(IP Hash)


IP哈希(IP Hash),是根据客户端的IP地址,将请求分发到后端服务器。

如下图所示:

具体来说:

  • 首先,客户端发送请求到NGINX服务器,NGINX从客户端的IP地址,计算出一个哈希值;
  • 其次,根据这个哈希值,NGINX选择一台后端服务器来处理请求;
  • 最后,同一个客户端的后续请求,会根据相同的哈希值选择相同的后端服务器,以保持会话的一致性。

配置如下:

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;

        # 透传客户端真实IP地址
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

这种策略适用于:

需要确保与客户端相关联的会话数据、或状态信息,在同一台服务器上处理的情况,例如:网站的登录状态、或购物车信息等。

4.最少连接


最少连接(Least Connections),是将请求分发到当前连接数最少的后端服务器。

如下所示:

最少连接负载均衡策略,的工作原理如下:

  • 当有新的请求到达NGINX时,NGINX会检查当前所有后端服务器的连接数;
  • NGINX选择当前连接数最少的那台服务器,来处理新的请求;
  • 这样可以避免出现某些服务器负载过高,而其他服务器负载较轻的情况,提高整体的负载均衡效果。

配置如下:

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;
        
        # 透传客户端真实IP地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
    }
}

最少连接,适用于动态负载均衡的场景,比如:根据实时连接数动态调整请求分发,确保每个服务器的负载尽可能平衡。