Nginx实现负载均衡Linux版本(六种负载策略)

一、负载均衡介绍

所谓负载均衡,就是我的一个后台可能只能承受100个访问量,但是最高访问量有150个,这时候怎么办呢?我们可以再加一个服务,让这两个服务以某种算法去分摊请求,这样我们的服务就不会被击垮了。

之前我们的请求都是直接访问我们提供服务的服务器,现在我们在前面加一个nginx,让所有的请求先请求nginx,然后nginx再决定具体的去访问那个服务器。


二、负载均衡搭建

2-1、准备两个服务

我这里使用SpringBoot创建两个项目,在资源文件夹里面创建一个resources/static/index.html

这两个项目是一样的,只不过端口号不同,一个index.html里面是1111、一个是2222

我们打包成2个jar包,然后访问结果如下


2-2、准备一个nginx

我的服务器已经安装了nginx,你可以参考下面的文章来安装

https://www.xdx97.com/article/650999245532299264


2-3、配置nginx.conf

把下面的配置加到 vim /usr/local/nginx/conf/nginx.conf 末尾 (当然了我们要加在 http {} 里面)

# 负载均衡测试upstream test.xdx {
   server 127.0.0.1:8001;    # 你的服务地址
   server 127.0.0.1:8002;
}

server {
       listen       80;         # 你映射的访问端口
       server_name  127.0.0.1;  # 你映射访问的ip
       location / {
           proxy_pass   http://test.xdx;
           index  index.html index.htm;
       }
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   html;
       }
   }

你需要把上面的127.0.0.1修改成为你具体的ip

运行下面的命令重新加载配置文件

/usr/local/nginx/sbin/nginx -s reload

启动你的两个服务,然后访问 127.0.0.1:80 (也就是server_name:listen)

注意因为浏览器存在缓存,所以我们要 ctrl + f5 去不断的刷新页面,我们可以看到页面在不停的切换


三、nginx负载均衡策略

nginx负载有六种策略

  • 轮询 (默认方式)

  • 权重(weight)

  • 根据ip分配 (ip_hash)

  • 最少连接(least_conn)

  • 响应时间(fair)

  • 依据URL分配(url_hash)

每种方式可以和下面的参数配合使用

参数描述
fail_timeout与max_fails结合使用
max_fails允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_time在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。默认为10s
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里
down标记服务器永久停机了


3-1、轮询 (默认方式)

会轮询每一个服务

upstream test.xdx {
   server 127.0.0.1:8001;    # 你的服务地址
   server 127.0.0.1:8002;
}


3-2、权重(weight)

权重的默认值是1,比如下面这个就是8002轮询2次,8001轮询一次。权重必须是整数倍

upstream test.xdx {
   server 127.0.0.1:8001 weight 1;    # 你的服务地址
   server 127.0.0.1:8002 weight 2;
}


3-3、根据ip分配 (ip_hash)

指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

upstream test.xdx {
   ip_hash;
   server 127.0.0.1:8001 weight 1;    # 你的服务地址
   server 127.0.0.1:8002 weight 2;
}


3-4、最少连接(least_conn)

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

upstream test.xdx {
   least_conn;    #把请求转发给连接数较少的后端服务器
   server 127.0.0.1:8001 weight 1;    # 你的服务地址
   server 127.0.0.1:8002 weight 2;
}


其它

其它两种都需要依赖第三方插件实现,这里就不演示了。