文章目录
一、概述
将流量负载均衡到多个应用实例是一个优化资源利用率的常规技术,可以最大化吞吐量,减少延迟并且提高容错性。
二、将Http流量代理到一组服务
为了使用nginx将http流量负载均衡到一组服务,你首先需要通过 upstream 指令定义一组服务,该指令应放在http模块内。upstream内的单个服务通过server指令进行指定,指定的值可以是IP也可以是域名,例如以下配置定义了一个名为backend的一组服务,由三个服务组成:
http {
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server 192.0.0.1 backup;
}
}
一组服务定义好之后,便可以通过反向代理配置将一个请求代理到该组服务,如下所示:
server {
location / {
proxy_pass http://backend;
}
}
三、选择一种负载均衡方式
nginx支持4种负载均衡方式:
1、循环分发
请求会根据每个服务的权重被均匀的分发到各个服务,权重越大,分发的时候就会被优先考虑,该方式也是默认方式,因此不需要在配置中明确指定使用此种方式。
2、最少连接
每次请求会结合权重分发给连接最少的服务,需要在upstream中使用least_conn进行指定使用此种方式:
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
3、IP哈希
此种方式下,请求分发给哪一个服务取决于请求客户端的IP地址,IP地址会被用来计算出一个hash值,根据hash值再决定分发给哪一个服务,因此该方式的特点是同一个客户端IP的请求会被分发到同一个服务,该方式需要在upstream中使用ip_hash进行指定:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
如果服务组中的某一个服务需要临时下线,可以在最后将其标记一个down,请求就会跳过该服务而分发给下一个:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
}
4、通用哈希
请求会分发给哪一个服务由用户定义的键确定,该键可以是文本字符串、变量或它们的组合。例如,键可以是成对的源 IP 地址和端口,或 URI,如本例所示:
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
上例中,指定将请求URI作为键,也就是说具体分发给哪一个服务,会由请求的URI经过hash后得到的值决定。hash 指令的可选参数consistent用于指定是否 启用ketama 一致性哈希负载平衡。如果启用,请求根据用户定义的散列键值均匀分发给所有服务。
四、服务权重
默认情况下,nginx在循环分发时,如果没有给服务指定权重,它们的权重都默认为1,要修改的话可以使用weight进行配置:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server 192.0.0.1 backup;
}
上例中,backend1.example.com的权重被配置为5,backend2.example.com为默认权重1,而192.0.0.1被标记为backup(不接受请求),意味着6次请求中,5次会分发给backend1.example.com,1次分发给backend2.example.com