原文地址:https://nginx.org/en/docs/http/load_balancing.html
跨多个应用程序实例实现负载均衡是一种常用的技术(即将访问压力平摊到多个应用程序实例),用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。
可以使用 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 将开始用活动客户机的请求优雅地探测服务器。如果探测成功,则将服务器标记为活动探测。