本文来自 http://nginx.org/en/docs/http/load_balancing.html#nginx_load_balancing_methods
1. 简介
跨多个应用实例
的负载均衡(load balancing)是优化资源利用率
(optimizing resource utilization),最大化吞吐量
(maximizing throughput),减少延迟
(reducing latency),确保容错配置
(ensuring fault-tolerant configurations)的通用方法。
可以使用nginx作为一个非常有效的HTTP负载均衡器,将流量分配到多个应用服务器,并使用nginx提高web应用程序的性能
、可伸缩性
和可靠性
。
2. 负载均衡策略
nginx支持以下负载均衡策略(或方法):
- 轮询(round-robin)—— 将请求以轮询的方式分发给服务器
- 最少连接(least-connected)—— 将请求分配给活动连接最少的服务器
- IP 哈希(ip-hash)—— 使用一个hash函数(基于客户机的IP地址)来确定请求应该分发给哪个服务器。
2.1. 默认负载均衡配置
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http:\\myapp1; // 这里应该是 http://myapp1 但是我不会转格式
}
}
}
在上面的示例中,同一个应用程序有3个实例运行在srv1-srv3上。如果没有特别配置负载均衡策略,则默认为轮询
。所有请求都代理到服务器组myapp1, nginx应用HTTP负载均衡来分发请求。
nginx中的反向代理实现包括HTTP、HTTPS、FastCGI、uwsgi、SCGI、memcached和gRPC的负载平衡。
在为FastCGI、uwsgi、SCGI、memcached或gRPC设置负载均衡时,分别使用fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass和grpc_pass指令。
2.2. 最少连接负载均衡
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
2.3. 持久性会话
请注意,通过轮询或最少连接的负载均衡,每个客户机的请求可能分布到不同的服务器。不能保证将相同客户机的请求定向到特定的服务器
。
如果需要将客户机绑定到特定的服务器——换句话说,使客户机的会话具有“粘性”或“持久性”,以便总是选择特定的服务器——那么可以使用ip-hash负载均衡机制
。
使用ip-hash时,将客户机的IP地址用作散列key,以确定应该为客户机请求选择服务器组中的哪个服务器。此方法确保来自同一客户机的请求总是指向同一服务器,除非该服务器不可用
。
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
2.4. 加权负载均衡
还可以通过使用服务器权重进一步影响nginx负载均衡算法。
在上面的示例中,没有配置服务器权重,这意味着对于特定的负载均衡策略,所有的服务器都被同等对待。
特别是对于轮循,它还意味着请求在服务器上的分布是均等的——只要有足够的请求,并且当请求以统一的方式处理并足够快地完成时。
当为服务器指定权重参数
时,该权值将作为负载均衡决策的一部分
。
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
3. 健康检查
nginx中的反向代理实现包括 in-band
(或 passive
)服务器健康检查。如果来自特定服务器的响应失败并出现错误,nginx会将此服务器标记为 failed
,并暂时避免为后续的请求选择此服务器。
max_failed 指令设置在 fail_timeout 期间尝试与服务器通信的连续失败次数。默认情况下,max_failed设置为1。将其设置为0时,将禁用此服务器的健康检查。fail_timeout参数还定义了服务器被标记为 failed
的时间长度。在服务器故障之后的 fail_timeout 时间间隔之后,nginx将开始使用活动客户机请求优雅地探测服务器 。如果探测成功,则将服务器标记为活动的探测。