Nginx如何实现负载均衡
Nginx是一款轻量级的Web服务器、反向代理服务器、电子邮件(IMAP/POP3)代理服务器。中国使用nginx的网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx的优点
- 高并发连接:实际测试Nginx能够支撑3万左右的并发连接,每天可以处理亿次访问量,因为它采用了epoll和kqueue网络I/O模型。
- 内存消耗小。
- Ngnix支持负载均衡。
- Nginx支持反向代理。
- 成本低廉。
Nginx实现负载均衡
负载均衡是Nginx的一个常用功能,当一台服务器的单位时间内的访问量越来越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器的压力。我们建立很多个服务器,组成一个服务器集群,当用户访问网站时先访问中间一个服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问都会保证服务器集群中的每个服务器压力趋于平衡,避免了服务器崩溃的情况。负载均衡配置一般需要同时配置反向代理,通过反向代理跳转到负载均衡。
nginx的负载均衡策略可以划分为两大类:内置策略和扩展策略。内置策略包含加权轮询和ip hash,在默认情况下这两种策略会编译进nginx内核,只需在nginx配置中指明参数即可。扩展策略有很多,如fair、通用hash、consistent hash等,默认不编译进nginx内核。
- 轮询(默认是这个)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
- 指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=8;
server 192.168.0.15 weight=10;
}
- IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 hash值和ip有关又与后端机器的数量有关。ip hash算法可以连续产生1045个互异的value。nginx使用了保护机制,当经过20次hash仍然找不到可用的机器时算法退化为轮询。因此,从本质上说,ip hash算法是一种变相的轮询算法,如果两个ip的初始hash值恰好相同,那么来自这两个ip的请求将永远落在同一台服务器上,这为均衡性埋下了较深隐患。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
- fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。fair策略是扩展策略,默认不被编译进nginx内核。它根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流。这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此须慎用。
upstream backserver {
server server1;
server server2;
fair;
}
- url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
在需要使用负载均衡的server中增加。通用hash和一致性hash也是种扩展策略。通用hash可以以nginx内置的变量为key进行hash,一致性hash采用了nginx内置的一致性hash环,可支持memcache。
proxy_pass http://backserver/;
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示当前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}