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; }
其它
其它两种都需要依赖第三方插件实现,这里就不演示了。
暂无评论
发表评论