如何配置NGINX负载平衡

时间:2020-02-23 14:41:05  来源:igfitidea点击:

负载平衡是将流量分配到应用程序的多个实例的过程。
除确保已部署应用程序的容错能力外,它通常用于提高资源利用率,最大化吞吐量和减少延迟。

可以在OSI参考模型的传输层(第4层)和应用程序层(第7层)中实现负载平衡。
传输层的负载平衡由专用硬件实现,而应用程序层的负载平衡则由NGINX或者HAPROXY等专用软件实现。

NGINX负载平衡

Nginx负载平衡

NGINX是一种现代、开源、高性能的web服务器。除了非常有效地服务静态和动态内容外,NGINX还可以配置为充当负载平衡器,它可以处理大量传入连接,并将它们分发到单独的上游服务器进行处理,从而实现部署应用程序的容错性和更好的性能。

本教程将介绍如何在Ubuntu 18.04中将NGINX配置为负载均衡器。

前提条件

  • 您已经按照此处的教程安装了NGINX。

将NGINX配置为负载均衡器

负载平衡配置指示NGINX如何处理传入的流量,方法是将传入的流量分配给最好位于专用网络中的服务器链。
这些服务器链称为后端或者上游服务器。

要将NGINX配置为负载均衡器,第一步是在配置文件中包括上游或者后端服务器,以实现负载均衡方案。
NGINX的上游模块通过定义这些上游服务器来准确地做到这一点,如下所示:

upstream backend {
 server 10.5.6.21; 
 server 10.5.6.22;
 server 10.5.6.23;
}

上面的上游指令包括三个具有专用地址的服务器。
您也可以使用其域名定义上游服务器,但是,从性能和安全性的角度来看,最好通过其私有地址来引用它们。

一旦定义了上游服务器,您只需使用proxy_pass指令在所需的位置块中引用它们,即可对流量进行负载平衡。

server {
       ...
       server_name SUBDOMAIN.theitroad.com
       ...
       location/{
                    proxy_pass  https://backend;
       }
}

在上面的服务器块中,只要域" SUBDOMAIN.theitroad.com"的流量与root(/)位置块匹配,NGINX就会将请求一一转发到每个上游服务器。
选择上游服务器的默认方法是轮询,尽管很少有其他方法可以负载均衡流量,我们将在下一节中讨论。

现在让我们利用上面的上游和服务器块为域创建负载均衡器。
为此,请导航至NGINX服务器块配置目录,并使用文本编辑器创建配置文件。

# cd /etc/nginx/sites-available/
# vi load_balancer.conf

upstream backend {
 server 10.0.2.144;
 server 10.0.2.42;
 server 10.0.2.44;
 # add more servers here
}

server {
         listen 80; 
         server_name SUBDOMAIN.theitroad.com;
         location/{
                      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_pass https://backend;
         }
}

每当流量到达域" SUBDOMAIN.theitroad.com"的端口80时,NGINX都会以循环方式将请求转发到上游部分中定义的每个上游服务器,从而对流量进行负载平衡。
确保proxy_pass指令的主机名必须与上游模块名匹配。

现在检查NGINX配置文件中是否有语法错误,并启用服务器块。
完成后,重新加载NGINX以应用新设置。

# nginx -t
# cd /etc/nginx/sites-enabled/
# ln -s ../sites-available/load_balancer.conf .
# systemctl reload nginx

要测试负载均衡器,请对其进行CURL查询。
您会发现负载均衡器正在以循环方式将请求逐个转发到每个上游服务器,从而对流量进行负载均衡。

CURL查询到负载均衡器

NGINX负载均衡方法

1.轮循

轮询方案将流量平均分配给上游服务器,并且是默认方案(如果您未指定)。
使用此方案,根据您将上游服务器放入配置文件中的顺序依次选择每个上游服务器。
这意味着客户端请求由列出的任何上游服务器提供服务。
我们之前配置的负载均衡器使用此方案选择上游服务器。

2.最少连接

通过这种方案,负载均衡器将请求分配给活动连接数最少的上游服务器。
在与上游服务器的活动连接需要一些时间才能完成或者上游服务器因活动连接而过载的情况下,此方案很有用。
要配置最少连接的负载平衡,请在上游模块内添加" least_conn"指令作为第一行,如下所示。

upstream wordpress_apps {
 least_conn;
 server 10.0.2.144;
 server 10.0.2.42;
 server 10.0.2.44;
 # add more servers here
}

3. IP哈希

该方案通过基于客户端的IP地址作为密钥生成哈希值来选择上游服务器。
这允许将来自客户端的请求转发到同一上游服务器,前提是该请求可用并且客户端IP地址未更改。
要配置IP哈希负载平衡方法,请在上游模块的开头添加" ip_hash"指令,如下所示。

upstream wordpress_apps {
 ip_hash;
 server 10.0.2.144;
 server 10.0.2.42;
 server 10.0.2.44;
 # add more servers here
}

4.加权

加权方法允许进一步微调NGINX内的负载平衡。
通过这种方案,最经常选择权重最高的上游服务器。
在上游服务器的资源不相等并且偏向拥有更好可用资源的服务器的情况下,此方案很有用。
要配置加权负载平衡,请在上游部分的URL参数后面添加weight指令,如下所示。

upstream wordpress_apps {
 server 10.0.2.144 weight=2; 
 server 10.0.2.42 weight=3;
 server 10.0.2.44 weight=5;
 # add more servers here
}

通过上述配置,每10个请求中,有2个请求被转发到第一服务器,有3个请求被转发到第二服务器,并且有5个请求被转发到第三服务器。