Nginx负载均衡配置(超详细)
负载均衡的⽬的是为了解决单个节点压⼒过⼤,造成Web服务响应过慢,严重的情况下导致服务瘫痪,⽆法正常提供服务。
春节期间在12306⽹站上买过⽕车票的朋友应该深有体会,有时查询⼀张⽕车票都会很慢,甚⾄整个⽹页都卡住不动了。
通常⼀个访问量⾮常⼤的Web⽹站(⽐如:淘宝、京东、12306等),由于⼀个Web服务同时能处理的⽤户并发请求的数量有限,同时还有机器故障的情况,所以⼀个Web站点通常会在N台机器上各部署⼀套同样的程序。当某⼀个服务挂掉的时候,还有第⼆个、第三个、第N 个服务。。。继续为⽤户提供服务,给⽤户的感觉,你的服务还在正常的运⾏!
在这些提供同样服务的机器当中,在硬件配置⽅⾯也各不⼀样,这样就会存在部份机器性能⾮常好,能快速计算并响应⽤户的请求,另外⼀部份机器可能配置差点,响应⽤户的请求的时间会长⼀些。这就需要我们思考⼀个问题?如果有⼀个服务正在同时处理1000个⽤户的请求,这个服务的上限可能最多能同时处理1000个⽤户的请求,这时它已经很忙了,如果此时⼜有⼀个新请求过来,我们仍然把这个请求分配给这台机器,这时候这个请求就只能在⼲等着,等这个服务处理完那些请求后,再继续处理它。这样在浏览器中的反应就像12306我们在春节买票⼀样,卡在那不动了,让⽤户眼巴巴的⼲着急。⽽能提供
同样服务的其它机器,这时确很空闲。
这样不仅是对服务器资源的浪费,也充分发挥不出弄多台服务器装同⼀个服务的最⾼价值。我们通常称对某⼀台机器的访问量称为负载量,如何将⼀个⽤户的请求,合理的分配到⼀台能快速响应⽤户请求的服务器上,我们就需要⽤到⼀些负载策略。也就体现出了⽂章主题的⽤意了:负载均衡,将⽤户的所有HTTP请求均衡的分配到每⼀台机器上,充分发挥所有机器的性能,提⾼服务的质量和⽤户体验。
负载均衡可以通过负载均衡⽹络硬件设备和Web服务器软件来实现,前者设备成本较⾼,⼩公司通常负担不起,所以后者⼀般是我们的⾸选。实现负载均衡常⽤的Web服务器软件有Nginx、HAProxy、LVS、Apache,本⽂主要介绍Nginx的负载均衡策略,⾄于Nginx是⼲嘛的,⾃⾏百度。
⼀、内置负载策略
轮循(默认),Nginx根据请求次数,将每个请求均匀分配到每台服务器
最少连接,将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
IP Hash,绑定处理请求的服务器。第⼀次请求时,根据该客户端的IP算出⼀个HASH值,将请求分配到集中的某⼀台服务器上。后⾯该客户端的所有请求,都将通过HASH算法,到之前处理这台客
户端请求的服务器,然后将请求交给它来处理。
1> 轮循
http {
# ...省略其它配置
upstream tomcats {
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server example:8080;
}
server {
listen 80;
location /{
proxy_pass tomcats;
}
}
# ...省略其它配置
}
upstream tomcats {
server 192.168.0.100:8080 weight=2; # 2/6次
server 192.168.0.101:8080 weight=3; # 3/6次
server 192.168.0.102:8080 weight=1; # 1/6次
}
nginx和apache区别上例配置,表⽰6次请求中,100分配2次,101分配3次,102分配1次
max_fails 默认为1。某台Server允许请求失败的次数,超过最⼤次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久⽆效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream,
uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。
fail_timeout默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可⽤,不会将请求分配给它
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 weight=3;
server 192.168.0.102:8080 weight=1;
}
192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。
backup 备份机,所有服务器挂了之后才会⽣效
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 weight=3;
server 192.168.0.102:8080 backup;
}
在100和101都挂了之前,102为不可⽤状态,不会将请求分配给它。只有当100和101都挂了,102才会被启⽤。
down 标识某⼀台server不可⽤。可能能通过某些参数动态的激活它吧,要不真没啥⽤。
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 down;
server 192.168.0.102:8080 backup;
}
表⽰101这台Server为⽆效状态,不会将请求分配给它。
max_conns 限制分配给某台Server处理的最⼤连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表⽰不限制。注意:
1.5.9之后的版本才有这个配置
upstream tomcats {
server 192.168.0.100:8080 max_conns=1000;
}
表⽰最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有⼀个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分
配给它。
resolve 将server指令配置的域名,指定域名解析服务器。需要在http模块下配置resolver指令,指定域名解析服务
http {
resolver 10.0.0.1;
upstream u {
zone ...;
...
server example resolve;
}
}
表⽰example域名,由10.0.0.1服务器来负责解析。
upstream模块server指令的其它参数和详细配置说明,请参考官⽅⽂档。
⼆、第三⽅负载策略
1> fair
根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压⼒⼩的优先会分配。
由于fair模块是第三⽅提供的,所以在编译nginx源码的时候,需要将fair添加到nginx模块中。(假设我的nginx是通过源码安装的,安装在/opt/nginx⽬录下,⽽且安装时没有添加fair模块)
1.1> 下载fair模块源码
cd /opt
wget github/xyang0917/nginx-upstream-fair/archive/master.zip
unzip master.zip
解压后的⽬录名为:nginx-upstream-fair-master
1.2> 重新编译nginx,将fair模块添加到编译参数
我的nginx源码⽬录在/opt/nginx-1.10.0
cd /opt/nginx-nginx-1.10.0
./configure --prefix=/opt/nginx --add-module=/opt/nginx-upstream-fair-master
make
注意:不要执⾏make install,这样会覆盖之前nginx的配置
1.3> 将新编译的nginx可执⾏程序拷贝到/opt/nginx/sbin/⽬录下,覆盖之前安装的nginx
编译后的nginx执⾏程序,放在nginx源码的objs⽬录下
ps -aux | grep nginx
kill -9 nginx进程ID # 停⽌nginx服务
cp /opt/nginx-1.10.0/objs/nginx /opt/nginx/sbin/ # 覆盖旧的nginx
nginx # 启动服务
配置使⽤fair负载策略模块:
upstream tomcats {
fair;
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
由于采⽤fair负载策略,配置weigth参数改变负载权重将⽆效。
2> url_hash
按请求url的hash结果来分配请求,使每个url定向到同⼀个后端服务器,服务器做缓存时⽐较有效。
安装⽅法和fair模块⼀样,先下载url_hash源码,然后重新编译nginx源码,将url_hash模块添加到编译配置参数当中,最后将编译后⽣成的nginx⼆进制⽂件替换之前安装的nginx⼆进制⽂件即可。
upstream tomcats {
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
hash $request_uri;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论