介绍
跨多个应用程序实例的负载平衡是用于优化资源利用率,最大化吞吐量,减少延迟并确保容错配置的常用技术。
有可能使用nginx作为一个非常有效的HTTP负载均衡器分配流量到几个应用程序服务器,并提高web应用程序的性能,可扩展性和可靠性与nginx。
负载平衡方法
在nginx中支持以下负载平衡机制(或方法):
- 循环 - 对应用服务器的请求以循环方式分布,
- 最小连接 - 下一个请求分配给具有最少活动连接数的服务器,
- ip-hash - 散列函数用于确定应为下一个请求选择什么服务器(基于客户端的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个实例。当负载均衡方法没有特别配置时,它默认为round-robin。所有请求都被 代理到服务器组myapp1,并且nginx应用HTTP负载平衡来分发请求。
nginx中的逆向代理实现包括HTTP,HTTPS,FastCGI,uwsgi,SCGI和memcached的负载平衡。
要为HTTPS而不是HTTP配置负载平衡,只需使用“https”作为协议。
当设置负载平衡的FastCGI,uwsgi,SCGI,或者memcached的使用 fastcgi_pass, uwsgi_pass, scgi_pass和memcached_pass 分别指令。
最小连接负载平衡
另一个负载均衡规则是最小连接的。最小连接允许在某些请求需要更长时间完成的情况下更公平地控制应用程序实例上的负载。
使用最小连接的负载平衡,nginx将尽量不要使过多的请求使繁忙的应用程序服务器过载,而是将新的请求分发给不太忙的服务器。
当将 least_conn伪指令用作服务器组配置的一部分时,将激活 nginx中的最小连接负载 均衡:
上游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散列负载均衡的权重。