使用nginx作为HTTP负载平衡器

负载平衡方法

默认负载平衡配置

最不连接的负载均衡

会话持久性

加权负载平衡

健康检查

进一步阅读

Introduction

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

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

Load balancing methods

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

Default load balancing configuration

使用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个实例。当负载均衡方法没有特别配置时,默认为round-robin。所有请求都被代理到服务器组myapp1,nginx应用HTTP负载平衡来分发请求。

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

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

在为FastCGI,uwsgi,SCGI或memcached设置负载均衡时,请使用fastcgi_passuwsgi_passscgi_passmemcached_pa​​ss 指令。

Least connected load balancing

另一个负载平衡规则是最少连接的。在一些请求需要更长时间才能完成的情况下,最少连接可以更公正地控制应用程序实例的负载。

使用最少连接的负载平衡,nginx将尽量不要过多的请求来重载忙碌的应用程序服务器,而是将新的请求分发到不太忙的服务器。

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

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

Session persistence

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

如果需要将客户端绑定到特定的应用服务器 - 换句话说,使客户端的会话“粘滞”或“永久”,总是试图选择特定的服务器 - 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;
}

Weighted load balancing

还可以通过使用服务器权重进一步影响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负载均衡的权重。

Health checks

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

max_fails指令设置在fail_timeout期间应该发生的连续不成功尝试与服务器通信的次数。默认情况下,max_fails设置为1。当设置为0时,此服务器的运行状况检查已禁用。fail_timeout参数还定义了服务器将被标记为失败的时间。在服务器出现故障之后的fail_timeout间隔之后,nginx将开始以实时客户端的请求来优雅地探测服务器。如果探针成功,则将服务器标记为活动的。

Further reading

此外,还有更多的指令和参数可以控制nginx中的服务器负载均衡。 proxy_next_upstream备份downkeepalive有关更多信息,请查看我们的参考文档

Last but not least, application load balancing, application health checks, activity monitoring and on-the-fly reconfiguration of server groups are available as part of our paid NGINX Plus subscriptions.

以下文章详细介绍了NGINX Plus的负载均衡: