nginx 负载均衡

2021-04-09 11:13:11 浏览数 (1)

nginx的负载均衡用于upstream模板定义的后端服务器列表中选取一台服务器接收用户的请求。一个基本的upstream模块如下:

代码语言:javascript复制
upstream test{
  server 127.0.0.1:8080;
  server 127.0.0.1:8081;
}
代码语言:javascript复制
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 轮训

代码语言:javascript复制
  upstream  test {
       server    localhost:10001;
       server    localhost:10002; 
  }

2 权重 指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能,如下配置后10002服务的访问比率会是10001服务的二倍。

代码语言:javascript复制
upstream  test {
      server    localhost:10001 weight=1;
      server    localhost:10002 weight=2;
}

3 iphash 每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用)。

代码语言:javascript复制
upstream  test {
       ip_hash; 
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
}

4 最少连接

将请求分配到连接数最少的服务上。

代码语言:javascript复制
upstream  test {
       least_conn;
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
}

5 fair 按后端服务器的响应时间来分配请求,响应时间短的优先分配。

代码语言:javascript复制
upstream  test {
       server    localhost:10001 weight=1;
       server    localhost:10002 weight=2;
       fair;  
}

6 url_hash url分配方式,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以在缓存中读取。upstream模块配置模板如下:

代码语言:javascript复制
upstream test{
  hash $request_uri;
  server 127.0.0.1:8080 weight=2;
  server 127.0.0.1:8081;
}
代码语言:javascript复制
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;
}

0 人点赞