05 Nginx负载均衡
2020年11月4日 study
2021年5月12日 review
01 Linux服务器安装JDK8和jar包上传
安装JDK8:
- 下载:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
- 上传到阿里云服务器的
/usr/local/software/jdk目录下; - 配置全局环境变量
tar -zxvf jdk-8u181-linux-x64.tar.gz- 重命名为jdk8:
mv jdk1.8.0_181/ jdk8 - 配置环境变量,后
source /etc/profile立即生效,java -version查看是否安装好
JAVA_HOME=/usr/local/software/jdk/jdk8
CLASSPATH=$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
注意:配置环境变量的时候,等号=两边不能有空格,不然会报错;
02 后端应用集群构建
SpringBoot应用和接口说明:
- demo-1.jar监听8080端口;
- demo-2.jar监听8081端口;
接口说明:(要在阿里云中开启端口访问权限才能成功调用接口)
进程启动:
- 直接启动:
java -jar demo-1.jar - 守护进程方式启动:
nohup java -jar demo-1.jar &
03 Nginx负载均衡
负载均衡(Load Balance)
- 分布式系统中一个非常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡;
- 原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高吞吐量。
负载均衡的种类
- 通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但比较昂贵;
- 通过软件来进行解决,常见的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略;
- 目前性能和成本来看,Nginx是目前多数公司的首选;

配置案例:
upstream lbs {
server 47.115.23.41:8080;
server 47.115.23.41:8081;
}
server {
listen 80;
server_name 47.115.23.41;
location /api/ {
proxy_pass http://lbs;
proxy_redirect default;
}
}
- upstream一般放在虚拟主机server上面,lbs为取的一个名字,在下面引用。
- 请求流程:用户通过域名server_name请求到了虚拟主机server,然后与location中的路径匹配,如果满足,则proxy_pass到upstream里面,有很多个server,会通过负载均衡策略(默认为轮询),分发到某个server。
- proxy_redirect default; 可以不加这行。

刷新,轮询

04 Nginx常见的负载均衡策略
-
节点轮询(默认)
- 简介:每个请求按顺序分配到不同的后端服务器;
- 场景:会造成可靠性低和负载分配不均衡,适合静态文件服务器;
-
weight权重配置
- 简介:weight和访问比率成正比,数字越大,分配得到的流量越高;
- 场景:服务器性能差异大的情况使用;
upstream lbs {
server 47.115.23.41:8080 weight=5;
server 47.115.23.41:8081 weight=10;
}
server {
listen 80;
server_name 47.115.23.41;
location /api/ {
proxy_pass http://lbs;
proxy_redirect default;
}
}
- ip_hash(固定分发)
- 简介:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器;
- 场景:服务器业务分区、业务缓存、Session需要单点的情况;
upstream lbs {
ip_hash;
server 47.115.23.41:8080;
server 47.115.23.41:8081;
}
server {
listen 80;
server_name 47.115.23.41;
location /api/ {
proxy_pass http://lbs;
proxy_redirect default;
}
}
upstream还可以为每个节点设置状态值:
down表示当前的server暂时不参与负载;server 47.115.23.41:8080 down;backup其它所有的非backup机器down的时候,会请求backup机器,这台机器压力会最轻,配置也会相对低;server 47.115.23.41:8080 backup;
注释:测试backup的时候,可以kill没有加backup的那个server,之后就会调用加了backup的server了。
05 Nginx后端节点可用性探测
如果某个应用挂了,请求不应该继续分发过去;
max_fails:允许请求失败的次数,默认为1,当超过最大次数时就不会请求;fail_timeout:max_fails次失败后,暂停的时间,默认为10s;
参数解释
max_fails=N:设定Nginx与后端节点通信尝试失败的次数;- 在
fail_timeout参数定义的时间内,如果失败的次数达到此值,Nginx就认为这个节点不可用; - 在下一个
fail_timeout时间段到来前,服务器不会再被尝试; - 失败的尝试次数默认是1,如果设为0就会停止统计尝试次数,认为服务器是一直可用的;
具体什么是nginx认为的失败呢?
- 可以通过指令
proxy_next_upstream来配置什么是失败的尝试。 - 注意默认配置时,http_404状态不被认为是失败的尝试。
upstream lbs {
server 47.115.23.41:8080 max_fails=2 fail_timeout=60s;
server 47.115.23.41:8081 max_fails=2 fail_timeout=60s;
}
server {
listen 80;
server_name 47.115.23.41;
location /api/ {
proxy_pass http://lbs;
proxy_next_upstream error timeout http_500 http_503 http_404;
}
}
案例实操:
- kill一个节点后,然后访问接口大于10次,如果访问不到,Nginx会把这个节点剔除;
- 重启这个节点,在fail_timeout周期里面不会再获取流量;

浙公网安备 33010602011771号