使用 nginx 作为 HTTP 负载均衡器
负载均衡方法 默认负载均衡配置 最少连接的负载均衡 会话持久性 加权负载均衡 运行状况检查 延伸阅读 |
介绍
跨多个应用程序实例的负载平衡是常用的 优化资源利用率、最大化吞吐量的技术, 减少延迟,并确保容错配置。
可以将 nginx 用作非常高效的 HTTP 负载均衡器,以 将流量分配到多个应用程序服务器,并改进 使用 NGINX 实现 Web 应用程序的性能、可扩展性和可靠性。
负载均衡方法
支持以下负载均衡机制(或方法) nginx 的 Nginx 中
- round-robin — 分发对应用服务器的请求 以循环方式,
- Least-connected — 将下一个请求分配给具有 最少的活跃连接数,
- ip-hash — 哈希函数用于确定应该使用哪个服务器 为下一个请求选择(基于客户端的 IP 地址)。
默认负载均衡配置
使用 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 上运行。 当负载均衡方式未专门配置时, 它默认为 round-robin。 所有请求都代理到服务器组 myapp1,nginx 应用 HTTP 负载 balancing 来分发请求。
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; }
会话保持
请注意,使用循环或最小连接负载 平衡,则每个后续客户端的请求都可能 分发到其他服务器。 不能保证同一客户端将始终 定向到同一服务器。
如果需要将客户端绑定到特定的应用程序服务器 — 换句话说,使客户端的会话 “sticky” 或 “persistent” 在 始终尝试选择特定服务器的术语 — IP 哈希负载 可以使用平衡机构。
使用 ip-hash 时,客户端的 IP 地址将用作哈希键,以 确定应为服务器组中的哪个服务器选择 客户的请求。 此方法可确保来自同一客户端的请求 将始终定向到同一服务器 除非此服务器不可用。
要配置 ip-hash 负载均衡,只需将 ip_hash 指令添加到服务器(上游)组配置中:
upstream myapp1 { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
加权负载均衡
甚至可以影响 nginx 负载均衡算法 进一步使用 Server Weights。
在上面的示例中,未配置服务器权重,这意味着 所有指定的服务器都被视为同等有资格使用 特定的负载平衡方法。
特别是对于循环,它也意味着或多或少相等 在服务器之间分配请求 — 前提是有足够的请求 请求,以及以统一方式处理请求时,以及 完成得足够快。
为服务器指定 weight 参数时,权重将作为部分计算 的负载均衡决策。
upstream myapp1 { server srv1.example.com weight=3; server srv2.example.com; server srv3.example.com; }
使用此配置,每 5 个新请求将分布在 应用程序实例如下:将定向 3 个请求 对于 SRv1,一个请求将发送到 SRv2,另一个请求将发送到 SRv3。
同样,也可以使用连通最少且 ip-hash 负载均衡。
运行状况检查
nginx 中的反向代理实现包括带内(或被动) 服务器运行状况检查。 如果来自特定服务器的响应失败并显示错误, nginx 会将此服务器标记为失败,并尝试 暂时避免为后续入站请求选择此服务器。
max_fails 指令将连续失败尝试的次数设置为 与服务器通信,这应该在 fail_timeout 期间进行。 默认情况下,max_fails 设置为 1。 当它设置为 0 时,将禁用此服务器的运行状况检查。 fail_timeout 参数还定义服务器将被标记为失败的时间。 在服务器故障后的 fail_timeout 间隔后,nginx 将开始正常地 使用 Live Client 的请求探测 Server。 如果探测成功,则服务器将标记为实时服务器。
延伸阅读
此外,还有更多控制 server 的指令和参数 nginx 中的负载均衡,例如 proxy_next_upstream、backup、down 和 keepalive。 有关更多信息,请查看我们的参考文档。
最后但同样重要的 应用程序负载均衡 / 应用程序运行状况检查, 活动监控和 可以对服务器组进行动态重新配置 作为我们付费 NGINX Plus 订阅的一部分。