使用Nginx作为HTTP负载均衡器

介绍

跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术。5ST码友部落

可以将nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用nginx改善Web应用程序的性能,可伸缩性和可靠性。5ST码友部落

负载均衡方法

nginx支持以下负载平衡机制(或​​方法):5ST码友部落

  • 循环-对应用服务器的请求以循环方式分发,
  • 最少连接-将下一个请求分配给活动连接数量最少的服务器,
  • ip-hash-哈希函数用于确定应为下一个请求选择哪个服务器(基于客户端的IP地址)。

 5ST码友部落

默认负载平衡配置

使用nginx进行负载平衡的最简单配置如下所示:5ST码友部落

http {
    上游myapp1 {
        服务器srv1.example.com;
        服务器srv2.example.com;
        服务器srv3.example.com;
    }

    服务器{
        听80;

        地点 / {
            proxy_pass http:// myapp1;
        }
    }
}

 5ST码友部落

在上面的示例中,同一应用程序的3个实例在srv1-srv3上运行。如果未特别配置负载平衡方法,则默认为轮询。所有请求都被 代理到服务器组myapp1,nginx应用HTTP负载平衡来分发请求。5ST码友部落

nginx中的反向代理实现包括HTTP,HTTPS,FastCGI,uwsgi,SCGI,memcached和gRPC的负载平衡。5ST码友部落

要为HTTPS(而非HTTP)配置负载平衡,只需使用“ https”作为协议。5ST码友部落

为FastCGI,uwsgi,SCGI,memcached或gRPC设置负载平衡时,请分别使用 fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pa​​ss和 grpc_pass 指令。5ST码友部落

最少连接的负载平衡

另一个负载平衡原则是连接最少的。最少连接允许在某些请求需要较长时间才能完成的情况下更公平地控制应用程序实例上的负载。5ST码友部落

使用最少连接的负载平衡,nginx将尝试不使繁忙的应用程序服务器因过多的请求而过载,而是将新的请求分配给不太繁忙的服务器。5ST码友部落

当 minimum_conn指令用作服务器组配置的一部分时,将激活nginx中的最低连接负载平衡 5ST码友部落

    上游myapp1 {
        minimum_conn;
        服务器srv1.example.com;
        服务器srv2.example.com;
        服务器srv3.example.com;
    }

 5ST码友部落

会话持久性

请注意,使用循环或最少连接的负载平衡时,每个后续客户端的请求都可能分配给其他服务器。不能保证将同一客户端始终定向到同一服务器。5ST码友部落

如果需要将客户端绑定到特定的应用程序服务器(换句话说,就始终尝试选择特定服务器而言,使客户端的会话“粘性”或“持久”),则可以使用ip-hash负载平衡机制用过的。5ST码友部落

使用ip-hash,客户端的IP地址用作哈希密钥,以确定应为客户端的请求选择服务器组中的哪个服务器。此方法可确保将来自同一客户端的请求始终定向到同一服务器,除非该服务器不可用。5ST码友部落

要配置ip-hash负载平衡,只需将ip_hash 指令添加 到服务器(上游)组配置中:5ST码友部落

上游myapp1 {
    ip_hash;
    服务器srv1.example.com;
    服务器srv2.example.com;
    服务器srv3.example.com;
}

 5ST码友部落

加权负载均衡

还可以通过使用服务器权重来进一步影响nginx负载平衡算法。5ST码友部落

在上面的示例中,未配置服务器权重,这意味着所有指定的服务器都被视为对特定负载平衡方法具有同等资格。5ST码友部落

特别是对于循环而言,这还意味着在服务器之间的请求分配大致相等-前提是存在足够的请求,并且以统一的方式处理请求并足够快地完成请求。5ST码友部落

 为服务器指定权重参数时, 权重将作为负载均衡决策的一部分。5ST码友部落

    上游myapp1 {
        服务器srv1.example.com weight = 3;
        服务器srv2.example.com;
        服务器srv3.example.com;
    }

 5ST码友部落

使用此配置,每5个新请求将按以下方式分布在应用程序实例中:3个请求将定向到srv1,一个请求将定向到srv2,另一个将定向到srv3。5ST码友部落

类似地,在最新版本的nginx中,可以使用权重最少的连接和ip-hash负载平衡。5ST码友部落

健康检查

nginx中的反向代理实现包括带内(或被动)服务器运行状况检查。如果来自特定服务器的响应失败并出现错误,nginx会将其标记为失败服务器,并尝试避免为一段时间的后续入站请求选择该服务器。5ST码友部落

该 max_fails 指令设置连续不成功的尝试与中应该发生的服务器进行通信的数量 fail_timeout。默认情况下, max_fails 设置为1。当它设置为0时,将禁用此服务器的运行状况检查。该 fail_timeout 参数还定义如何,只要服务器失败将被标记。 服务器故障后的 fail_timeout间隔后,nginx将开始使用实时客户端的请求来正常探测服务器。如果探测成功,则将服务器标记为活动服务器。5ST码友部落

进一步阅读

另外,在nginx中还有更多控制服务器负载平衡的指令和参数,例如 proxy_next_upstream, backup, down和 keepalive。有关更多信息,请查看我们的 参考文档。5ST码友部落

最后但并非最不重要的一点是, 作为我们的付费NGINX Plus订阅的一部分,可以提供 应用程序负载平衡, 应用程序运行状况检查, 活动监视和 服务器组 的即时重新配置。5ST码友部落