使用 nginx 作为 HTTP 负载均衡器

负载均衡方法
默认负载均衡配置
最少连接负载均衡
会话保持
加权负载均衡
健康检查
延伸阅读

引言

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

可以将 nginx 用作高效的 HTTP 负载均衡器,将流量分发到多个应用服务器,从而提高 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;
        }
    }
}

在上面的示例中,srv1-srv3 上运行着同一应用程序的 3 个实例。如果未明确配置负载均衡方法,则默认为轮询。所有请求都 代理 到服务器组 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;
    }

会话保持

请注意,使用轮询或最少连接负载均衡时,客户端的后续每个请求可能会被分发到不同的服务器。无法保证同一客户端始终会被定向到同一服务器。

如果需要将客户端绑定到特定的应用服务器 — 换句话说,使客户端的会话“粘性”(sticky)或“持久化”(persistent),即始终尝试选择同一服务器 — 则可以使用 ip-hash 负载均衡机制。

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

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

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,1 个请求将发送到 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 订阅的一部分提供。