本文起源:http://8rr.co/LSUH
前言
本篇文章次要介绍的是Nginx如何实现负载平衡。
负载平衡介绍
在介绍Nginx的负载平衡实现之前,先简略的说下负载平衡的分类,次要分为硬件负载平衡和软件负载平衡,硬件负载平衡是应用专门的软件和硬件相结合的设施,设施商会提供残缺成熟的解决方案,比方F5,在数据的稳定性以及安全性来说十分牢靠,然而相比软件而言造价会更加低廉;软件的负载平衡以Nginx这类软件为主,实现的一种音讯队列散发机制。
简略来说所谓的负载平衡就是把很多申请进行分流,将他们调配到不同的服务器去解决。比方我有3个服务器,别离为A、B、C,而后应用Nginx进行负载平衡,应用轮询策略,此时如果收到了9个申请,那么会平均的将这9个申请分发给A、B、Cf服务器,每一个服务器解决3个申请,这样的话咱们能够利用多台机器集群的个性缩小单个服务器的压力。
Nginx实现负载平衡的示例图:
负载平衡策略
NGINX开源反对四种负载平衡办法,而NGINX Plus又减少了两种办法。
1.Round Robin: 对所有的申请进行轮询发送申请,默认的调配形式。
nginx.conf 配置示例:
upstream xuwujing { server www.panchengming.com; server www.panchengming2.com;}
注:下面的域名也能够用IP代替。
2.Least Connections:以起码的流动连接数将申请发送到服务器,同样要思考服务器权重。
nginx.conf 配置示例:
upstream xuwujing { least_conn; server www.panchengming.com; server www.panchengming2.com;}
3.IP Hash : 发送申请的服务器由客户机IP地址决定。在这种状况下,应用IPv4地址的前三个字节或整个IPv6地址来计算散列值。该办法保障来自雷同地址的申请达到雷同的服务器,除非该服务器不可用。
upstream xuwujing { ip_hash; server www.panchengming.com; server www.panchengming2.com;}
4.Generic Hash: 申请发送到的服务器由用户定义的键决定,该键能够是文本字符串、变量或组合。
upstream xuwujing { hash $request_uri consistent; server www.panchengming.com; server www.panchengming2.com; }
5.Least Time (NGINX Plus only) – 对于每个申请,NGINX Plus抉择具备最低均匀提早和最低流动连接数的服务器,其中最低均匀提早是依据蕴含least_time指令的下列参数计算的:
- header :从服务器接管第一个字节的工夫。
- last_byte:从服务器接管残缺响应的工夫。
- last_byte inflight:从服务器接管残缺响应的工夫。
upstream xuwujing { least_time header; server www.panchengming.com; server www.panchengming2.com; }
6.Random:每个申请将被传递到随机抉择的服务器。如果指定了两个参数,首先,NGINX依据服务器权重随机抉择两个服务器,而后应用指定的办法抉择其中一个。
- least_conn :流动连贯的起码数量
- least_time=header (NGINX Plus):从服务器接管响应标头的最短均匀工夫 ($upstream_header_time)。
least_time=last_byte (NGINX Plus) :从服务器接管残缺响应的最短均匀工夫($upstream_response_time)。
upstream xuwujing {random two least_time=last_byte;server www.panchengming.com;server www.panchengming2.com;}
Nginx+SpringBoot实现负载平衡
环境筹备
- 依赖JDK1.8以上的版本;
- 依赖Nginx环境;
这里的我的项目就用自己之前的一个springboot我的项目,SpringBoot的我的项目地址: https://github.com/xuwujing/s...
首先咱们下载这个我的项目,输出:mvn clean package
将我的项目进行打包为jar文件,而后将application.properties
和此jar我的项目放在一个文件夹中,而后复制该文件夹(这里为了清晰所以进行复制,理论不复制更改端口重启也行),批改复制文件夹application.properties
的端口,比方改为8086。
Nginx 配置
咱们找到nginx的配置文件nginx.conf,该配置在nginx/conf/nginx.conf目录下,而后咱们来批改该配置,新增如下配置:
upstream pancm{ server 127.0.0.1:8085; server 127.0.0.1:8086;}
- upstream pancm:定义一个名称,随便就行;
- server + ip:端口 or 域名;
如果不想应用Round Robin策略,也能够换成其余的。
而后在server增加/批改如下配置:
server { listen 80; server_name 127.0.0.1; location / { root html; proxy_pass http://pancm; proxy_connect_timeout 3s; proxy_read_timeout 5s; proxy_send_timeout 3s; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
配置阐明:
- server: 虚拟主机的名称,一个http中能够配置多个server;
- listen:Nginx默认的端口;
- server_name:Nginx服务的地址,能够应用域名,多个用空格分隔。
- proxy_pass:代理门路,个别配置upstream前面的名称用于实现负载平衡,能够间接配置ip进行跳转;
nginx.conf 残缺的配置:
events { worker_connections 1024;}error_log nginx-error.log info;http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream pancm{ server 127.0.0.1:8085; server 127.0.0.1:8086; } server { listen 80; server_name 127.0.0.1; location / { root html; proxy_pass http://pancm; proxy_connect_timeout 3s; proxy_read_timeout 5s; proxy_send_timeout 3s; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
负载平衡测试
在实现Nginx配置之后,咱们启动Nginx。linux输出/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
,如果曾经启动能够应用/usr/local/nginx/sbin/nginx -s reload
命令进行热加载配置文件,Windows间接点击Nginx目录下的nginx.exe
或者 cmd
运行start nginx
进行启动,如果启动了仍旧能够应用nginx -s reload
进行热加载。
Nginx启动实现之后,咱们顺次启动刚刚下载的springboot和复制更改端口的我的项目,输出:java -jar springboot-jsp-thymeleaf.jar
启动。
都启动胜利之后,咱们在浏览器输出服务的ip即可进行拜访。
示例图:
注:这里我应用的是windows零碎做测试,理论linux也是一样的。
而后咱们进行操作,并查看控制台日志!
从上述示例图中咱们进行4次界面刷新申请,最终平均分配到两个服务中去了,从上述的测试后果中咱们实现了负载平衡。
这里我在说一下应用Nginx的注意事项,在进行学习和测试的时候,应用nginx默认的端口实现负载平衡个别没有什么问题,然而当咱们在我的项目中应用的时候,特地有登录界面的并且端口不是80的时候,会呈现登录的界面无奈跳转,进行调试的话会呈现 net::ERR_NAME_NOT_RESOLVED这样的谬误,呈现这个起因的是因为nginx默认的端口是80,那么默认跳转的也是这个,所以呈现这种状况的时候,须要在location 下增加proxy_set_header Host $host:port 这个配置,port 和listen 的端口保持一致就能够了。