Nginx 负载均衡

本文将介绍 nginx 中怎样去配置 HTTP 服务负债均衡,nginx 作为一个非常有效的 HTTP 负载均衡器,将流量分配到多个应用服务器,并使用 nginx 提高 web 应用程序的性能、可伸缩性和可靠性。

原文地址:https://nginx.org/en/docs/http/load_balancing.html

Nginx 负载均衡

介绍

跨多个应用程序实例实现负载均衡是一种常用的技术(即将访问压力平摊到多个应用程序实例),用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。

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

负载平衡方法


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

  • round-robin — 对应用服务器的请求以循环方式分发,每个服务获得的请求量是一致的。

  • least-connected — 下一个请求分配给活跃连接最少的服务器,即将请求分配个最闲的服务器。

  • ip-hash — 散列函数用于确定下一个请求应该选择哪个服务器(基于客户机的IP地址)。同一个客户端的请求最终返回的服务器是同一个,除了服务器宕机了或者客户端IP地址变了,才会导致服务器变化。

默认负载平衡配置

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

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

    server {
        listen 80;
        location / {
            proxy_pass https://myapp1;
        }
    }
}

在上面的示例中,同一个应用程序有3个实例运行在srv1~srv3上。如果没有特别配置负载平衡方法,则默认为 round-robin(循环方式分发)。所有请求都代理到服务器组 myapp1,由 nginx 的 HTTP 负载均衡来分发请求。

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

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

在为 FastCGI、uwsgi、SCGI、memcached 或 gRPC 设置负载均衡时,分别使用 fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass 和 grpc_pass 指令。

最小连接负载平衡

另一个负载均衡原则是最小连接原则(least-connected,即哪个服务器更空闲,就分配给哪个服务器)。在某些请求需要更长的时间才能完成的情况下,最小连接允许更公平地控制应用程序实例上的负载。

使用最少连接的负载均衡,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_fail 指令设置在 fail_timeout 期间应该发生的与服务器通信的连续失败尝试的数量。默认情况下,max_fail 被设置为1。当将其设置为 0 时,将禁用此服务器的健康检查。fail_timeout 参数还定义了服务器被标记为失败的时间。在服务器故障之后的fail_timeout 间隔之后,nginx 将开始用活动客户机的请求优雅地探测服务器。如果探测成功,则将服务器标记为活动探测。

不是每一次努力都有收获,但是,每一次收获都必须努力。
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号