使用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;
}
}
}
在上面的示例中,同一个应用程序有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订阅的一部分。
下面的文章更详细地描述了NGINX Plus的负载平衡:
注:本文是翻译官方文档
欢迎来到testingpai.com!
注册 关于