Appearance
将 nginx 用作 HTTP 负载均衡器
提示
来自deepseek解释
原文链接:https://nginx.org/en/docs/http/load_balancing.html
简介
跨多个应用实例进行负载均衡是一种常用技术,用于优化资源利用率、最大化吞吐量、减少延迟并确保容错配置。可以使用 nginx 作为非常高效的 HTTP 负载均衡器,将流量分发到多个应用服务器,从而提高 Web 应用的性能、可扩展性和可靠性。
负载均衡方法
nginx 支持以下负载均衡机制(或方法):
- 轮询(round-robin) — 以轮询方式将请求分发到应用服务器。
- 最少连接(least-connected) — 下一个请求将分配给活动连接数最少的服务器。
- IP 哈希(ip-hash) — 使用哈希函数决定下一个请求选择哪台服务器(基于客户端的 IP 地址)。
默认负载均衡配置
使用 nginx 进行负载均衡的最简单配置可能如下所示:
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 上。当未专门配置负载均衡方法时,默认使用轮询方式。所有请求都被代理到服务器组 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 会尽量不让繁忙的应用服务器过载,而是将新请求分配给较不繁忙的服务器。
nginx 中的最少连接负载均衡通过在服务器组配置中使用 least_conn 指令来激活:
nginx
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}最少时间负载均衡
另一种负载均衡策略是最少时间(least-time)。最少时间会选择平均响应时间最低且活动连接数最少的服务器,同时考虑正在传输中的请求。使用最少时间负载均衡时,nginx 根据 least_time 指令中指定的以下参数之一来选择服务器:
header— 从服务器接收第一个字节的时间last_byte— 从服务器接收完整响应的时间last_byte inflight— 从服务器接收完整响应的时间,同时考虑未完成的请求
nginx 中的最少时间负载均衡通过在服务器组配置中使用 least_time 指令来激活:
nginx
upstream myapp1 {
least_time header;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}会话持久性
请注意,使用轮询或最少连接负载均衡时,每个客户端的后续请求可能会被分发到不同的服务器。无法保证同一客户端始终被定向到同一服务器。
如果需要将客户端绑定到特定的应用服务器——换句话说,使客户端的会话具有“黏性”或“持久性”,始终尝试选择特定的服务器——可以使用 IP 哈希负载均衡机制。使用 IP 哈希时,客户端的 IP 地址用作哈希键,以决定服务器组中的哪台服务器应为该客户端的请求提供服务。此方法确保来自同一客户端的请求始终被定向到同一服务器,除非该服务器不可用。
要配置 IP 哈希负载均衡,只需将 ip_hash 指令添加到服务器(上游)组配置中:
nginx
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}加权负载均衡
通过使用服务器权重,还可以进一步影响 nginx 负载均衡算法。在上述示例中,未配置服务器权重,这意味着所有指定服务器对于特定的负载均衡方法具有同等的资格。特别是对于轮询方式,这也意味着请求在服务器之间大致均匀分配——前提是有足够的请求,并且请求以统一的方式处理且足够快地完成。
当为服务器指定了 weight 参数时,该权重将作为负载均衡决策的一部分被考虑在内。
nginx
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}通过此配置,每 5 个新请求将按如下方式分发到应用实例:3 个请求将定向到 srv1,1 个请求将定向到 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 订阅的一部分提供。