使用nginx作为HTTP负载均衡

   介绍

       跨多个应用程序实例进行负载均衡是一种常用的技术,它被用于优化资源的利用率, 最大化吞吐量,减少延迟并确保容错配置。

       可以使用 nginx 作为一个非常有效的 HTTP 负载均衡器,将流量分配给多台应用服务器,并通过 nginx 提高 Web 应用程序的性能,可扩展性和高可靠性。

负载均衡方法

       在 nginx 中支持以下负载平衡机制(或方法):

  •        round-robin (轮询)—  Nginx 以轮询的方式对收到的请求进行分发

  •        least-connected(最少连接) — Nginx 会把下一个连接分配给具有最小活动连接的服务器

  •        ip-hash  (IP 绑定)— 使用 hash 函数去决定下一个连接应该分配给哪一台服务器(基于客户端的 IP 地址)

 

默认负载平衡配置

使用 nginx 做一个最简单的负载均衡配置可能如下所示:

 

01 http {//协议
02      upstream myapp1 {//服务器群
03      server srv1.example.com;
04      server srv2.example.com;
05      server srv3.example.com;
06                     }
07 server {
08      listen 80;//监听端口
09      location / {
10      proxy_pass http://myapp1;//对服务器群进行负载均衡
11                 }
12        }
13      }

在上面的例子中,服务器 srv1-srv3 上运行了三个具有相同应用程序的实例. 当负载均衡方法没有进行特别的配         置
的话,默认为轮询。这时所有的请求都被 nginx 代理到服务器群组 myapp1 中,同时 nginx 使用 HTTP 负载均衡来对
请求进行分发。

nginx 的反向代理可以实现包括 HTTP,HTTPS,FastCGI,uwsgi,SCGI 和 memcached 在内的负载均衡

如果想配置 HTTPS 协议的负载均衡而不是 HTTP 协议的负载均衡,只需要使用”https”作为协议即可

当为 FastCGI,uwsgi,SCGI 或 memcached 配置负载均衡时,分别使用 fastcgi_pass, uwsgi_passscgi_pass               和 memcached_pass 指令。

   最小连接负载均衡

另一种负载均衡机制是基于最小连接的。在一些请求需要更长的时间才能完成的情况下,最小连接机制可以更加公正的控制应用程序实例的负载均衡。

使用最小连接的负载均衡,nginx 将尽量不会把过多的请求来使忙碌的应用程序服务器超负荷运行,而是将新的请求分发到不太忙的服务器。

当使用 least_conn指令作为服务器组配置的一部分时,将激活 nginx 的最小连接负载均衡:

 

1 upstream myapp1 {//配置服务器群组
2                 least_conn;//最小连接机制命令
3                 server srv1.example.com;
4                 server srv2.example.com;
5                 server srv3.example.com;
6 }

会话持久性

请注意,通过轮询或最小连接的负载均衡,每个后续客户端的请求都可能会被分配到不同的服务器。在这里并不能保证同一个客户端始终指向同一个服务器。

如果需要将客户端绑定到特定的应用服务器–换句话说,使客户端与 nginx 的会话进行”粘滞”或者” 持久化”,就总是尝试去选择一个特定的服务器而言,ip-hash 负载均衡机制在这里可以被使用。

使用 ip-hash 机制,客户端的 ip 地址被用作 hash 表里的键,nginx 根据键来确定应该为客户端请求选择服务器群组里的哪一个服务器。此方法会确保从同一个客户端发来的请求会始终定向到同一台服务器,除非当这台服务器出现不可用的时候。

       要配置 ip-hash 负载均衡,只需将 ip-hash 指令配置到服务器(upstream)组的配置中。

 

1 upstream myapp1 {
2             ip_hash;
3             server srv1.example.com;
4             server srv2.example.com;
5             server srv3.example.com;
6 }

加权负载均衡

       还可以通过使用服务器权重进一步影响 nginx 负载均衡算法。

在上面的示例中,服务器权重没有配置,这就意味着所有指定的服务器被看做对特定负载均衡方法具有同等资格。

       特别是轮询使用的时候,这也意味着只要有足够多的请求,并且以统一的方式处理请求并且完成速度足够快,这时 通过服务器进行的请求分配或多或少概率是相等的。

       当为服务器的配置指定权重参数时,权重将会作为负载均衡决策的一部分进行计算。

1 upstream myapp1 {
2             server srv1.example.com weight=3;// 为此服务器增加权重
3             server srv2.example.com;
4             server srv3.example.com;
5 }

通过这种配置,每五个新的请求将会通过应用实例进行分发,如下所示:3 个请求将会被分发给 srv1,1 个请求将会分发给 srv2,另一个请求分发给 srv3。

在最近的 nginx 版本中,同样可以在最小连接和 ip-hash 机制中使用负载均衡的权重。

健康检查

         nginx 中的反向代理实现包括内带(或被动)的服务器运行状况检查。如果特定服务器的响应失败并出现错误, nginx 则会把这台服务器标记为失效,并会尝试在一段时间内避免后续入站的请求选择此服务器。

该 max_fails 指令设置在fail_timeout期间与 nginx 服务器连续的不成功的尝试连接的通信数量。默认情况下,

max_fails设置为 1,当设置为 0 时,该服务器的运行状况检查会被禁用。fail_timeout 参数还定义了服务器将被标记为失效的时间。在 服务器发生故障后的 fail_timeout间隔之后,

nginx 将开始以实时客户端的请求优雅地探测服务器。如果探测成功,则将服务器标记为活动的。