使用 nginx 作为 HTTP 负载均衡器
负载均衡方法 默认负载均衡配置 最少连接负载均衡 会话持久性 加权负载均衡 健康检查 进一步阅读 |
简介
跨多个应用程序实例进行负载均衡是优化资源利用率、最大化吞吐量、减少延迟和确保容错配置的常用技术。
可以将 nginx 用作非常高效的 HTTP 负载均衡器,以将流量分配到多个应用程序服务器,并通过 nginx 提高 Web 应用程序的性能、可扩展性和可靠性。
负载均衡方法
nginx 中支持以下负载均衡机制(或方法)
- 循环 — 以循环方式将请求分配到应用程序服务器,
- 最少连接 — 将下一个请求分配给活动连接数最少的服务器,
- ip 哈希 — 使用哈希函数来确定应为下一个请求选择哪个服务器(基于客户端的 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; } } }
在上面的示例中,在 srv1-srv3 上运行着同一应用程序的 3 个实例。当未明确配置负载均衡方法时,它默认为循环。所有请求都 代理 到服务器组 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 指令。
最少连接负载平衡
另一种负载平衡机制是最少连接。最少连接允许在某些请求需要更长时间才能完成的情况下,更公平地控制应用程序实例上的负载。
使用最少连接负载平衡时,nginx 会尝试不向繁忙的应用程序服务器发送过多的请求,而是将新请求分发给较不繁忙的服务器。
当 least_conn 指令用作服务器组配置的一部分时,nginx 中的最小连接负载平衡就会被激活
upstream myapp1 { least_conn; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
会话保持
请注意,使用循环或最少连接负载平衡时,每个后续客户端的请求都可能会分发到不同的服务器。无法保证始终将同一客户端定向到同一服务器。
如果需要将客户端绑定到特定的应用程序服务器,换句话说,使客户端的会话“粘滞”或“持久”,从而始终尝试选择特定的服务器,则可以使用 ip 哈希负载平衡机制。
使用 ip 哈希时,客户端的 IP 地址用作哈希键,以确定应为客户端的请求选择服务器组中的哪个服务器。此方法确保来自同一客户端的请求始终定向到同一服务器,除非此服务器不可用。
要配置 ip 哈希负载平衡,只需将 ip_hash 指令添加到服务器(上游)组配置中即可
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,一个请求将转到 srv2,另一个请求将转到 srv3。
在 nginx 的最新版本中,同样可以使用权重与最少连接和 ip-hash 负载均衡。
健康检查
nginx 中的反向代理实现包括带内(或被动)服务器健康检查。如果特定服务器的响应以错误失败,nginx 将标记此服务器为失败,并将尝试避免暂时为后续入站请求选择此服务器。
max_fails 指令设置在 fail_timeout 期间应发生的与服务器通信的连续失败尝试次数。默认情况下,max_fails 设置为 1。当将其设置为 0 时,将禁用此服务器的健康检查。fail_timeout 参数还定义服务器将被标记为失败的时间长度。在服务器故障后的 fail_timeout 间隔后,nginx 将开始使用实时客户端的请求从容地探测服务器。如果探测成功,则服务器将被标记为实时服务器。
进一步阅读
此外,还有更多控制 nginx 中服务器负载均衡的指令和参数,例如 proxy_next_upstream、backup、down 和 keepalive。有关更多信息,请查看我们的 参考文档。
最后但并非最不重要的是,应用程序负载均衡、应用程序健康检查、活动监控 和服务器组的 即时重新配置 可作为我们付费的 NGINX Plus 订阅的一部分提供。
以下文章更详细地介绍了 NGINX Plus 的负载均衡