负载均衡技术是在多个应用实例之间的通用技术,用于优化资源利用,增大吞吐量,减少延迟,和确保故障容忍配置。
很可能使用Nginx作为一个高效的HTTP负载均衡器分发请求到不同的应用服务器,改善web应用性能,扩展性和可靠性。
1、负载均衡方式
Nginx支持下面的负载均衡策略
round-robin 对应用服务器的请求以轮询方式
least-connected 下一个请求分配到拥有最少活跃连接数的服务器。
ip-hash 一个hash函数,用于决定哪一个服务器处理下一个请求,基于客户端的IP地址。
2、默认的负载均衡配置
最简单的nginx负载均衡看起来就像这样
http {
upstreammyapp {
serversrv1.example.com;
serversrv2.example.com;
serversrv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp
}
}
}
上面的例子中,有三个相同应用实例运行在srv1-srv3.当负载均衡方法没有指定的时候,默认使用round-robin。所有的请求被代理到myapp服务器组,nginx应用HTTP负载均衡方法分发请求。
在nginx中实现的反向代理包括对HTTP,HTTPS,FastCGI,uwsgi,SCGI和memcached的负载均衡。
想要配置HTTPS的负载均衡,只需要使用https作为协议。
当配置FastCGI,uwsgi,SCGI或memcached的负载均衡的时候,使用fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令。
3、最少连接负载均衡
另一个负载均衡方式是least-connected。least-connected控制应用的负载使用相对公平的方式当请求需要长时间才能完成的时候。
使用least-connected负载均衡方式,nginx将不会在负载很忙的服务器上增加请求,而是分发新的请求到不忙的服务器上面。
least-connected负载均衡方式在nginx中,当least conn指令用于服务器组配置部分时被激活upstream myapp1 {
least_conn;
serversrv1.example.com;
serversrv2.example.com;
serversrv3.example.com;
}
4、会话保持
请记住一点是使用round-robin或least-connected方式,后来的客户端请求都有可能分发到不同的服务器上。不能保证同一个客户端一直指向同一个服务器。
如果需要绑定客户端到特定的应用服务器,也就是让客户端的回话,粘住,持久的,一直选择特定的一个服务器。可以选择使用ip-hash负载均衡方式。
使用ip-hash,客户端的IP地址用作hash key,决定哪一个服务器被选中来处理客户端的请求。这个方式确保相同客户端的请求一直定向到相同的服务器,除非这个服务器不可用了。
想配置IP-hash负载方式,只需要添加ip_hash指令在服务器组配置里面。
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
5、权重负载均衡
使用服务器的权重来影响nginx的负载均衡算法也是有可能的。
在上面的例子中,服务器权重都没有配置,也就意味着所有知道的服务器都被同等对待对于特定的负载均衡算法来说。
使用round-robin的话,这也意味着服务器之间会分发相同的请求数量。
当weight参数加在指定服务器上的时候,weight也被看做负载均衡决定的部分。
upstream myapp1 {
serversrv1.example.com weight=3;
serversrv2.example.com;
serversrv3.example.com;
}
使用这种配置的话,每5个新的请求到来,3个请求会分发给srv1,一个给srv2,一个给srv3。
在较新版本的nginx中使用weight在ip-hash和least-connected负载均衡方式也是可以的。
6、健康检查
在nginx实现反向代理的时候,也可以实现健康状态检查,如果服务器响应错误了,nginx会把这个服务器标记为faild,然后试着避免挑选这个服务器处理后面的请求。
max_fails指令设置了在fail_timeout中尝试访问服务器的最大失败次数,默认max_fails设为1.当设为0的时候,这个服务器将不会进行健康检查。fail_timeoutcanshu定义了多长时间之内这个服务器被标记为失败。在fail_timeout间隔后,随着服务器的失败,ngixn会尝试平缓的使用客户端请求探测服务器,如果探测成功了,那么这个服务器被标记为活着的。
原文:http://nginx.org/en/docs/http/load_balancing.html