使用 nginx 作为 HTTP 负载均衡器

Load balancing methods
Default load balancing configuration
Least connected load balancing
Session persistence
Weighted load balancing
Health checks
Further reading

介绍

跨多个应用程序实例的负载平衡是优化资源利用率、最大化吞吐量、减少延迟和确保容错配置的常用技术。

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

负载均衡方法

nginx 支持以下负载均衡机制(或​​方法):

默认负载均衡配置

使用 nginx 进行负载平衡的最简单配置可能如下所示:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

在上面的示例中,同一应用程序的 3 个实例在 srv1-srv3 上运行。当没有特别配置负载均衡方法时,默认为轮询。所有请求都 代理到服务器组myapp1,nginx应用HTTP负载均衡来分发请求。

nginx 中的反向代理实现包括 HTTP、HTTPS、FastCGI、uwsgi、SCGI、memcached 和 gRPC 的负载平衡。

要为 HTTPS 而不是 HTTP 配置负载平衡,只需使用“https”作为协议。

为 FastCGI、uwsgi、SCGI、memcached 或 gRPC 设置负载平衡时,分别使用 fastcgi_passuwsgi_passscgi_passmemcached_pa​​ssgrpc_pass 指令。

最少连接负载平衡

另一个负载平衡规则是最少连接。当某些请求需要更长的时间才能完成时,最少连接允许更公平地控制应用程序实例上的负载。

通过最少连接的负载平衡,nginx 会尽量不让繁忙的应用服务器因过多的请求而超载,而是将新请求分发到不太繁忙的服务器。

当least_conn指令用作服务器组配置的一部分 时,nginx中的最少连接负载平衡被激活 :

    upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

会话保持

请注意,通过循环或最少连接负载平衡,每个后续客户端的请求可能会分发到不同的服务器。无法保证同一客户端始终定向到同一服务器。

如果需要将客户端绑定到特定的应用程序服务器 - 换句话说,使客户端的会话“粘性”或“持久”,总是尝试选择特定的服务器 - ip-hash 负载平衡机制可以是用过的。

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

要配置 ip-hash 负载平衡,只需将 ip_hash 指令添加到服务器(上游)组配置中即可:

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

加权负载均衡

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

在上面的示例中,未配置服务器权重,这意味着所有指定的服务器都被视为同等适合特定负载平衡方法。

特别是对于循环法,它还意味着在服务器之间或多或少平等地分配请求——前提是有足够的请求,并且请求以统一的方式处理并足够快地完成。

当 为服务器指定 权重参数时,权重将被视为负载平衡决策的一部分。

    upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
    }

使用此配置,每 5 个新请求将在应用程序实例之间分布,如下所示:3 个请求将定向到 srv1,一个请求将定向到 srv2,另一个请求将定向到 srv3。

在最新版本的 nginx 中,同样可以使用具有最少连接的权重和 ip-hash 负载平衡。

健康检查

nginx 中的反向代理实现包括带内(或被动)服务器健康检查。如果某个特定服务器的响应因错误而失败,nginx 会将该服务器标记为失败,并在一段时间内尝试避免选择该服务器来处理后续的入站请求。

max_fails 指令设置在fail_timeout期间连续尝试与服务器通信失败 次数 。默认情况下, max_fails 设置为 1。设置为 0 时,将禁用该服务器的运行状况检查。fail_timeout 参数还定义服务器将被标记为失败的时间长度服务器故障后经过fail_timeout间隔后 ,nginx将开始使用实时客户端的请求优雅地探测服务器。如果探测成功,服务器将被标记为活动服务器。

进一步阅读

此外,nginx 中还有更多控制服务器负载平衡的指令和参数,例如 proxy_next_upstreambackupdownkeepalive。欲了解更多信息,请查看我们的 参考文档

最后但并非最不重要的一点是, 应用程序负载平衡 应用程序运行状况检查 活动监控和 服务器组的 动态重新配置都是我们付费 NGINX Plus 订阅的一部分。

以下文章更详细地描述了 NGINX Plus 的负载平衡: