使用 nginx 作为 HTTP 负载均衡器

负载均衡方法
默认负载均衡配置
最少连接负载均衡
会话持久性
加权负载均衡
健康检查
进一步阅读

介绍

在多个应用实例之间进行负载平衡是一种常用的技术,用于优化资源利用率、最大化吞吐量、减少延迟,并确保容错配置。

可以使用 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_passgrpc_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 负载平衡算法。

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

特别是对于循环轮询,这也意味着请求在服务器之间的分布相对均匀 —— 前提是有足够的请求,以及请求以统一的方式处理并且足够快地完成。

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

    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 进行负载平衡: