本文起源: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 的端口保持一致就能够了。