使用 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 哈希负载均衡一起使用。
健康检查
Nginx 中的反向代理实现包括带内(或被动)服务器健康检查。如果来自特定服务器的响应以错误失败,Nginx 将标记该服务器为失败,并尝试避免在一段时间内为后续的入站请求选择此服务器。
max_fails 指令设置与服务器通信的连续不成功尝试次数,这些尝试应在fail_timeout 期间发生。默认情况下,max_fails 设置为 1。当它设置为 0 时,将禁用此服务器的健康检查。fail_timeout 参数还定义服务器将被标记为失败的时间长度。在服务器故障后的fail_timeout 间隔之后,Nginx 将开始使用活动客户端的请求优雅地探测服务器。如果探测成功,则该服务器将被标记为活动服务器。
进一步阅读
此外,还有更多指令和参数可以控制 Nginx 中的服务器负载均衡,例如proxy_next_upstream、backup、down 和 keepalive。有关更多信息,请查看我们的参考文档。
最后但并非最不重要的一点是,应用程序负载均衡、应用程序健康检查、活动监控和服务器组的动态重新配置可作为我们付费的 NGINX Plus 订阅的一部分提供。