使用 nginx 作为 HTTP 负载均衡器

负载均衡方法
默认负载均衡配置
最少连接的负载均衡
会话持久性
加权负载均衡
运行状况检查
延伸阅读

介绍

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

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

负载均衡方法

支持以下负载均衡机制(或方法) nginx 的 Nginx 中

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

默认负载均衡配置

使用 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 上运行。 当负载均衡方式未专门配置时, 它默认为 round-robin。 所有请求都代理到服务器组 myapp1,nginx 应用 HTTP 负载 balancing 来分发请求。

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

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

当为FastCGI、uwsgi、SCGI、memcached或gRPC设置负载均衡时,请分别使用fastcgi_passuwsgi_passscgi_passmemcached_passgrpc_pass指令。

连接最少的负载均衡

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

使用最少连接的负载均衡,nginx 将尝试不使 繁忙的应用程序服务器,请求过多,分发新的 请求改为路由到不太繁忙的服务器。

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

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

会话保持

请注意,使用循环或最小连接负载 平衡,则每个后续客户端的请求都可能 分发到其他服务器。 不能保证同一客户端将始终 定向到同一服务器。

如果需要将客户端绑定到特定的应用程序服务器 — 换句话说,使客户端的会话 “sticky” 或 “persistent” 在 始终尝试选择特定服务器的术语 — IP 哈希负载 可以使用平衡机构。

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

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

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

加权负载均衡

甚至可以影响 nginx 负载均衡算法 进一步使用 Server Weights。

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

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

为服务器指定 weight 参数时,权重将作为部分计算 的负载均衡决策。

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

使用此配置,每 5 个新请求将分布在 应用程序实例如下:将定向 3 个请求 对于 SRv1,一个请求将发送到 SRv2,另一个请求将发送到 SRv3。

同样,也可以使用连通最少且 ip-hash 负载均衡。

运行状况检查

nginx 中的反向代理实现包括带内(或被动) 服务器运行状况检查。 如果来自特定服务器的响应失败并显示错误, nginx 会将此服务器标记为失败,并尝试 暂时避免为后续入站请求选择此服务器。

max_fails 指令将连续失败尝试的次数设置为 与服务器通信,这应该在 fail_timeout 期间进行。 默认情况下,max_fails 设置为 1。 当它设置为 0 时,将禁用此服务器的运行状况检查。 fail_timeout 参数还定义服务器将被标记为失败的时间。 在服务器故障后的 fail_timeout 间隔后,nginx 将开始正常地 使用 Live Client 的请求探测 Server。 如果探测成功,则服务器将标记为实时服务器。

延伸阅读

此外,还有更多控制 server 的指令和参数 nginx 中的负载均衡,例如 proxy_next_upstreambackupdownkeepalive。 有关更多信息,请查看我们的参考文档

最后但同样重要的 应用程序负载均衡 / 应用程序运行状况检查, 活动监控和 可以对服务器组进行动态重新配置 作为我们付费 NGINX Plus 订阅的一部分。