nginx的负载均衡用于upstream模板定义的后端服务器列表中选取一台服务器接收用户的请求。一个基本的upstream模块如下:
upstream test{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://test/; #负载均衡
}
}
nginx :负载均衡 策略
目前Nginx的upstream模块支持6种方式的负载均衡策略(算法):轮询(默认方式)、weight(权重方式)、ip_hash(依据ip分配方式)、least_conn(最少连接方式)、fair(第三方提供的响应时间方式)、url_hash(第三方通过的依据URL分配方式)。 1)轮询
最基本的配置方法,是upstream模块默认的负载均衡策略。每个请求会按时间顺序平均分配到不同的后端服务器。有如下参数: fail_timeout 与max_fails结合使用 max_fails 在fail_timeout参数设置的时间内最大失败次数。如果在这个时间内,所有该服务器的请求都失败了,那么认为该服务器停机 fail_time 服务器被认为停机的时长,默认10s(被认为停机的服务器尝试间隔?) backup 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里 down 标记服务器永久停机
1 轮训
upstream test {
server localhost:10001;
server localhost:10002;
}
2 权重 指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能,如下配置后10002服务的访问比率会是10001服务的二倍。
upstream test {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
3 iphash 每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用)。
upstream test {
ip_hash;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
4 最少连接
将请求分配到连接数最少的服务上。
upstream test {
least_conn;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
5 fair 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream test {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
fair;
}
6 url_hash url分配方式,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以在缓存中读取。upstream模块配置模板如下:
upstream test{
hash $request_uri;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:8081;
}
location / { //第43行起
root html;
index index.html index.htm;
if ($request_uri ~* \.html$){
proxy_pass http://htmlservers;
}
if ($request_uri ~* \.php$){
proxy_pass http://phpservers;
}
proxy_pass http://picservers;
}
upstream htmlservers { //在http模块下,server模块平级处添加
server 192.168.5.102:80;
server 192.168.5.103:80;
}
upstream phpservers{
server 192.168.5.102:80;
server 192.168.5.103:80;
}
upstream picservers {
server 192.168.5.102:80;
server 192.168.5.103:80;
}