一、简介
跨多个应用程序实例的负载均衡是一种常用的技术,用于优化资源利用、最大化吞吐量、减少延迟和确保容错配置。
我们可以使用 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;
}
}
}
在上面的示例中,同一个应用程序有 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 指令。
四、最小连接负载均衡
另一个负载平衡原则是连接最少的。在某些请求需要较长时间才能完成的情况下,最小连接允许更公平地控制应用程序实例上的负载。
使用最少连接的负载平衡,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 哈希负载平衡的权重。
七、健康检查
nginx 中的反向代理实现包括带内(或被动)服务器健康检查。如果来自特定服务器的响应出现错误,Nginx 会将此服务器标记为失败,在一段时间内,将尽量避免为后续的入站请求选择此服务器。
max_fails 指令设置 在 fail_timeout 期间应该发生的与服务器通信的连续不成功尝试次数 。缺省情况下,max_fails 设置为 1。将其设置为 0 时,将禁用此服务器的健康检查。fail_timeout 参数还定义服务器将被标记为失败的时间。在服务器失败后的 fail_timeout 间隔后,Nginx 将开始优雅地使用客户端请求探测服务器。如果探测成功,服务器将被标记为活动的服务器。
八、延伸阅读
此外,在 nginx 中还有更多的指令和参数来控制服务器的负载平衡,例如proxy_next_upstream、backup、down 和 keepalive。更多信息请查看我们的参考文档。【参考文档地址点阅读原文跳转】
最后,应用程序负载平衡,应用程序健康检查,活动监控和服务器组的动态重新配置都可以作为我们付费的 NGINX Plus 订阅的一部分。
最后,欢迎加入我们的测试自学交流群,里面有来自华为,字节,阿里,科大讯飞等公司的热心同行,2022,一起抱团取暖。